使用退货;对于初学者,从不同的角度来看 c++

The use of return; For a beginner, from a different perspective c++

本文关键字:c++ 初学者      更新时间:2023-10-16

我刚刚开始编程,我经常听到标准的初学者对"在main中使用返回值"的定义,但它并没有达到我试图理解的地步。因此,是的,例如,"int main"的返回值 0 表示程序运行成功,并且由于 main 是 int 数据类型,因此 0 反映了这一点。

但这有什么意义呢?计算机不会已经知道代码成功与否吗?当然,我们可以编写一个有缺陷的代码,然后返回 0,按照这个逻辑,我们(程序员)说这段代码是正确的,但编译器实际上执行程序,如果它是错误的/有缺陷的,它根本无法操作它。

请使用初学者可以理解的解释。

程序的返回代码不是关于崩溃,而是关于一种功能故障。

例如,程序 grep 将退出/失败代码 0 定义为成功找到,将 1 定义为未找到。而值 2 用于无效输入。

在脚本中,这可以用于某些自动化逻辑,而无需用户解释结果。

由于您是初学者,我建议您始终返回零,因为您专注于如何学习该语言。研究应用程序如何通过退出代码相互连接会增加不必要的分心/复杂性。

程序可能会失败,因为某些期望没有得到满足。

例如,当其中一个参数不是有效的文件名时,或者由于某些原因无法打开该文件时,计算作为参数传递给main的文件行数的程序将失败。如果你编写这样的程序,你需要为此显式添加一些程序逻辑(即几个或多个源代码行)。一个好的程序员不允许他的程序崩溃(即使输入或参数错误或缺失)。

将源文件复制到目标的简单程序需要两个参数。如果没有给main两个参数,它应该会失败。如果第一个参数未命名有效且可访问的文件,则程序也应失败。如果由于某些磁盘已满而无法实现复制,则该程序也应失败。

实际上,从main返回的不是某个任意整数。在 Linux 和许多 POSIX 系统上,它应该是 0 到 255 之间的某个整数(0 表示"成功执行",其他退出值表示失败)。参见 exit(3) & waitpid(2) 了解更多信息。

根据某些约定(您需要记录),失败代码(实际上很少,通常少于十几个,并且通常 0 个命名的EXIT_SUCCESS- 成功和 1 个命名的EXIT_FAILURE- 失败)可以说明失败原因。有关示例,请参阅 tar(1)、coreutils program、grep(1) 等的文档。

BSD unix 在 sysexit 中定义了一些约定(但 Linux 程序通常不使用它)。

Shell 脚本可以轻松测试和处理退出代码。

另请阅读有关 Unix 哲学的信息。成功的命令行程序 (例如 cp(1)) 通常可能是无声的。错误消息将(按照惯例)发送到 stderr。

随着你对 C 编程的了解越来越多,你会明白约定很重要(记录它们很重要)。还要研究一些现有的自由软件程序的源代码,例如在github上。

请记住,你不是主要为计算机编写代码,而且主要是为必须改进你的代码的人(也许几个月后你,也许是一些未来的开发人员在你的公司工作,那时你将成为一名专业开发人员)。

main 的返回值指示某些内容是否在"业务"意义上工作,而不是在"技术"意义上工作。如果程序存在技术缺陷,main 可能根本不会返回,因为程序可能会崩溃,或者由于未定义的行为,返回值将毫无意义。

返回值用于搜索程序等内容,以指示是否找到了程序感兴趣的内容。在这种情况下,计算机无法知道返回什么,因为它不了解程序的语义。

main的返回值,一旦完成运行就成为进程的退出代码,与代码是否正确C++无关,而是从其语义(比方说其业务逻辑)的角度来看它是否正确执行。

虽然程序作为C++源代码存在,但从main返回与其他任何指令一样。main中具有return 0;不会影响您的程序是否是有效的C++程序,并且不会修复例如语法错误。在编译时,它完全无关紧要。

编译的程序实际运行时(已经是二进制形式),main的返回值就会发挥作用。

也就是说,当您执行例如gcc ... -o myappmain的返回值没有发挥作用(实际上,它甚至不存在)。但是当你执行./myapp时,它的进程退出代码(例如shell使用)是由main的返回值设置的。

例如,unixif命令测试其参数返回的是0还是非0

if ./myapp; then
echo "Success"
fi

上面的 shell 脚本是否回显Success取决于myapp的进程退出代码是否0,换句话说,它的main函数是否返回0

这种检查的Windows世界等效物是:

myapp.exe
if errorlevel 1 goto bad
echo "Success"
bad:

一种常见的约定是在成功时进程退出代码为 0,当程序无法完成其任务时为 1(例如,要求删除不存在的文件),当错误调用时为 2(例如,它被赋予了一个它不理解的命令行选项)。这些main返回的值。