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

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.


以上是是(a=0,a)+(a=1,a)inta的未定义行为吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>