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?
...全文
138 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
纠结于优先级我觉得毫无疑义,不要写连自己都预测不了结果的代码

33,321

社区成员

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

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