请看以下两个函数:
例一:
Void main(int argc, char* argv[])
{
int i=1;
int j;
j= (i++)+(++i);
printf("j =%d!/n",j);
}
例二:
Void main(int argc, char* argv[])
{
int i=1;
i= (i++)+(++i);
printf("i =%d!/n",i);
}
按照程序表面看,打印的结果结果应该是一样的,都应该是4。
可实际上,例一中 打印的结果为 j=4;例二种 打印的结果为i=5;
起初百思不得其解,赋值语句的左边对于结果应该是没有影响的,它的值都应该等于右边等式得出的结论。
而右边的等式中
n 前一个括号中为 i++,i初值为1 ,则括号内值为1,i变为2
n 后面一个括号中++i,由于i已经变为2 ,因此此时得到的i应该为3 ,即括号内值为3
n 因此,等式右边为1+3=4
因此,两个函数得到的结果都应该为4。
后来,采用了VC++的反汇编方法,看关键步骤地汇编代码,终于知道了原因的所在:在编译的时候,整个运算采用的是自右向左的方式,而且,对于i++,他是在整个等式结束后才会作处理。
因此,以上函数的实际处理为:
n 先作右边括号中的 ++i:初值i= 1,自加,得i=2;
n 作前一个括号中为 i++,i值由上一步得到为2,则括号内值为2,
n 将 2 + 2相加得到的值赋给右边的参数
n 最后,对等式中的i自加
因此,以上两个函数得到完全不同的结果。
为了论证这个结论,改变一下函数,得到函数例三
例三:
Void main(int argc, char* argv[])
{
int i=1;
int j;
j= (i)+(++i);
printf("j =%d!/n",j);
}
例三中与例一不同的是,将(i++),变为(i),最后得到的j也是4;
由此证明:
1. (i++)的处理,并不是在这个运算之后自加,而确实是在整个语句执行好之后自加。
2. 编译的时候确实是自右向左编译的,否则,这个等式得到的结果为3。