最近遇到一个问题,按照网上说的,按照printf()参数从右往左运算,但是编译器显示的结果总是不正确,就小研究了一下,发现还有其他的顺序在里面。
如果第一个参数和第二个参数的结果不是同一个对象,确实是从右往左计算的,例子如下:
例1:
#include <stdio.h>
int main(){
int a = 5, b = 2;
printf("%d,%d",b=a+1,a=a+1);
return 0;
}
运算结果:
运算结果是:7,6,先算右边,再算左边。
但是如果遇到i++,i,++i同时作为printf参数时,还有其他规则。接下来请看。
例2:
#include <stdio.h>
int main(){
int i = 2;
printf("%d,%d,%d,%d\n",i++,++i,i,i++);
return 0;
}
如果按照从右往左的规则计算,
从右往左运算:
i++得到2(i=2,后加1在整条语句执行完才进行,这里先记下)
i还是2 (i=2,原因见上一行)
++i得到3(i=3,先加1,后使用)
i++得到3(i=3,后加1在整条语句执行完才进行,这里先记下)
按道理输出结果为:3,3,2,2
但是结果截图如下:
所以,光是从右往左计算并不完全正确,到底是什么原因呢,经过试验。终于得出以下结论:
在大原则(
从右往左
)不变的情况下,然后先算所有的i++,所有i++算完了,再算++i,最后计算i。
上面例2:计算过程为,先计算最右边的i++(第四个参数),i=2;
再计算左边的i++(第一个参数),i=4;
接着计算++i(第二个参数),i=5;
最后是i(第三个参数),i=5
所以最终答案是:4 5 5 2
注:vs2005,devc++,linux三种编译运算结果均为4 5 5 2