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

What does !(cout << ....) mean

我刚刚在这里看到一段 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

首先,std::cout::operator<< returns 对流的引用。

接下来,std::ostream有一个operator bool(继承自std::basic_ios):

Returns true if the stream has no errors and is ready for I/O operations. Specifically, returns !fail().

因此,cout << "A" 打印 "A",然后 returns 引用 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";
}