问题的由来:在学习C语言预处理命令时看到这样一段(https://www.cnblogs.com/clover-toeic/p/3851102.html)
#define SQUARE(x) ((x)*(x))
int Square(int x){
return (x * x); //未考虑溢出保护
}
int main(void){
int i = 1;
while(i <= 5)
printf("i = %d, Square = %d\n", i, Square(i++));
int j = 1;
while(j <= 5)
printf("j = %d, SQUARE = %d\n", j, SQUARE(j++));
return 0;
}
执行结果为
i = 2, Square = 1
i = 3, Square = 4
i = 4, Square = 9
i = 5, Square = 16
i = 6, Square = 25
j = 3, SQUARE = 1
j = 5, SQUARE = 9
j = 7, SQUARE = 25
不太搞得懂这里printf的执行顺序。
这是我所查到的解释
printf()函数的参数,在printf()函数读取时是从左往右读取的,然后将读取到的参数放到栈里面去,最后读取到的就放在栈顶,处理参数的时候是从栈顶开始的,所以是从右边开始处理的.
所以printf的执行顺序是从 从右到左进行运算
但是在不同编译器又会采用不同的理解方式,对上面这个例子,我的理解是这样的,假如这段代码是以右结合的方式执行的,那么先执行的就是Square(i++),在执行i++时,i还是等于1,但是在执行完Square(i++)后,i就已经被赋值为2,于是输出为2,1。
但是!
当我在自己的VS2019中尝试时,结果又不一样了
int main() {
int i = 3;
printf("%d,%d,%d\n", i++,++i,i);
printf("i is %d\n", i);
}
从右结合的角度理解,执行结果应该是4,4,3,也有人的执行结果是这个。
但是我的执行结果:
很懵逼。跟查到的结果很不一样。
(i++是输出i的值,执行完语句后再赋值,++i是直接赋值)。
这跟我查到的很多解析都不一样。