自增/自减学习

在这里学习了C中的自增和自减,但是后面学习了前缀和后缀及其混合之后,发现使用不同的编译器,其中的规则是不一样的,而且平时我们书写程序的时候也不会写这样复杂的代码,例如i+++i+++i++等,这样一方面在可读性方面很差,另一方面就是在移植性方面,不同的编译器就会出现不同的结果,所以这样写是不理想的。

#include <stdio.h>

/**
 * 自增/自减运算的应用
 * @brief main
 * @return
 */
int main(void)
{
    int a = 5,b,c,i = 10;//变量定义及初始化

    //将a赋值给b,然后自增1
    b = a++; //b = 5,a = 6
    //b先自增1,然后赋值给c
    c = ++b; //b = 6,c = 6

    printf("a = %d,b = %d,c = %d\n",a,b,c);  //a=6,b=6,c=6

    /**
     * C函数参数的入栈顺序是从右向左的
     * 主要是为了支持参数可变长度
     * 则下面的输出为12,11,10
     */
    printf("i,i++,i++ = %d,%d,%d\n",i,i++,i++); /**输出i,i++,i++**/

    printf("%d\n",++i); //i自增1,然后输出i 13 i=13
    printf("%d\n",--i); //i自减1,然后输出i 12 i=12
    printf("%d\n",i++); //先输出i,然后i自增1 12 i=13
    printf("%d\n",i--); //先输出i,然后i自减1 13 i=12
    printf("%d\n",-i++); //i先取负,然后输出i,最后i自增1 -12 i=13
    printf("%d\n",-i--); //i先取负,然后输出i,最后i自减1 -13 i=12

    /**
     * 有关于自增/自减问题的总结
     */
    /*************************************/
    /*  1:表达式中,一般情况下,是从左向右   */
    /*     函数参数中,运算方向是从右向左    */
    /************************************/

    /*************************************/
    /*  2:后缀,先取值,再自增             */
    /************************************/
    //例子
    int m = 5,n;
    n = m+++m+++m++;  //相当于a=(m++) + (m++) + (m++);
    //但由于是后缀,则先取值运算之后,在进行自增
    //所以 n = m + m + m; m++; m++; m++;
    //所以最后结果 n=15,m=8
    printf("n = %d,m = %d",n,m);

    /*************************************/
    /*     3:前缀,前两个自增后取值         */
    /*     后面的每个自增后都取值           */
    /************************************/
    //例子
    int p,j=5;
    p = ++j + (++j) + (++j);
    //则根据规则,前两个自增之后再取值
    //则变化之后 j=7 p = 7 + 7 + (++j);
    //两个之后的所有前缀每一个都先自增接着取值
    //则 j = 8, p = 7 + 7 +8;
    // p = 22, j = 8
    printf("p = %d,j = %d",p,j);

    /*************************************/
    /*  4:前缀,后缀混合情况               */
    /************************************/
    //学到这里我发现这个编译器不同,最后的结果也是不一样的,所以感觉很没有意义

    return 0;
}

posted @ 2015-04-01 23:17  陈洪波  阅读(116)  评论(0编辑  收藏  举报