求值语句cin==(表达式)

evaluating statement cin==(expression)

本文关键字:表达式 cin 语句      更新时间:2023-10-16

下面的代码打算做什么?

return cin==(cout<<(f(a)==f(b)?"YES":"NO")); 

假设f()是一个字符串返回函数,a和b也是字符串,函数的签名是

string f(string a)

提前感谢!

答案是:这取决于您正在编译的c++标准。它可以归结为std::basic_ios

中的转换函数c++ 03

这里,我们有operator void*() const,它:

如果fail()返回true,则返回空指针,否则返回非空指针。该指针可隐式转换为bool,并可在布尔上下文中使用。

因此,在表达式中:
cin==(cout<<(f(a)==f(b)?"YES":"NO")); 

我们将输出"YES"或"NO",流输出的结果仍然是cout(以std::ostream&的形式)。当我们进行相等性检查时,两个操作数将隐式转换为void*,因此表达式将检查两个流是否失败。这是一种特别复杂的操作方式:

cout << (f(a) == f(b) ? "YES" : "NO");
return cin.fail() && cout.fail();
c++ 11

在c++ 11中,operator void*() constexplicit operator bool() const取代。explicit是关键,因为它意味着转换函数只能显式使用(如通过直接强制转换)或在布尔上下文中使用,如:

if (cin) { // calls cin.operator bool()
}

相等不是布尔上下文,所以在表达式

cin == cout

转换函数将不会被调用。由于没有在std::basic_ios(或std::istreamstd::ostream)上定义operator==,因此表达式将无法编译。