在 COUT 语句中使用 COUT 调用函数
call function with cout inside a cout statement
首先,请看一下我的问题来源的一些简单代码。
#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
打印某些内容与从函数返回值不同。这是完全正交的东西。
你可以写:
std::string returned_value = get_something();
std::cout << returned_value;
但是你不能写:
??? returned_value = print_something();
std::cout << returned_value;
因为print_something()
不返回任何东西!void
表示缺少类型。不能有类型void
的对象。
另一方面,当你调用一个函数时,你可以使用返回值(上面(,或者你可以忽略它,所以这是正确的代码:
print_something(); // prints something
get_something(); // also print something and returned value is ignored
请注意,函数get_something
应该获得更好的名称,因为它不仅仅是"获取"一个值。print_and_return_something()
怎么样?
附注:
我真正困惑的是,怎么可能做一个又一个的cout?我只是错过了cout的实际作用吗?
不知道如果我明白,但我会尝试...std::cout
是std::ostream
类型的对象。它有一个可以调用的operator<<
,类似于调用其他对象的方法。以下两个是相同的,只是使用不同的语法:
std::cout.operator<<( "Hello World");
std::cout << "Hello World";
调用print_something()
时,首先执行函数,然后将返回值返回给调用方,并继续执行调用方。这:
std::cout << get_something();
或多或少与(嗯,这是一个粗略的简化,但在这里应该没问题(:
// 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()
可以打印一些东西,然后你可以写
std::string print_and_return() {
std::string x{"Hello World"};
print(x);
return x;
}
调用方可以执行
std::string x = print_and_return(); // <- this already calls print()
print(x); // now we call it again
这或多或少与您的相同,只是我使用了一些假设的print()
而不是std::cout::operator<<
.
两个函数都有一个返回类型。只是其中一个具有void
返回类型。
对于采用void
类型的<<
,std::ostream
类没有重载。这是明智的 - 在这种情况下会写入流什么?
(cout
是std::ostream
的一个实例,它通常将自身写入标准输出,通常是您用来启动程序的 shell。
因为print_something()
没有什么要返回的,cout
希望将某些内容写入控制台(它期望的返回值(。因此,它会给出错误。
另一方面,get_something()
有一些东西可以回报。因此,在执行其行的其余部分(返回语句除外(后,它返回字符串,该字符串由cout打印
get_something()
返回一些东西(似乎被cout
接受的东西(,所以cout
会收到返回的东西并将工作。
另一方面,print_something()
不返回任何内容(因为它的返回类型是void
(,因此cout
无法接收任何要打印的内容并且不起作用。
cout
是一个流对象,我们使用<<
(插入运算符(将字符串,浮点,Int等值插入到它将显示在输出屏幕中print_something()
。
我建议您阅读有关c ++中的流的信息。
- std::cout.imbue()多重调用
- 在 COUT 语句中使用 COUT 调用函数
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- 调用 cout 时如何在结构中输出常量文本?
- 我的 cout 上有一个奇怪的输出,它把答案放在第一位,然后在我调用它的地方放一个奇怪的输出.我该怎么办?
- std::cout 如果从自定义分配器 (Visual Studio 2019) 调用,则不会输出
- COUT 内部函数调用的顺序
- 为什么调用 cout.operator<<(const char*) 打印地址而不是字符串? 如何创建一个函数本地静态"HashSet<char>"并初始化它一次?
- 调用方法时C cout.不知道我在做什么错
- C++:cout 和函数调用之间的计算顺序
- 在重复调用的函数中,使用cout只打印一次语句
- 调用"cout"语句中带有"cout"语句的函数
- 在函数调用中封装std::cout
- 当我调用std::abort()时,cout没有显示
- 两个调用 cout 的效率是否低于一个
- 函数调用不显示 cout
- 为什么我不能将 cin/cout 放在一个函数中并从 main() 调用该函数
- 为什么在堆中调用的这个函数不能调用 cout?
- 快速跟踪/查找对 printf 或 cout 的调用(丢失已久的调试输出)
- 为什么Qt Creator在cout.flush()调用后添加一个换行符