【发布时间】:2017-11-13 12:20:35
【问题描述】:
如果我这样写:
i = i++, i, i++;
这是 C 语言中的未定义行为。
但是,如果我这样写:
return i++, i, i++; // Is it UB?
这是未定义的行为吗?
示例:
#include <stdio.h>
int f(int i)
{
return i++, i, i++; // Is it UB?
}
int main() {
int i = 1;
i = i++, i, i++;
i = f(i);
printf("%d\n",i);
return 0;
}
【问题讨论】:
-
@StoryTeller -
=比,绑定得更紧密,所以我相信这相当于(i = i++), i, i++;。 -
@OliverCharlesworth - 是的,退货声明让我失望了。这是一条红鲱鱼
-
@OliverCharlesworth - Unwind 的回答比 C11 大 3 岁。鉴于上述措辞,UB现在如何?左侧没有
i的修改。没有 to 序列。i++的值计算是在赋值之前完成的,反正按照 n1570。那么还有什么未定义的呢? -
@StoryTeller C11 没有改变这一点,它仍然是 UB。然而,我相信 C++11 确实改变了规则。
-
@Lundin - 是的,你一直说它是 UB。但是考虑到措辞,我想了解为什么它是 UB,即使一切看起来都已签出。
标签: c language-lawyer undefined-behavior c11