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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值