!(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
并且 !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";
}
我刚刚在这里看到一段 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
并且 !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";
}