返回值0和-1之间的差异
Difference between return 0 and -1
有人能解释一下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_SUCCESS
和EXIT_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 $?
命令来检查该值。
最后,您可以使用返回代码向客户端传达发生了什么。如果你描述了程序可以返回的返回代码。
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 返回值0和-1之间的差异
- 返回值 vkEnumeratePhysicalDevices 在不同的 VkInstances 之间是否一致?
- 放置 new 的返回值与其操作数的强制转换值之间是否存在(语义)差异
- C++ - 在线程中使用时,将函数的返回值声明为 void/void* 之间有什么区别吗?
- 返回值和副作用编码之间有什么区别
- 如何使用 Visual Studio 2005 获取两个不同 c++ 程序之间的返回值
- 返回括号 (10, 20, 30, 40) 之间的值列表
- 在返回值和"回调"之间做出决定时的样式与一致性
- 为什么我的静态方法的返回值与定义的构造函数(在 c++ 中)之间存在类型不匹配?
- 在c++中在多个函数之间返回和赋值向量的最佳方法
- 返回值 int& 和 const int& 之间的区别
- Linux和Windows之间返回值差异的原因是什么以及如何解决它
- 返回值与局部变量之间的差异