我刚刚在这里发现了一个 C++ 代码片段:https://www.geeksforgeeks.org/c-cpp-tricky-programs/
其中一个片段基本上是:
if (!(cout << "A")) {
cout <<" B ";
}
else {
cout << "C ";
}
输出为:“AC”
if 子句中的参数到底是什么意思? 用普通英语怎么说?
我的猜测是:如果“A”不可打印,则打印“B”,但我不确定。
此外,这种语法是否经常使用?我想这是我第一次在参数中看到 cout,尽管我之前在参数子句中看到过 getc 或 getch。
提前致谢:D
答案 0 :(得分:4)
首先,std::cout::operator<<
返回对流的引用。
接下来,std::ostream
有一个 operator bool
(继承自 std::basic_ios
):
如果流没有错误并且准备好进行 I/O 操作,则返回 true。具体来说,返回 !fail()。
因此,cout << "A"
打印 "A"
,然后返回对 std::cout
的引用,这被隐式转换为 bool
。由于 std::cout
未处于错误状态,因此它是 true
并且 !true
让 if
进入 else
分支。
请注意,代码附带的注释具有误导性:
<块引用>// CPP program to verifies the condition inside if block
// It just verifies the condition inside if block,
// i.e., cout << "geeks" which returns a non-zero value,
// !(non-zero value) is false, hence it executes else
std::cout
当然不是 0
,但这不是条件评估为 !true
的原因!原因是调用了 std::cout::operator bool
来执行到 bool
的隐式转换。
最后但并非最不重要的是,这个例子完全是愚蠢的。它基本上说:当流不处于失败状态时打印一些东西,当它处于失败状态时尝试无论如何打印一些东西。那没有多大意义。另一方面,从用户读取输入时,使用隐式转换到 bool
是很常见的:
if (std::cin >> x) {
... use x ...
} else {
std::cout << "reading input failed";
}