参数计算难道是按我们的思维从左至右一个一个算吗?
先引一个例子 以下编译结果均为VS编译器运行
int a=2;
printf("%d %d",a+=2,a);
输出的结果是4 4,这好像是我们从左往右算出一个输出一个,貌似没什么问题
printf("%d %d %d",a+=2,a,a+=2);
输出结果是6 6 6,那这不对了啊,按刚才的思路不应该是4 4 6,那根据这个结果,是不是从左往右先把a通过表达式改变后的值算出来,然后再依次输出。不是算一个输一个,而是全部算完,再输出。
printf("%d %d %d",a=1,a=2,a=3);
输出的结果是1 1 1,不应该是3 3 3?那我们再根据这个结果提出假设:从右往左先把a通过表达式改变后的值算出来,然后再依次输出
我们再举更多的例子来验证我们的假设
int i=1;
printf("%d %d",++i,i); 输出结果是2 2,与我们的假设一致
int b=3,a=5;
printf("%d %d",a+b,++b);输出结果是9 4,与我们的假设一致
这两例里面都有前置自增运算符,那后置自增运算符呢?我们知道前置自增与后置自增的不同在于:前置自增++i表达式的值是i自增后的值;后置自增i++表达式的值是i自增前的值。
把这两例里面的前置自增换成后置自增有何不同
printf("%d %d",i++,i);输出结果是1 2
printf("%d %d",a+b,b++);输出结果是9 3
关键就是i++先用i的值,我们如果还是向假设提到的那样把i通过表达式改变后的值算出来,然后输出,那就不符合后置自增的规则。所以printf函数遇到后置自增是怎么处理呢?
我们举一个更加直观的例子
printf("%d %d %d %d %d %d",i++,i,i++,i,i++,i);输出结果是3 4 2 4 1 4
所以,是不是遇到i++就先把它的值输出,也就是此时i的值。其余部分还是之前的规律。
也就是说我们要把i++当成特例,特殊处理。
归结一下我们得出的规律就是:先对参数从左往右把各个可以改变变量的表达式算一下,得出变量改变后的值,然后再依次输出,当然表达式不包括i++这种后置自增的,遇到后置自增我们就直接把此时变量的值输出就好,后续就不用管它了。
至于为什么要从右至左,涉及到入栈操作了,后续我再出文介绍。
这是上面例子的代码: