gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:55:54 26 4
gpt4 key购买 nike

最近在面试中有一个客观类型的问题。

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

答案:

一个。 10
湾。 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/10782863/

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