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

Is (a = 0, a) + (a =1, a) undefined behaviour for int a?

int main()
{
    int a;
    int b = (a = 0, a) + (a = 1, a);
}

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

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

SQ
int b = (a = 0 SQ a) + (a = 1 SQ a) SQ

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

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

(0, a = 0) + (0, a = 1)

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

的side-effects/access之间总是有一个逗号操作符序列点