为了账号安全,请及时绑定邮箱和手机立即绑定

有大佬遇到过这个问题吗: C语言运算符优先级问题

有大佬遇到过这个问题吗: C语言运算符优先级问题

慕容森 2019-08-14 20:17:22
大佬,求助..碰到个C语言优先级问题题目:请问X的值是多少?#includeintmain(){intx=6;x+=x-=x*x;printf("%d\n",x);}答案是"-60",请问为什么是-60?不是+=比-=优先级高吗?
查看完整描述

2 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

在C里,这是一个未定义行为。
x+=x-=x*x;
^^
12
1处对x值的读取与2处对x值的写入无关,而两者之间没有序列点(sequencepoint)分隔。因而这是一个未定义行为。
在C++里,直到C++17明确了赋值与语句之间各个操作数之间的求值顺序。在此之前,这也是一个未定义行为。
=====================
未定义行为,什么都可能发生
=====================
+=与-=是同优先级的,右结合,因而i+=j-=k*l;相当于i+=(j-=(k*l))。
=====================
在C++里,自C++17开始,(复合)赋值运算符的右操作数先于(sequencebefore)左操作数。(C++已经不用序列点的概念了)所以,x+=x-=x*x的计算顺序为:1先计算:x-=x*x1.1-计算x*x(结果36)1.2-计算2处的x(结果6)1.3-计算x-=x*x(结果-30),并赋值(此后x==-30)2计算1处的x(结果-30)(x值已经修改)3计算x+=x-=x*x(结果-60),并赋值(此后x==-60)
=======================
在C中,与C++17之前,1.3处的赋值与2中的x的值的读取顺序是不确定的。
                            
查看完整回答
反对 回复 2019-08-14
?
大话西游666

TA贡献1817条经验 获得超14个赞

和优先级无关,就是简单的从右往左执行,拆分一下:
x-=x*x得到-30
x+=x得到-60
最后声明,常规业务代码不要这么写
                            
查看完整回答
反对 回复 2019-08-14
  • 2 回答
  • 0 关注
  • 326 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信