gpt4 book ai didi

c - (x++, y) + (y++, x) 是未定义的还是未指定的,如果未指定,它可以计算什么?

转载 作者:太空宇宙 更新时间:2023-11-04 00:15:28 25 4
gpt4 key购买 nike

comma sequence operator介绍一个sequence point在一个表达式中。我想知道这是否意味着下面的程序避免了未定义的行为。

int x, y;

int main()
{
return (x++, y) + (y++, x);
}

如果它确实避免了未定义的行为,它仍然可以是未指定的,即返回几个可能值之一。我认为在 C99 中,它只能计算 1,但实际上,各种版本的 GCC 将此程序编译成返回 2 的可执行文件。 Clang 生成一个返回 1 的可执行文件,显然符合我的直觉。

最后,这是在 C11 中发生的变化吗?

最佳答案

取表达式:

(x++, y) + (y++, x)

从左到右计算:

x++  // yield 0, schedule increment of x
, // sequence point: x definitely incremented now
y // yield 0
y++ // yield 0, schedule increment of y
// explode because you just read from y and wrote to y
// with no intervening sequence point

标准中没有任何内容禁止这样做,所以整个事情都有未定义的行为。

对比这个伪代码:

f() { return x++, y; }
g() { return y++, x; }
f() + g()

根据 C99 (5.1.2.3/2),对 fg 的调用本身算作副作用,并且函数调用运算符在之前包含一个序列点它进入一个函数。这意味着函数执行不能交错。

在“并行评估事物”模型下:

f()  // arbitrarily start with f: sequence point; enter f
g() // at the same time, start calling g: sequence point

由于 f 的执行本身算作副作用,因此 g() 中的序列点暂停执行,直到 f 返回。因此,没有未定义的行为。

关于c - (x++, y) + (y++, x) 是未定义的还是未指定的,如果未指定,它可以计算什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13935904/

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