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