【发布时间】:2012-05-28 10:09:54
【问题描述】:
最近在面试中有一个客观类型的问题。
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'。
【问题讨论】:
-
您要求解释了吗?我经常采访潜在的候选人,并且对接受问题很感兴趣,这表明了兴趣。
-
@jrok 这是未定义的行为。实施所做的任何事情(包括以您的名义向您的老板发送侮辱性电子邮件)都是符合要求的。
-
这个问题急需一个没有提及序列点的 C++11(C++ 的 current 版本)答案。不幸的是,我对 C++11 中序列点的替换了解不够。
-
如果它不是未定义的,它肯定不可能是
10,它可能是01或00。 (c++将始终评估为值c有 before 被递增)。即使它不是未定义的,它仍然会令人非常困惑。 -
你知道,当我看到标题“cout 非常 比 C 差很多。:)