大佬,求助..碰到个C语言优先级问题
题目:请问X的值是多少?
#include <stdio.h>
int main()
{
int x=6;
x+=x-=x*x;
printf("%d\n", x);
}
答案是 "-60" ,请问为什么是-60?不是+=比-=优先级高吗?
大佬,求助..碰到个C语言优先级问题
题目:请问X的值是多少?
#include <stdio.h>
int main()
{
int x=6;
x+=x-=x*x;
printf("%d\n", x);
}
答案是 "-60" ,请问为什么是-60?不是+=比-=优先级高吗?
3 回答868 阅读✓ 已解决
1 回答2.3k 阅读
1 回答836 阅读✓ 已解决
2 回答1.1k 阅读
1 回答1.2k 阅读
1.2k 阅读
1 回答720 阅读
在 C 里,这是一个未定义行为。
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 的值的读取顺序是不确定的。