什么时候在 c 中计算表达式中括号内的赋值运算符?

Adi*_*tya 2 c operator-precedence parentheses undefined-behavior assignment-operator

所以我在 quora 文章中遇到了这段代码来交换两个数字。

a = a + b - (b = a);
Run Code Online (Sandbox Code Playgroud)

我试过了,效果很好。但是既然b = a是在括号中,不应该首先为 b 值分配 a 的值吗?整个事情应该成为a + a - a 一个保留其价值的东西?

我试过a = b + (b = a);了a = 5 b = 10,最后我得到了一个 = 10。看到这里我猜它被评估为a = a + a

为什么会出现这种异常?

Sha*_*our 5

这是未定义的行为,因为6.5.2来自 C99 draft standardwhich的部分指出:

在前一个和下一个序列点之间,一个对象的存储值最多应通过表达式的评估修改一次。 72) 此外,前一个值应只读以确定要存储的值

在这种情况下,我们正在修改b并使用它的值来确定 的结果a,标准给出了以下示例为未定义:

i = ++i + 1;
a[i++] = i;
Run Code Online (Sandbox Code Playgroud)

至少在启动警告时gcc会警告出现问题,使用-W -Wall我收到以下警告:

warning: operation on ‘b’ may be undefined [-Wsequence-point]
Run Code Online (Sandbox Code Playgroud)

  • <soapbox> SO 用户不是外行。标准/语言定义文档是来源,并且*仔细* 编写得尽可能清晰和明确。解释*应该*包括引用标准,这样解释就不会成为误解的根源。没有什么比误导或误解的解释更无用的了,除非它是断章取义的。</肥皂盒> (3认同)