以下是测试代码:
int main()
{
int a = 3;
int b = 4;
a = a + b - (b = a);
cout << "a :" << a << " " << "b :" << b << "\n";
return 0;
}
编译它会给出以下警告:
> $ g++ -Wall -o test test.cpp test.cpp: In function ‘int main()’:
> test.cpp:11:21: warning: operation on ‘b’ may be undefined
> [-Wsequence-point]
为什么操作可以是未定义的?
根据我的理解,首先(b = a)
应该评估子表达式,因为()的优先级更高,因此设置b = a。然后,由于 '+' 和 '-' 具有相同的优先级,表达式将被左关联评估。因此,a + b
接下来应该评估,最后(b = a)
应该从 中减去的结果a + b
。我看不到这里违反了任何序列点规则。