c语言第三步有错误,c语言一道题

C语言中,a=b=c,a=b==c,a==(b=c),a==(b==c)有什么区别

main(){inta=1,b=2,c=3;printf("%d,%d,%d,%d

",a=b=c,a=b==c,a==(b=c),a==(b==c));}...

百度知道:

首先谢谢楼主,这个问题真好!我刚才的回答错了,现在删了重答,不过执行的结果还是3,1,0,0 这个我实际操作过了。首先=和==的意思楼上各位已经说的很清楚了,一个是赋值,一个是判断,==的优先级高于=,==两边的值若相等,则判断为真,整个表达式的值为1,否则为0。这是前提,下面来看这个问题。刚才我的错误在误以为printf函数是自左向右执行,就像我们的书写习惯一样,不过实际不是。由于printf执行参数输出时是压栈操作(为了支持不定个数的参数的输出,故从后向前执行),所以会先对最后一个进行操作,也就是从右向左输出(脸红,老师貌似也讲过,不过。。。悔不该当初啊)。所以整个printf执行步骤如下:第一步是最后一个a==(b==c),b是2,c是3,明显不等,所以b==c的值是0,然后a是1,和0又不等,所以整个式子值为0;第二步为倒数第二个,a==(b=c),先将c赋给b,此时b和c都为3,再判断a与b是否相等,a为1,不等,整个式子为0;第三步:a=b==c,经过上一步,此时b和c都为3,所以判断b==c为真,值为1,然后将1赋给a,输出a,就是1;第四步:a=b=c,自右向左,先将c值赋给b,再将b值赋给a,输出a,即为3,结果3,1,0,0。这个题目告诉我们上课一定要认真听讲(再次脸红)。累死我了。

这是错误的,但也八九不离十了。

这是群友发出的问题,首先我也以为是3 1 0 0

首先在程序run time,调用printf函数时,会从右到左把参数压栈,这个只要学过一些汇编就了解了。

所以是a==(b==c)首先执行,这个和答案。

但是最后的3,3,0,0是因为函数还没有完全执行完,在现场恢复前,才会将a输出,而最后的a=b=c最终赋值a=3,然后在输出a=b=c,a=b==c(输出的是a的值)

因此是3 3 0 0

8569362f44c73944eea843911bb57fa6.png

这是群友的图

9076cddaf27cd2c2bead5080fd418f44.png

9ecb4895142f1395320aebb0a2b0a1ad.png

这就是  罠わな,注意了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值