“cout
最近引发了一个令人费解的面试问题辩论:以下的正确输出是什么
int a = 0; cout << a++ << a;
一些候选人自信地选择了“01”,而另一些候选人则认为该行为未定义——这个答案最初让一些人感到惊讶。
问题的关键在于评估语句的顺序和副作用。为了理解这一点,让我们将其扩展为等效的函数调用:
std::operator<<(std::operator<<(std::cout, a++), a);
C 保证前面评估的副作用将在序列点执行。然而,参数求值之间没有顺序点,导致参数求值的顺序不确定——a 可以在 a 之前求值,反之亦然。
求值顺序的这种模糊性导致语句的行为未定义。然而,在 a 和 a 的情况下,前者的结果用作后者的参数,使输出取决于评估的顺序。
C 17 更新:清晰度歧义
在 C 17 中,规则已经演变。引入了有关移位运算符的特定声明,规定左侧操作数的求值和副作用必须发生在右侧操作数的求值和副作用之前。
In a shift operator expression E1<<E2 and E1>>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2.
根据此要求,表达式“a 这种语义上的细化确保了表达式求值的清晰度和一致性涉及移位运算符,与惯用的 C 实践保持一致。
以上是'cout”的输出是什么的详细内容。更多信息请关注PHP中文网其他相关文章!