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

时间:2020-01-08 20:08:33

标签: c++

任何人都可以解释一下c ++中使用的return 0和-1之间的区别吗?我读过许多其他程序员的文章和帖子,说返回0表示程序成功,而-1表示程序有错误。但是我不明白的是,如果程序中仍然存在一个错误,为什么编译器会生成错误时为什么要使用这些语句呢?请详细解释这些陈述的真正含义。

8 个答案:

答案 0 :(得分:5)

这与编译器绝对无关。

编译器将报告语法错误。

返回码用于报告程序是否成功完成。
(“成功”取决于程序的意图)。

例如:

// 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

答案 1 :(得分:2)

int main()的返回值是程序的所谓退出代码。在C语言中已经是如此(没有例外),并且可以在那里基本告诉调用方它的运行方式。退出代码为零表示成功,而其他所有退出代码(但通常每个退出代码仅使用肯定的退出代码)表示出了点问题。有时,程序会记录某些退出代码的含义,即,如果找不到文件或分配失败等。

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

答案 2 :(得分:0)

基本上,这意味着0以外的其他任何东西都意味着在程序执行期间发生了不好的事情。该程序无法对其进行处理,因此它退出并显示状态代码。

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

最后,您可以使用返回码向客户端传达发生的情况。也就是说,如果您描述程序可以返回的返回码。

答案 3 :(得分:0)

return只是任何函数返回的值。在功能结束时,计算机可以返回一个值,以便在返回程序的其余部分时将其取回。对于您可能熟悉的函数int main(),返回值用作程序成功的指示。

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

请详细解释这些陈述的真正含义。

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

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

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

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

此模式在C API中非常常见。 C ++继承了C标准库,利用C库很常见,因此在C ++中也经常遇到这种情况。

有时,函数需要将返回值用于其他目的。例如,从POSIX标准进行的open调用返回一个称为“文件描述符”的整数,它是一个正整数。由于未使用返回类型域中的某些值(负数),因此它也可用于表示错误情况。尽管可以使用任何负数,但选择了-1,这也是很常规的做法。在其他一些API中,不同的负数表示不同的错误。另一种方法是将错误信息存储在其他位置。 POSIX中选择的方法是将错误代码存储在单独的变量中。


总结:整数返回值是一种传达错误的技术,常规上使用0表示成功,而通常使用-1表示错误执行。函数返回值的含义应由实现者记录下来,并且函数的用户应仔细研究该文件。


但是我不明白的是,如果程序中仍然存在一个错误,为什么编译器会生成错误时为什么要使用这些语句呢?

目前尚不清楚您的期望。编译器无法理解程序员的想法,也不知道程序应该出现错误的所有情况。它只能告诉程序是否格式正确(如果幸运的话,可能会给出一些有关明显错误的有用警告)。

程序员有责任考虑程序的错误情况。

答案 7 :(得分:0)

就编译器而言,0和-1之间的唯一区别是它们是两个不同的数字。不管它们的“成功”或“失败”状态是什么,都不会假设(除非在main中始终忽略返回值)。

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

应该使用枚举,或者至少使用Windows HRESULT中更易于识别的内容。