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\n",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

这是群友的图

这就是  罠わな,注意了

最新文章

  1. c语言第2次作业
  2. 快速上手RaphaelJS--Instant RaphaelJS Starter翻译(三)
  3. 利用opencv进行相机标定程序
  4. 视觉中的深度学习方法CVPR 2012 Tutorial Deep Learning Methods for Vision
  5. Invoke-WebRequest Invoke-RestMethod 乱码研究
  6. java web基础1Tomcat服务器基本知识
  7. C#中List的Find方法的使用
  8. Flex学习总结
  9. svn更新
  10. 运行一个Hadoop Job所需要指定的属性
  11. Naive Bayes Theorem and Application - Theorem
  12. 怎么做fastreport使用离线数据源
  13. 微信小程序入门——怎么建多个项目?(导入官方Demo程序进行学习)
  14. 进程管理利器supervisor
  15. Hadoop 2.2.0单节点的伪分布集成环境搭建
  16. android 权限库EasyPermissions
  17. 什么是DAPP
  18. 读《Tooth-Marked Tongue Recgnition Using Multiple Instance Learning and CNN Features》
  19. Android Studio 创建不恰当的虚拟设备导致程序不正常运行
  20. 【NIFI】 Apache NiFI 之 ExecuteScript处理(二)

热门文章

  1. phpstudy2016安装redis扩展
  2. ES6学习笔记第一天
  3. 2013年NOIP普及组复赛题解
  4. Vue 项目构建完成 ----发布项目
  5. Python--day34--socket模块的方法
  6. 2018-2-13-wpf-使用-Dispatcher.Invoke-冻结窗口
  7. P1046 阶乘
  8. H3C VLAN配置示例
  9. vue-learning:15 - js - data
  10. dotnet 数组自动转基类数组提示 Co-variant array conversion 是什么问题