gpt4 book ai didi

c++ - cout << a++ << a;的正确答案是什么?

转载 作者:行者123 更新时间:2023-12-01 14:58:11 25 4
gpt4 key购买 nike

最近在一次采访中,出现了以下客观类型问题。

int a = 0;
cout << a++ << a;

答案:

一种。 10
b。 01
C。未定义的行为

我回答了选项b,即输出为“01”。

但是令我惊讶的是,一位面试官告诉我,正确的答案是选项c:未定义。

现在,我知道C++中序列点的概念。对于以下语句,该行为是未定义的:
int i = 0;
i += i++ + i++;

但是据我对 cout << a++ << a语句的理解, ostream.operator<<()将被调用两次,首先是 ostream.operator<<(a++),然后是 ostream.operator<<(a)

我还在VS2010编译器上检查了结果,其输出也为'01'。

最佳答案

您可以想到:

cout << a++ << a;

如:
std::operator<<(std::operator<<(std::cout, a++), a);

C++保证先前评估的所有副作用都将在 sequence points上执行。函数参数评估之间没有顺序点,这意味着可以在参数 a之前或之后评估参数 std::operator<<(std::cout, 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.



这意味着它需要代码来生成结果 b,并输出 01

有关更多详细信息,请参见 P0145R3 Refining Expression Evaluation Order for Idiomatic C++

关于c++ - cout << a++ << a;的正确答案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59854685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com