大佬,求助..碰到个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;^^121处对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的值的读取顺序是不确定的。
添加回答
举报
0/150
提交
取消