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
andE1>>E2
, every value computation and side-effect ofE1
is sequenced before every value computation and side effect ofE2
.
这意味着它需要代码生成结果b,其输出01.
有关详细信息,请参见P0145R3 Refining Expression Evaluation Order for Idiomatic C++.