首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么!(cout << .)均值

什么!(cout << .)均值
EN

Stack Overflow用户
提问于 2021-07-09 21:31:01
回答 1查看 311关注 0票数 0

我刚刚在C++中看到了一个代码片段:https://www.geeksforgeeks.org/c-cpp-tricky-programs/

其中一个片段基本上是:

代码语言:javascript
复制
if (!(cout << "A")) {
    cout <<" B ";
}
else {
    cout << "C ";
}

输出是:"AC“

如果子句中的论点到底是什么意思?你会用普通英语怎么说呢?

我猜它的意思是:如果"A“不能打印,那就打印"B",但我不确定。

而且,这种语法经常使用吗?我认为这是我第一次在参数中看到cout,尽管我以前在参数子句中见过getc或getch。

预先谢谢您:D

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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是很常见的:

代码语言:javascript
复制
if (std::cin >> x) {
    ... use x ...
} else {
    std::cout << "reading input failed";
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68322878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档