printf的执行顺序&++i与i++的区别

    科技2022-09-01  108

    问题的由来:在学习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是直接赋值)。 这跟我查到的很多解析都不一样。

    Processed: 0.013, SQL: 9