C语言运算符优先级问题

大佬,求助..碰到个C语言优先级问题
题目:请问X的值是多少?

#include <stdio.h>
int main()
{   
    int x=6;
    x+=x-=x*x;
    printf("%d\n", x);
}

答案是 "-60" ,请问为什么是-60?不是+=比-=优先级高吗?

阅读 2.1k
2 个回答

在 C 里,这是一个未定义行为。

    x+=x-=x*x;
    ^  ^
    1  2

1 处对 x 值的读取与 2 处对 x 值的写入无关,而两者之间没有序列点(sequence point)分隔。因而这是一个未定义行为。

在 C++ 里,直到 C++17 明确了赋值与语句之间各个操作数之间的求值顺序。在此之前,这也是一个未定义行为。

=====================

未定义行为,什么都可能发生

=====================

+=-= 是同优先级的,右结合,因而i+=j-=k*l; 相当于 i+=(j-=(k*l))

=====================

在 C++ 里,自 C++17 开始,(复合)赋值运算符的右操作数先于(sequence before)左操作数。(C++ 已经不用序列点的概念了)
所以,x+=x-=x*x 的计算顺序为:
1 先计算: x-=x*x
1.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 的值的读取顺序是不确定的。

和优先级无关,就是简单的从右往左执行,拆分一下:

  1. x -= x * x 得到 -30
  2. x += x 得到 -60

最后声明,常规业务代码不要这么写

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题