需要帮助理解 C++ 编码示例中 int main() 的 return 值

Need help understanding return value of int main() in C++ coding example

就上下文而言,我一直用来自学编码的语言是 Python。现在我正在尝试学习 C++ 以扩大我的编码素养,但我无法理解函数如何返回值。 我一直在阅读以下文档: https://www.cplusplus.com/doc/tutorial/program_structure/

也许我需要更好地理解返回值与输出某些东西,但第一个程序结构练习让我感到困惑的是它从经典的“Hello world”示例开始,这显然是一个字符串。然而,“int main()”需要一个整数,而不是一个字符串,对吧?那么会不会有某种错误会阻止程序编译?

main() 函数在大多数操作系统环境中都有一个 int return 代码。 return 代码是程序退出代码。值为 0 表示没有错误,其他值大多被解释为错误。 但是,在 OS 较少的嵌入式应用程序(裸机)上,主函数永远不会 returns,因此该函数被声明为 void main()。

mainreturns int。没有别的。

main 中有三个可移植的 return 值:EXIT_FAILUREEXIT_SUCCESS0。返回 EXIT_SUCCESS0 returns 一个特定于实现的值,OS 将其解释为成功执行。返回 EXIT_FAILURE returns 一个特定于实现的值,OS 将其解释为执行失败。您从 <cstdlib><stdlib.h>.

获得这些宏

大多数时候价值并不重要;它只是被忽略了。但是,当您 运行 脚本通过 OS 时,有时特定程序是否成功很重要,然后您在脚本中编写代码来检查程序 returned 的值。一个简单的例子(好吧,对于 shell 脚本来说很简单,但仍然有些神秘):

./my_program
if [ $? -eq 0 ];
then
    echo "Succeeded"
else
    echo "Failed"
fi

这里,$?是上一条命令的结果。由于之前的命令是./my_program,如果程序运行成功,$?就会是0,如果不成功,就会是其他值

看来这里的混淆主要不是关于 main 功能,所以让我们暂时离开 main

打印一个值和return输入一个值从根本上说是两件不同的事情,实际上彼此之间没有任何关系。令人困惑的部分是我们经常使用“输出”这个词来表示几种不同的事物之一。

让我们首先了解 return 值本身是什么。所以希望你知道函数可以从其他函数内部调用,并作为一种在程序中组织功能的方式。让我们看一个非常简单的例子:

int getDoubled(int x)
{
  return 2 * x;
}

这里我们定义了一个名为 getDoubled 的简单函数,它需要一个整数作为参数,return 是一个整数。而我们从代码中可以看出整数returned是x,输入参数,乘以2.

现在我们有了一个函数,我们可以从其他地方调用它:

int y = getDoubled(3);

这里我们调用了函数,方法是在其名称后跟一个参数列表。这意味着函数内的代码将是 运行 并且其 return 语句中的表达式将是其行为的值。在这种情况下,这意味着 y 被分配了值 6,因为 getDoubled(3) 计算为其 return 值 6

注意这与将值 6 打印到屏幕无关,C++ 中函数的 return 类型和值 仅用于确定函数调用代表的值一个表达式。现在考虑一下:

int y = getDoubled(getDoubled(3));

现在 y 将被分配值 12,因为内部 getDoubled 调用 returns 6,它作为参数传递给外部 getDoubled 调用然后 returns 12.

因为函数调用只是表达式,所以它们可以用在任何需要表达式的地方,比如在 if 语句中:

if (getDoubled(y) < z)  { /* ... */ }

事实上,我们甚至可以使用 bool return 类型来编写我们可能会在 if 语句中直接调用的函数:

bool isLess(int x, int y)
{
  return x < y;
}

所以现在我们可以这样写:

if (isLess(z, 5)) { /* ... */ }

诚然,这样做是毫无意义的,因为您也可以在其中写入 z < 5。这只是为了说明它是如何工作的,而不会陷入无关紧要的细节中。

因此 return 类型描述了函数调用将求得的值的类型。

现在,综上所述,main 实际上非常特别。这不是一个普通的函数,因为实际上不允许您自己调用 main,甚至可以省略它的 return 语句。这样做的原因是要 运行 您的程序的操作系统需要一些入口点才能从 运行ning 开始。

与 Python 不同,C++ 不允许在程序的顶层使用“可执行”代码,它只允许定义和声明(这里有一些回旋余地用于初始化静态变量等,但我们暂时忽略它)。我的意思是你不能把它写成 cpp 文件中的程序:

std::cout << "Hello world!\n";

C++ 要求这类语句只出现在函数内部。那么当操作系统去执行你的程序时,它从哪里开始呢?这就是 main 的目的。它标志着您程序的入口点。就好像只要您的程序被用户 运行 时,操作系统就会调用 main 函数。

这与 Python 形成对比,在后者中,程序的入口点只是被调用的脚本文件。技术上仍然有一个 main,但它在 python 可执行文件本身内部,您不必在那里担心它。

正如其他答案指出的那样,main 函数的 return 值纯粹是为了让操作系统了解您的程序是成功完成还是由于某种原因失败。为此,它使用 int.

好的,既然如此,打印和 cout 有什么关系?嗯,这是你的程序和操作系统之间接口的另一部分。您的程序实际上具有所谓的标准流。通常有 3 个:标准输出、标准输入和标准错误。这些都在 C++ 中分别作为 coutcincerr 提供。

当您写入 cout 时,您正在将数据放入程序的标准输出流中。您程序的任何部分都可以做到这一点。如果您创建了控制台应用程序,则该标准输出流通常会打印到控制台。但是操作系统通常允许您将该输出流发送到其他地方,例如文件,甚至可以将其连接到另一个程序的输入。

一种理解方式是将它想象成一个可以写入的特殊文件(对于 cin 同样是一个不同的特殊文件,您可以从中读取)。这是从程序中获取数据并到达用户可以看到的位置的一种方法,但它是 return 从函数中获取数据的完全不同的机制。