使用退货;对于初学者,从不同的角度来看 c++
The use of return; For a beginner, from a different perspective c++
我刚刚开始编程,我经常听到标准的初学者对"在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 myapp
,main
的返回值没有发挥作用(实际上,它甚至不存在)。但是当你执行./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
返回的值。
- C++错误消息*成员参考.**初学者*
- 嵌套for循环C++的问题(初学者)
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 初学者如何使用标准::any_of?
- 初学者问题:如何使用这些晦涩难懂的命令,例如C++中的'RenderWindow'
- C++初学者:为什么我的编译器根据我的循环返回"name not found"?
- 初学者问题:如何访问此变量?
- 您好,我是C++初学者,有这种问题.它给了我倍增的错误
- 图形初学者C++(跳过控制台)?
- 我是初学者,无法理解c ++程序中的以下错误
- 试图美化这个Arduino代码[初学者在这里]
- 初学者问题:C++指针/地址 - 和变量之后不是以前?
- 初学者关于数组和指针的问题
- 如何修复初学者C++代码中发生的未定义行为
- 如何从字符数组C++中提取2个整数并将它们存储在2个变量中(初学者)
- 初学者C++线程安全单例设计
- 初学者:在向量中降低
- 模板编程初学者问题
- C ++初学者使用while循环生成随机数
- 在 Rcpp-Function 中使用布尔向量的子集(Rcpp 初学者的问题..)