gpt4 book ai didi

c++ - 为什么表达式 a = a + b - ( b = a ) 在 c++ 中给出序列点警告?

转载 作者:IT老高 更新时间:2023-10-28 21:51:47 27 4
gpt4 key购买 nike

以下是测试代码:

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,最后应该从 a + b 中减去 (b = a) 的结果。我看不到任何 sequence-point rule在这里被侵犯了。

最佳答案

表达式被求值和完成它的副作用是有区别的。

b = a 赋值表达式将在减法之前计算,因为括号的优先级更高。它将提供 a 的值作为评估的结果。然而,将该值写入 b 可能要到下一个序列点才能完成,在这种情况下,下一个序列点是完整表达式的结尾。因此,整个表达式的最终结果是未定义的,因为减法可能会在赋值之前或之后取 b 的值。

关于c++ - 为什么表达式 a = a + b - ( b = a ) 在 c++ 中给出序列点警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13317684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com