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

最近在一次采访中有一个以下客观类型的问题.

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

回答:

一个. 10
湾01
C.未定义的行为

我回答了选择b,即输出为“01”.

但令我惊讶的是,一位采访者告诉我,正确的答案是选项c:undefined.

现在,我确实知道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执行.函数参数评估之间没有序列点,这意味着可以在参数std :: operator<<之前评估参数a(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 ;?的正确答案是什么? - 代码日志