a=b==c

qq799942785 2016-06-04 11:45:46
int a=1,b=2,c=3;
printf("%d %d %d %d",a=b=c,a=b==c,a==(b=c),a==(b==c));

我的思路是第一个%d为3
第二个%d因为a=3,b=3,c=3,所以 b==c 为 1,所以输出为1
第三个%d为0
第四个%d为1
但是计算机给的结果是 3 3 0 0,不知道a=b==c为什么是3?
...全文
113 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq799942785 2016-06-05
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
a=b==c 这个表达式的值是 a的值 ,a=b=c a的值为3 于是 这里因为UB的关系,得到一个相当奇妙的结果
为什么说a=b==c是a的值?不好意思,我今天才看C语言, 我理解是==优先级更高,然后再将ture赋值给a。。
lm_whales 2016-06-05
  • 打赏
  • 举报
回复
a=b==c 这个表达式的值是 a的值 ,a=b=c a的值为3 于是 这里因为UB的关系,得到一个相当奇妙的结果
lm_whales 2016-06-05
  • 打赏
  • 举报
回复
bug吧 不过这本来就没定义
lm_whales 2016-06-05
  • 打赏
  • 举报
回复
对于C,C++ 赋值表达式,和其他语言有所不同 C++求表达式的值,才是表达式的主要作用(虽然很多时候,我们并不需要这个表达式的值) 一切因为求表达式的值,受到影响产生的后果,都属于副作用(虽然这个才是我们所要的) 包括 a=b 这个表达式求值后 ,a的值变成b的值,都属于副作用 这个表达式单独出现, 它的值是 a =b 产生副作用后a的值,这时也就是用来给a赋值的b的值 这时比较正常的情况 如果不是单独出现的独立表达式, 一旦程序中,有未定义行为,这个表达式的值,就不一定是 b了,而是跟具体实现有关了., 但他一定是a的值,而且一定是副作用的结果, 只是他什么情况的 a的值,因为未定义,不得而知,由具体实现决定。 很多其他语言中,赋值号连接的表达式,往往只是赋值语句,一个表达式中只会出现一次赋值号。 如pascal 中 a:=b;是个语句。a的值变成b的值,是这个语句的作用(功能),没有副作用哦 C,C++ 赋值语句,只是所有表达式语句中的一种,和其他表达式语句,没有多少区别。
lm_whales 2016-06-05
  • 打赏
  • 举报
回复
这里主要是有个未定义行为 a=b=c a=b==c 这两个表达式中 对a 的副作用有两次 在同一个表达式 printf("%d %d %d %d",a=b=c,a=b==c,a==(b=c),a==(b==c)) 中 两个子表达式中出现了两次 对 a 的副作用 这个是未定义的 a的值,采用哪一个表达式副作用的影响,属于未定义的行为,a的值在这个表达式求值过程的任意时刻,可以采用任何结果 只有。表达式结束,a 的值才会有个确定的结果, 由于这里没有规定计算顺序,a 的值最后结果也是不确定的 而对 表达式 a=b=c 和 a=b==c 求值的结果都是 a 的最后计算出来的值 编译器,可以采用分别计算的结果,也可以采用 其中任何一个结果 因为这里面没有规定求值顺序,所以任何结果都是合理的 注意,函数调用也是一个表达式 函数参数的计算顺序,是未定义的 而其中多次副作用,修改一个对象,结果也是未定义的
小灸舞 2016-06-05
  • 打赏
  • 举报
回复
我用VS跑出来是3 3 1 0
要知道为什么会是这样建议查看汇编(其实研究这种也没多大的意思,不同的编译器结果不同,未定义行为!!)
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!)
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
paschen 2016-06-05
  • 打赏
  • 举报
回复
引用 3 楼 qq799942785 的回复:
[quote=引用 2 楼 lm_whales 的回复:] a=b==c 这个表达式的值是 a的值 ,a=b=c a的值为3 于是 这里因为UB的关系,得到一个相当奇妙的结果
为什么说a=b==c是a的值?不好意思,我今天才看C语言, 我理解是==优先级更高,然后再将ture赋值给a。。[/quote] 是的
月凉西厢 2016-06-05
  • 打赏
  • 举报
回复
纠结于优先级我觉得毫无疑义,不要写连自己都预测不了结果的代码
Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧