是 (a = 0, a) + (a =1, a) int a 的未定义行为吗?

Bat*_*eba 9 c language-lawyer

int main()
{
    int a;
    int b = (a = 0, a) + (a = 1, a);
}
Run Code Online (Sandbox Code Playgroud)

定义?如果没有, a在每一项中,由于多次a未按,顺序写入 ,程序行为显然是未定义的,但是这是否引入了足够的排序点?

Lun*_*din 9

不,它没有明确定义。假设我们用伪代码“SQ”替换您代码中的所有序列点:

SQ
int b = (a = 0 SQ a) + (a = 1 SQ a) SQ
Run Code Online (Sandbox Code Playgroud)

然后我们有SQ a) + (a = 1 SQ两个访问和一个副作用发生a在序列点之间,所以它仍然是未定义的行为。

我们可以像这样编写定义明确(但当然非常糟糕和可疑)的代码:

(0, a = 0) + (0, a = 1)
Run Code Online (Sandbox Code Playgroud)

+ 操作数的计算顺序仍未指定,但编译器必须先计算任一括号,然后再继续下一个。所以在a.