返回值0和-1之间的差异

Difference between return 0 and -1

本文关键字:之间 返回值      更新时间:2023-10-16

有人能解释一下c++中使用的返回0和-1之间的区别吗?我读过很多其他程序员的文章和帖子,他们说返回0表示程序成功,-1表示程序出错。但我不明白的是,如果程序中有错误,编译器会生成错误,为什么要使用这些语句?请详细解释这些说法的真正含义。

这与编译器完全无关。

编译器将报告语法错误。

返回代码用于报告程序是否成功完成
("成功"取决于计划的目的)。

例如:

// Program SearchTerm "term to find"
int main(int argc, char* argv[])
{
bool search_successful = false;
[ ... do work ... ]
if (search_successful)
{
return 0;  // The search worked.
}
else
{
return -1;  // The search failed
}
}

示例用法:

SearchTerm "Microsoft"
More than 1 million results found... returned Success
SearchTerm "asldfjpu"
No results found... returned Failure

当程序报告成功或失败时,它可以集成在脚本中,例如:

#!/bin/bash
if `SearchTerm "Microsoft"`; then
GetTopResults "Microsoft"
else
echo "No results found, no Top Results to retrieve"
fi

int main()的返回值是程序的所谓退出代码。这在C中已经是如此(并没有例外),并且基本上是为了告诉调用者它是如何进行的。零的退出代码意味着成功,而每隔一个退出代码(但通常只使用正数)意味着出了问题。有时程序会记录某个退出代码的含义,即如果没有找到文件或分配失败等。

这是脚本编写的一个非常重要的部分,例如bash脚本,它通过这种方式知道调用的命令是对是错。即使您的程序因异常而崩溃,程序也会生成一个退出代码(非零)。在bash中,您可以看到最后一个使用echo $?运行的程序的退出代码,因此您可以自己查看。

return只是任何函数返回的值。在函数结束时,计算机能够接受一个值,并在返回到程序的其余部分时将其收回。在您可能熟悉的函数int main()的情况下,返回值被用作程序成功的指示。

main()只是您正在运行的程序的入口点。这是程序启动时计算机调用的第一个函数(有些例外)理论上,您可以从main()返回任何整数。

唯一"可接受"的是,任何非零的东西通常都是一些错误或故障。因此,return 0;表示成功,而return -1;可能表示某种错误。事实上,main()返回的值并不重要,也不会影响程序的运行方式。

如果您询问main返回的值,可以返回两个定义的值:EXIT_SUCCESSEXIT_FAILURE。在报头<stdlib.h>和报头<cstdlib>中定义这些值。您还可以返回值0,这相当于返回EXIT_SUCCESS。在C或C++中没有其他有意义的值,尽管您的实现可以为其他值提供意义。

我假设您在程序退出时从主程序返回0或-1。这样做的目的是通知调用程序程序程序的成功或失败。如果你只是在命令提示符下运行程序,这不是很方便,但如果你的程序是在脚本(Perl、PHP、python、PowerShell等)中调用的,你可以测试程序是否成功。

简而言之,如果你的程序被另一个程序调用,调用程序可以测试成功或失败,并做出适当的响应。

程序成功,-1表示程序有错误。

请详细解释这些说法的真正含义。

在某些情况下,函数无法继续执行,也无法完成为其指定的任务。这种情况通常称为错误。有许多可能的错误来源。其中一个例子是一个函数,该函数具有函数调用方未满足的输入的先决条件。这种先决条件的一个例子是计算有理数(即不复数)的平方根函数:负输入没有结果。

当遇到错误时,必须以某种方式将其传达给调用者。技术有很多,但我们在此不详细介绍所有技术。我将提到C++中的一个选项是例外。异常技术有一些有用的特性,但它并不是普遍适用于所有情况。

另一种非常简单的技术是返回一个整数值的错误代码。如果我们选择0表示没有错误,函数的调用方可以使用以下模式检查错误:

int error = function(arguments)
if (error) {
// handle error here
}

这种模式在C API中非常常见。C++继承了C标准库,利用C库是很常见的,所以在C++中也很常见。

有时,函数需要将返回值用于其他目的。例如,来自POSIX标准的open调用返回一个名为"0"的整数;文件描述符";,其为正整数。由于没有使用返回类型域中的一些值(负数),因此它也可以用于表示错误条件。尽管任何负数都是可用的,但选择了-1,这也是非常传统的。在其他一些API中,不同的负数表示不同的错误。另一种方法是将错误信息存储在其他地方。POSIX中选择的方法是将错误代码存储在一个单独的变量中。


结论:整数返回值是一种传递错误的技术,0通常用于表示成功,-1通常用于表示错误执行。函数的返回值的含义应由实现者记录,函数的用户应仔细研究该文档。


但我不明白的是,如果程序中有错误,编译器会生成错误,为什么要使用这些语句?

不清楚您在这里期待什么。编译器不能读懂程序员的心思,也不能知道程序应该出错的所有情况。它只能判断程序是否格式良好(如果幸运的话,可能会对明显的错误发出一些有用的警告)。

程序员有责任考虑程序的错误条件。

就编译器而言,0和-1之间的唯一区别是它们是两个不同的数字。对它们的"成功"或"失败"状态没有任何假设(除了在main中,返回值无论如何都被忽略)。

其余的是开发人员使用的(大部分是糟糕的)约定。通常<0表示失败,0表示成功,并且在针对bool进行测试时创建了一个不错的bug(其中-1是true,0是false)。

应该使用枚举,或者至少使用更容易识别的东西,如在windows HRESULT中。

这基本上意味着除了0之外的任何事情都意味着在程序执行过程中发生了不好的事情。程序无法处理它,因此退出并返回状态代码。

通常在使用shell时,您会注意到一些命令会以非0状态代码退出。您可以通过运行echo $?命令来检查该值。

最后,您可以使用返回代码向客户端传达发生了什么。如果你描述了程序可以返回的返回代码。