以一个例题引入
#include <stdio.h>
void main()
{
int i = 5, j = 5;
printf("%d,%d,%d\n", ++i, j--, --j);
}
首先,应该说明的是在不同的编译环境中结果是不一样的。
关于本段代码在VC++6.0中的规则如下:
1、printf函数的执行顺序是由右到左的
2、前自增运算符(++i)先加1,再使用i,此时i已经加了1;
3、后自增运算符(j–)先使用j,再减1,注意这里是关键所在,VC++6.0后自增运算是要在整条语句结束以后才自减1!
而在VS环境,gcc环境中,再从左到右输出的过程中就会完成后自增/自减运算,所得的结果为6,4,3。
VC++6.0的结果为6,4,4。因为VC++6.0没有在printf语句结束前完成后自增/自减运算。
printf内部运算分析



典例2
#include <stdio.h>
void main()
{
int a=5,b=0;
printf("%d,%d\n",b=a+1,a=a+1);
}
输出结果为:7,6,而不是6,7。
其余分析
int i=7; printf("%d\n", i++ * i++);
输出结果是:49而不是56
int i=7;printf("%d %d\n",++i,i++);
输出结果是:8 7而不是9 7 这并不违背上面关于printf函数从右向左计算。
从右到左,i++不自增,而是先传参到第二个%d,++i自增,暂时不传参;从左到右输出,++i传参到第一个%d,i++不传参(从右到左时已经传参),进行自增,最终的i=9;
第一个%d接收到的是8,第二个%d接收到的是7(从右到左的第一步就是将i传入printf第二个%d)。
故答案为:8 7。
总结:到这里,要掌握的是两点,
- printf函数中的计算是从右向左进行的,而输出是从左到右进行。
- 我们在写代码时,应该尽量避免类似下面的无确定意义的表达式出现,因为很有可能不同的编译器,会采用不同的理解方式。比如我们今天的引例,在VC++6.0的输出结果就与VS2010,gcc不同。
例如:
a+=a++;
a[i]=i++;
printf("%d %d\n",++i,i++);