!(cout << ....) 是什么意思

时间:2021-07-09 21:31:01

标签: c++ visual-c++ cout

我刚刚在这里发现了一个 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

1 个答案:

答案 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 并且 !trueif 进入 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";
}
相关问题