【发布时间】:2011-07-10 00:48:44
【问题描述】:
我不确定这是否是 gcc 错误,所以我会问:
unsigned int n = 0;
std::cout << n++ << n << ++n;
gcc 给出了极其奇怪的结果: AFAICT不可能的“122”。因为
operator<<(operator<<(operator<<(std::cout, n++), n), ++n)
并且因为在评估参数之前和之后都有一个序列点,所以 n 在两个序列点之间永远不会被修改两次(甚至被访问)——所以它不应该是未定义的行为,只是未指定的评估顺序。
所以 AFAICT 的有效结果是: 111 012 002 101
没有别的
【问题讨论】:
-
不是编译器错误;与您的预期相反,这是 C++ 中未定义的行为。
-
@ephemient: 未指定,不是吗?
-
@Oli:ephemient 是正确的,它是未定义的行为。 1.9p15(在我的回答中引用)
标签: c++ gcc compiler-construction operator-precedence