(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之间总是有一个逗号操作符序列点
是
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
.