以下是测试代码:
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
的结果。我在这里看不到任何sequence-point rule被违反。 最佳答案
被评估的表达式与完成其副作用之间存在差异。
由于括号的优先级较高,因此将在减法之前对b = a
赋值表达式进行求值。它将提供a
的值作为评估结果。但是,该值写入b
的操作可能要等到下一个序列点(在这种情况下是完整表达式的结尾)之后才能完成。因此,整个表达式的最终结果是不确定的,因为减法可以在赋值之前或之后取b
的值。
关于c++ - 为什么在c++中表达式a = a + b-(b = a)给出顺序点警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13317684/