就上下文而言,我一直用来自学编程的语言是 Python。现在我正在尝试学习 C++ 来扩大我的编码素养,但我无法理解函数如何返回值。 我一直在阅读以下文档: https://www.cplusplus.com/doc/tutorial/program_structure/
也许我需要更好地理解返回值与输出某些东西,但让我对第一个程序结构练习感到困惑的是它从经典的“Hello world”示例开始,这显然是一个字符串。但是,“int main()”需要一个整数,而不是一个字符串,对吗?那么会不会有某种错误会阻止程序编译?
答案 0 :(得分:3)
main
返回 int
。没有别的。
main
有三个可移植的返回值:EXIT_FAILURE
、EXIT_SUCCESS
和 0
。返回 EXIT_SUCCESS
或 0
会返回特定于实现的值,操作系统会将其解释为成功执行。返回 EXIT_FAILURE
会返回一个特定于实现的值,操作系统将其解释为执行失败。您可以从 <cstdlib>
或 <stdlib.h>
获得这些宏。
大多数时候价值并不重要;它只是被忽略了。但是当您通过操作系统运行脚本时,有时特定程序是否成功很重要,然后您在脚本中编写代码以检查程序返回的值。一个简单的例子(好吧,对于 shell 脚本来说很简单,但仍然有些神秘):
./my_program
if [ $? -eq 0 ];
then
echo "Succeeded"
else
echo "Failed"
fi
这里,$?
是上一个命令的结果。由于之前的命令是 ./my_program
,如果程序运行成功,$?
将为 0,否则为其他值。
答案 1 :(得分:2)
似乎这里的混淆主要不是关于 main
函数,所以让我们暂时离开 main
。
打印一个值和返回一个值从根本上说是两件不同的事情,彼此之间没有任何关系。令人困惑的部分是我们经常使用“输出”这个词来表示几种不同的事物之一。
让我们首先了解返回值本身是什么。所以希望你知道函数可以从其他函数内部调用,并作为在程序中组织功能的一种方式。我们来看一个非常简单的例子:
int getDoubled(int x)
{
return 2 * x;
}
这里我们定义了一个名为 getDoubled
的简单函数,它需要一个整数作为参数并返回一个整数。并且我们从代码中可以看出,返回的整数是x
,输入参数乘以2。
现在我们有了一个函数,我们可以从其他地方调用它:
int y = getDoubled(3);
在这里,我们通过写入函数名称和参数列表来调用该函数。这意味着函数内的代码将被运行,并且其 return 语句中的表达式将是它所表现的值。在这种情况下,这意味着 y
被分配了值 6
,因为 getDoubled(3)
的计算结果为其返回值 6
。
注意这与将值 6 打印到屏幕无关,C++ 中函数的返回类型和值仅用于确定函数调用在表达式中表示的值。现在考虑一下:
int y = getDoubled(getDoubled(3));
现在 y
将被分配值 12,因为内部 getDoubled
调用返回 6,它作为参数传递给外部 getDoubled
调用,然后返回 12。
由于函数调用只是表达式,因此它们可以在任何需要表达式的地方使用,例如在 if
语句中:
if (getDoubled(y) < z) { /* ... */ }
事实上,我们甚至可以使用 bool
返回类型来编写可能直接在 if 语句中调用的函数:
bool isLess(int x, int y)
{
return x < y;
}
所以现在我们可以这样写:
if (isLess(z, 5)) { /* ... */ }
诚然,这样做是毫无意义的,因为您也可以直接在其中写入 z < 5
。这只是为了说明这是如何工作的,而不会陷入不相关的细节。
因此返回类型描述了函数调用将评估为的值的类型。
现在,尽管如此,main
实际上非常特别。它不是一个普通的函数,因为您实际上不允许自己调用 main
,甚至可以省略它的 return 语句。这样做的原因是要运行您的程序的操作系统需要一些入口点才能开始运行。
与 Python 不同,C++ 不允许在程序的顶层使用“可执行”代码,它只允许定义和声明(这里有一些用于初始化静态变量等的回旋余地,但我们将忽略这一点目前)。我的意思是你不能把它写成一个 cpp 文件中的程序:
std::cout << "Hello world!\n";
C++ 要求这类语句只出现在函数内部。那么当操作系统开始执行你的程序时,它从哪里开始呢?这就是 main
的目的。它标志着您的程序的入口点。就像每当用户运行您的程序时操作系统都会调用该 main
函数一样。
这与 Python 形成对比,Python 中程序的入口点只是被调用的脚本文件。从技术上讲,仍然有一个 main
,但它在 python
可执行文件本身内部,您不必担心它。
正如其他答案所指出的,main
函数的返回值纯粹是为了让操作系统了解您的程序是成功完成还是由于某种原因失败。为此,它使用了 int
。
好的,既然如此,那么打印和 cout
有什么关系?嗯,这是您的程序和操作系统之间接口的另一部分。您的程序实际上具有所谓的标准流。通常有 3 个:标准输出、标准输入和标准错误。这些都在 C++ 中分别作为 cout
、cin
和 cerr
提供。
当您写入 cout
时,您将数据放入程序的标准输出流中。您程序的任何部分都可以做到这一点。如果您创建了控制台应用程序,那么该标准输出流通常会打印到控制台。但是操作系统通常允许您将该输出流发送到其他地方,例如文件,甚至将其连接到另一个程序的输入。
将其视为可以写入的特殊文件的一种方式(对于 cin
也是如此,它是可以从中读取的不同特殊文件)。这是从程序中获取数据并到达用户可以看到的位置的一种方法,但它是从函数返回的完全不同的机制。
答案 2 :(得分:0)
main() 函数在大多数操作系统环境中都有一个 int 返回码。返回码是程序退出码。值 0 表示没有错误,其他值大多被解释为错误。 但是,在操作系统较少的嵌入式应用程序(裸机)上,main 函数永远不会返回,因此该函数被声明为 void main()。