首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cout语句中包含cout的调用函数

cout语句中包含cout的调用函数
EN

Stack Overflow用户
提问于 2020-07-03 14:11:46
回答 5查看 1.1K关注 0票数 1

首先,请看一些简单的代码,我的问题来源。

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;

string get_something() 
{ 
    cout << "output something"; 
    return " and return something"; 
}
    
void print_something() 
{
    cout << "print something";
}

int main()
{
    cout << get_something();    // will work 
    cout << print_something();  // will NOT work

return 0;
}

我注意到的get_something()和print_something()之间唯一不同的地方是,一个是返回类型,另一个不是返回类型。

然而,我真的不知道在这一幕背后发生了什么,使之成为可能,而另一种则不可能。我甚至不知道该如何去寻找这类问题。所以我在这里问一个问题。

请告诉我..。

编辑:我搞不懂怎么可能在cout之后做cout。这两个函数都能做到这一点,但其中一个可以工作,而另一个则不行。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-07-03 14:17:05

这似乎是初学者中一个很常见的误解。通过cout打印某些内容与从函数返回值不一样。这完全是正交的。

你可以写:

代码语言:javascript
复制
std::string returned_value = get_something();
std::cout << returned_value;

但你不能写:

代码语言:javascript
复制
??? returned_value = print_something();   
std::cout << returned_value;

因为print_something()不返回任何东西!void表示没有类型。不能有void类型的对象。

另一方面,当您调用一个函数时,您可以使用返回的值(上面),也可以忽略它,所以这是正确的代码:

代码语言:javascript
复制
 print_something();       // prints something
 get_something();         // also print something and returned value is ignored

注意,函数get_something应该有一个更好的名称,因为它不仅仅是“获取”一个值。print_and_return_something()怎么样?

PS:

我真正困惑的是,怎么可能在cout之后再做cout呢?我只是错过了cout真正做的事吗?

不知道我是否理解,但我会尽力.std::coutstd::ostream类型的对象。它有一个可以调用的operator<<,类似于调用其他对象的方法。以下两种语法是相同的,只是使用不同的语法:

代码语言:javascript
复制
std::cout.operator<<( "Hello World");
std::cout << "Hello World";

调用print_something()时,首先执行函数,然后将返回值返回给调用方,调用方继续执行。这是:

代码语言:javascript
复制
std::cout << get_something(); 

大致相同(嗯,这是一个粗略的简化,但在这里应该是可以的):

代码语言:javascript
复制
// inside get_something
std::cout << "output something"; 
// return value
std::string result{"output something"};
// now execution continues in caller
std::cout << result;

cout之后调用cout与调用其他函数没有什么不同。假设您有一个函数print(),它可以打印一些东西,然后可以编写

代码语言:javascript
复制
std::string print_and_return() {
        std::string x{"Hello World"};
        print(x);
        return x;
}

打电话的人

代码语言:javascript
复制
std::string x = print_and_return(); // <- this already calls print()
print(x);                           // now we call it again

这与您的大致相同,只是我使用了一些假设的print(),而不是std::cout::operator<<

票数 5
EN

Stack Overflow用户

发布于 2020-07-03 14:21:52

这两个函数都有一个返回类型。只是其中一个有一个void返回类型。

std::ostream类对于接受void类型的<<没有重载。这是明智的--在这种情况下,会写什么到流中?

(coutstd::ostream的一个实例,它通常将自己写入标准输出,通常是用来启动程序的shell。)

票数 5
EN

Stack Overflow用户

发布于 2020-07-03 14:15:53

因为print_something()没有什么可返回的,而且cout想要将一些东西写入控制台(它所期望的返回值)。因此,它会产生错误。

另一方面,get_something()有一些东西要返回。因此,在执行行的其余部分后(除了return语句),它返回字符串,该字符串由cout打印

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62717187

复制
相关文章

相似问题

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