【发布时间】:2012-12-18 15:12:11
【问题描述】:
comma sequence operator 在表达式中引入了sequence point。我想知道这是否意味着下面的程序避免了未定义的行为。
int x, y;
int main()
{
return (x++, y) + (y++, x);
}
如果它确实避免了未定义的行为,它仍然可以是未指定的,即返回几个可能值之一。我认为在 C99 中,它只能计算 1,但实际上,各种版本的 GCC 将此程序编译为返回 2 的可执行文件。 Clang 生成一个返回 1 的可执行文件,显然符合我的直觉。
最后,这在 C11 中是否发生了变化?
【问题讨论】:
-
它仍然是未定义的,因为
+的两个操作数是并行计算的。 -
@melpomene “
+的两个操作数并行求值”的解释如何不适用于f() + g()(共识是它不是未定义的stackoverflow.com/questions/3951017/…)?跨度> -
我不知道如何解释。 “如果尝试修改逗号运算符的结果或在下一个序列点之后访问它,则行为未定义。”
-
@PascalCuoq 一致认为顺序是未指定的,而不是未定义的,因为在每个函数调用之前都有一个序列点,并且函数调用算作副作用,即函数执行不会相互交错。
-
问题是,在
e1 + e2中,e1和e2的评估是未排序的还是未确定排序的?如果未排序,则为未定义的行为,如果未确定排序,则只是未指定。
标签: c c99 language-lawyer c11 unspecified-behavior