gpt4 book ai didi

c - 副作用、序列点和未定义的行为

转载 作者:太空狗 更新时间:2023-10-29 15:32:11 29 4
gpt4 key购买 nike

我在一本书上读到以下说法:

n = ((i++) > (j)?(i++):(j));

书上说假设i>j,n有一个意想不到的值,i增加了两次。
我不明白为什么n在这句话之后有一个期望值。
我读了很多关于未定义行为的例子,所以这是的理论(不是书中的解释,因为没有)并告诉我我是否正确:

first, (i++) > (j) is evaluated, and i may or may not be incremented yet.
Presuming i > n, (i++) should be evaluated. We don't know whether i has been incremented yet or not, so that's why this entire statement is undefined. we're not sure whether i or i+1 will be returned.

现在假设我的理论是正确的 - 为什么我们不知道 我是否已经增加了?如果这行代码要写成 if 语句,我很确定 i 之前必须递增。那么为什么化合物不同呢?

谢谢。

最佳答案

?: 运算符引入了一个序列点,因此这里没有未定义的行为。

(i++) > (j) 被评估并应用i++ 的副作用。如果(i++) > (j)的结果为真,则(i++)再次求值,否则(j)再次求值.

i++ 在增量 之前求值为 i 的值。所以,假设 i > j,然后在评估之后

n = i++ > j ? i++ : j;

以下应该是正确的:

n = i<sub>orig</sub> + 1
i = i<sub>orig</sub> + 2

编辑

Chapter and verse

6.5.15 Conditional operator
...
4 The first operand is evaluated; there is a sequence point between its evaluation and theevaluation of the second or third operand (whichever is evaluated). The second operandis evaluated only if the first compares unequal to 0; the third operand is evaluated only ifthe first compares equal to 0; the result is the value of the second or third operand(whichever is evaluated), converted to the type described below. 110)
110) A conditional expression does not yield an lvalue.

关于c - 副作用、序列点和未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33043556/

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