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
为什么会出现这种异常?
这是未定义的行为,因为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)