gpt4 book ai didi

c - 语句 `int val = (++i >++j) ?++i :++j;` 是否调用未定义的行为?

转载 作者:太空狗 更新时间:2023-10-29 16:24:42 24 4
gpt4 key购买 nike

给定以下程序:

#include <stdio.h>
int main(void)
{
int i = 1, j = 2;
int val = (++i > ++j) ? ++i : ++j;
printf("%d\n", val); // prints 4
return 0;
}

val 的初始化似乎隐藏了一些未定义的行为,但我看不到对象被多次修改或在没有序列点的情况下修改和使用的任何点之间。有人可以纠正或证实我的观点?

最佳答案

此代码的行为定义明确。

条件语句中的第一个表达式保证在第二个表达式或第三个表达式之前求值,并且只有第二个或第三个表达式中的一个会被求值。这在 C standard 的第 6.5.15p4 节中有描述。 :

The first operand is evaluated; there is a sequence point between its evaluation and the evaluation of the second or third operand (whichever is evaluated). The second operand is evaluated only if the first compares unequal to 0; the third operand is evaluated only if the 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.

就你的表达而言:

int val = (++i > ++j) ? ++i : ++j;

++i >++j 首先被评估。 ij 的增量值用于比较,所以它变成了2 > 3。结果为 false,因此 ++j 被求值而 ++i 不被求值。因此,j 的(再次)增量值(即 4)随后被分配给 val

关于c - 语句 `int val = (++i >++j) ?++i :++j;` 是否调用未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55170504/

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