printf函数对参数的计算顺序,光从右往左是错误的,还要考虑前++和后++的问题

  • Post author:
  • Post category:其他


最近遇到一个问题,按照网上说的,按照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



版权声明:本文为qq_40040394原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。