我刚刚在C++中看到了一个代码片段:https://www.geeksforgeeks.org/c-cpp-tricky-programs/
其中一个片段基本上是:
if (!(cout << "A")) {
cout <<" B ";
}
else {
cout << "C ";
}输出是:"AC“
如果子句中的论点到底是什么意思?你会用普通英语怎么说呢?
我猜它的意思是:如果"A“不能打印,那就打印"B",但我不确定。
而且,这种语法经常使用吗?我认为这是我第一次在参数中看到cout,尽管我以前在参数子句中见过getc或getch。
预先谢谢您:D
发布于 2021-07-09 21:40:45
首先,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程序验证if块内的条件//它只是验证if块内的条件,//即返回非零值的cout <<“极客”,/(非零值)为假,因此它执行“否则”。
std::cout当然不是0,但这不是条件计算为!true的原因!原因是调用std::cout::operator bool来执行对bool的隐式转换。
最后但并非最不重要的是,这个例子是完全愚蠢的。它基本上是这样的:当流不是处于失败状态时,就打印一些东西,当它处于失败状态时,无论如何尝试打印一些东西。这没有多大意义。另一方面,在从用户读取输入时,使用隐式转换到bool是很常见的:
if (std::cin >> x) {
... use x ...
} else {
std::cout << "reading input failed";
}https://stackoverflow.com/questions/68322878
复制相似问题