gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:50:16 26 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/30326344/

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