gpt4 book ai didi

c - 未定义的行为似乎与 C 中的运算符优先级规则相矛盾

转载 作者:行者123 更新时间:2023-11-30 19:54:54 26 4
gpt4 key购买 nike

考虑以下代码行。

int i = 2;
i = i++

第二行代码已被识别为未定义。我知道这个问题之前已经被问过好几次了,例如 this

但是我在任何地方都看不到此问题中解决的运算符优先级问题。已经明确提到后缀运算符先于赋值运算符。

i = (i++)

很明显,i++ 将首先被评估,并且 i 的值将再次分配给 i。

这看起来像这种特定的未定义行为与优先规则相矛盾。

类似的代码是:

int i = 2;
i++ * i++;

这里根据运算符优先级,代码可以写为

int i =2;
(i++) * (i++)

现在我们不知道“*”运算符的 LHS 或 RHS 中的 (i++) 是否会首先被求值。但无论哪种方式都会产生相同的结果。那么它是如何未定义的呢?

如果我们写:

int p;
p = f1() + f2()

其中 f1() 和 f2() 是定义的函数,那么显然我们无法决定首先评估 f1() 还是 f2(),因为优先级规则没有指定这一点。但目前的问题中似乎并没有出现这样的困惑。

请解释一下。

我不明白为什么这个问题得到了反对票。我需要明确运算​​符优先级和 UB 之间的关系,并且我没有看到其他问题解决这个问题。

最佳答案

您要查找的内容位于 C standard 的第 6.5 节“表达式”第 3 段中。 :

The grouping of operators and operands is indicated by the syntax. Except as specified later, side effects and value computations of subexpressions are unsequenced.

这意味着通过 ++-- 运算符递增(或递减)的副作用不一定会在遇到运算符时立即发生。唯一的保证是它发生在下一个序列点之前。

i = i++;的情况下,=操作数的求值和后缀++的求值中都没有序列点。因此,实现可以自由地执行将 i 的当前值分配给自身以及以任何顺序递增 i 的副作用。因此,在您的示例中,i 可能是 2 或 3。

这回到第 2 段:

If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.

由于i = i++尝试在没有序列点的情况下多次更新i,因此它会调用未定义的行为。结果可能是 2 或 3,或者可能由于优化而发生其他情况。

不是未定义的原因:

int p;
p = f1() + f2()

是因为一个变量在一个序列点中没有被更新多次。然而,如果 f1f2 都更新相同的全局变量,则它可能是未指定的行为,因为评估顺序未指定。

关于c - 未定义的行为似乎与 C 中的运算符优先级规则相矛盾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50993000/

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