以下代码的目的是什么?
C:\Users\myuser\AppData\Local\Microsoft\Communicator\sip_user@domain\History Spooler
假设f()是一个字符串返回函数,a和b也是字符串,函数的签名是
return cin==(cout<<(f(a)==f(b)?"YES":"NO"));
提前致谢!
答案 0 :(得分:4)
答案是:它取决于你正在编译的C ++标准。它归结为std::basic_ios
<强> C ++ 03 强>
在这里,我们有operator void*() const
,其中:
如果
fail()
返回true
,则返回空指针,否则返回非空指针。该指针可以隐式转换为bool
,并且可以在布尔上下文中使用。
因此,在表达式中:
cin==(cout<<(f(a)==f(b)?"YES":"NO"));
我们会打印&#34; YES&#34;或&#34;否&#34;,流输出的结果仍为cout
(以std::ostream&
的形式)。当我们进行相等性检查时,两个操作数将被隐式转换为void*
,因此表达式会检查两个流是否都失败。这是一种特别晦涩的做法:
cout << (f(a) == f(b) ? "YES" : "NO");
return cin.fail() && cout.fail();
<强> C ++ 11 强>
使用C ++ 11,operator void*() const
被explicit operator bool() const
取代。 explicit
是关键,因为它意味着转换函数只能显式使用(如通过直接转换)或布尔上下文,如:
if (cin) { // calls cin.operator bool()
}
Equality不是布尔上下文,所以在表达式
中cin == cout
不会调用转换函数。由于operator==
(或std::basic_ios
或std::istream
)上没有定义std::ostream
,因此表达式根本无法编译。