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

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

/ 猿问

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

缥缈止盈 2019-08-24 23:16:49
大佬,求助..碰到个C语言优先级问题题目:请问X的值是多少?
#include
intmain()
{
intx=6;
x+=x-=x*x;
printf("%d\n",x);
}
答案是"-60",请问为什么是-60?不是+=比-=优先级高吗?
                    
查看完整描述

2 回答

?
天涯尽头无女友
在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-24
?
HUWWW
和优先级无关,就是简单的从右往左执行,拆分一下:
x-=x*x得到-30
x+=x得到-60
最后声明,常规业务代码不要这么写
                            
查看完整回答
反对 回复 2019-08-24

添加回答

回复

举报

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