C++ 求值语句cin==(表达式)
下面的代码打算做什么C++ 求值语句cin==(表达式),c++,return-value,cout,cin,C++,Return Value,Cout,Cin,下面的代码打算做什么 return cin==(cout<<(f(a)==f(b)?"YES":"NO")); 提前谢谢
return cin==(cout<<(f(a)==f(b)?"YES":"NO"));
提前谢谢答案是:这取决于你编译的C++标准是什么。它归结为中的转换函数 C++03 这里,我们有
操作符void*()const
,它:
如果fail()
返回true
,则返回空指针,否则返回非空指针。此指针可隐式转换为bool
,并可在布尔上下文中使用
因此,在表达式中:
cin==(cout<<(f(a)==f(b)?"YES":"NO"));
C++11
在C++11中,操作符void*()const
被显式操作符bool()const
替换。显式
是关键,因为它意味着转换函数只能显式使用(如中,通过直接转换)或在布尔上下文中使用,如:
if (cin) { // calls cin.operator bool()
}
等式不是布尔上下文,因此在表达式中
cin == cout
该转换函数将不会被调用。由于在
std::basic_ios
(或std::istream
或std::ostream
上未定义运算符==
),因此表达式将无法编译答案是:这取决于你编译的C++标准是什么。它归结为中的转换函数
C++03
这里,我们有操作符void*()const
,它:
如果fail()
返回true
,则返回空指针,否则返回非空指针。此指针可隐式转换为bool
,并可在布尔上下文中使用
因此,在表达式中:
cin==(cout<<(f(a)==f(b)?"YES":"NO"));
C++11
在C++11中,操作符void*()const
被显式操作符bool()const
替换。显式
是关键,因为它意味着转换函数只能显式使用(如中,通过直接转换)或在布尔上下文中使用,如:
if (cin) { // calls cin.operator bool()
}
等式不是布尔上下文,因此在表达式中
cin == cout
该转换函数将不会被调用。由于在
std::basic_ios
(或std::istream
或std::ostream
上未定义运算符==
),因此表达式将无法编译 它基本上解析为cin==cout
,即。。。奇怪的除非这是为了检查两条流的状态是好是坏。@Frédéric Hamidi我没有完全理解你的意思。你能多解释一点,或者建议一个有用的参考吗?谢谢好的,操作符,我想标准并没有要求操作符void*()
每次都必须返回相同的非空指针,所以这可能会失败。希望其他人能对此有所了解。看起来像是来自代码混淆比赛之类的。它基本上归结为cin==cout
,这是。。。奇怪的除非这是为了检查两条流的状态是好是坏。@Frédéric Hamidi我没有完全理解你的意思。你能多解释一点,或者建议一个有用的参考吗?谢谢好的,操作符,我想标准并没有要求操作符void*()
每次都必须返回相同的非空指针,所以这可能会失败。希望其他人能对此有所了解。看起来像是来自代码混淆比赛之类的。@lisyarus不,我的意思是&&
。如果两者都没有失败,=
将返回true
,但原始表达式将返回false,因为它们是两个不同的非空指针。但它确实编译并生成所需的结果。我在研究()的解决方案时遇到了它。确切的解决方案是它编译的()@GauravJain上的第一个解决方案。。。关于C++03。它不是在C++11上编译的。@Barry on()他们是用C++11(写在lang.column下)编译的。我所说的解决方案是由()@GauravJain编写的,因为他们使用的编译器有一个bug,所以应该禁止使用该代码。@lisyarus不,我的意思是&&
。如果两者都没有失败,=
将返回true
,但原始表达式将返回false,因为它们是两个不同的非空指针。但它确实编译并生成所需的结果。我在研究()的解决方案时遇到了它。确切的解决方案是它编译的()@GauravJain上的第一个解决方案。。。关于C++03。它不是在C++11上编译的。@Barry on()他们是用C++11(写在lang.column下)编译的。我所说的解决方案是由()@GauravJain编写的。他们使用的编译器有一个bug,那么代码应该被禁止。