= b) ? ++x: 0; 消息是: EVALUATION_ORDER-6ren">
gpt4 book ai didi

c++ - "x =++x"真的是未定义吗?

转载 作者:IT老高 更新时间:2023-10-28 23:03:23 28 4
gpt4 key购买 nike

我正在使用 Coverity Prevent在一个项目上发现错误。

这个表达式报错(变量名当然改了):

x=
(a>= b) ?
++x: 0;

消息是:

EVALUATION_ORDER defect: In "x=(a>= b) ? ++x: 0;", "x" is written in "x" (the assignment LHS) and written in "(a>= b) ? ++x: 0;" but the order in which the side effects take place is undefined because there is no intervening sequence point. END OF MESSAGE

虽然我可以理解“x = x++”是未定义的,但这对我来说有点难。这是不是误报?

最佳答案

条件运算符 ?: 在条件评估(第一个操作数)和第二个或第三个操作数评估之间有一个序列点,但它在之后没有专用序列点第二个或第三个操作数的评估。这意味着此示例中 x 的两个修改可能会发生冲突(未由序列点分隔)。所以,Coverity Prevent 是对的。

您在这方面的陈述实际上等同于

a >= b ? x = ++x : x = 0;

x =++x 中的问题相同。

现在,您的问题的标题似乎表明您不知道 x =++x 是否未定义。它确实是未定义的。它未定义的原因与 x = x++ 未定义的原因相同。简而言之,如果在一对相邻序列点之间多次修改同一对象,则行为未定义。在这种情况下, x 被赋值和 ++ 修改,并且没有序列点可以将这些修改彼此“隔离”。因此,行为是未定义的。 ++xx++ 在这方面绝对没有区别。

关于c++ - "x =++x"真的是未定义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619323/

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