22 c++
可能重复:
主要的正确声明是什么?
如果没有特别引用任何代码,我正在寻找以下示例的解释:
#include <iostream>
int main()
{
std::cout << "Hello world" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不明白是什么return 0
.你能用尽可能简单的英语解释一下吗?
Joh*_*web 41
这定义了流程的退出状态.尽管是int
类Unix系统,但值始终在0-255范围内(参见退出和退出状态).在Microsoft系统上,您可以使用32位有符号整数作为退出代码,您可以查看%ERRORLEVEL%
.为了便于携带,我建议坚持0-255范围.
这是一个简单的例子:
$ cat -n exit_code.cpp
1 int main()
2 {
3 return 42;
4 }
5
Run Code Online (Sandbox Code Playgroud)
建立:
$ make exit_code
g++ exit_code.cpp -o exit_code
Run Code Online (Sandbox Code Playgroud)
运行(在bash中):
$ ./exit_code
Run Code Online (Sandbox Code Playgroud)
检查退出状态:
$ echo $?
42
Run Code Online (Sandbox Code Playgroud)
通常,零状态表示成功和非零故障.这在shell脚本中非常有用,以此类推,以指示失败的级别,如果有的话:
$ ./exit_code
exit_status=$?
if [[ ${exit_status} ]] ; then
echo "The process failed with status ${exit_status}."
else
echo "Success!"
fi
The process failed with status 42.
Run Code Online (Sandbox Code Playgroud)
以下评论......
在标准C++ 标头中<cstdlib>
,定义了以下宏:
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
Run Code Online (Sandbox Code Playgroud)
但是,GNU C Library文档的Exit Status部分描述了相同的宏,sagely指出:
可移植性说明:某些非POSIX系统对退出状态值使用不同的约定.为了获得更好的可移植性,可以分别使用宏EXIT_SUCCESS和EXIT_FAILURE作为成功和失败的常规状态值.它们在文件stdlib.h中声明.
return
ING每个函数都有一个返回类型.
在下面的示例中,类型是void
,"不完整类型",没有值; 使用它作为返回类型意味着该函数不返回任何值:
void foo() {
std::cout << "Hello world\n";
}
Run Code Online (Sandbox Code Playgroud)
但是,在下面的示例中,返回类型是int
:
int foo() {
return 3;
}
Run Code Online (Sandbox Code Playgroud)
该return
语句确定函数调用的值foo
将被评估为.因此,std::cout << foo()
将导致" 3
"打印到标准输出.
return
main
特别是来自当有问题的函数恰好是"主"函数或程序的入口点时,它有点特别,因为"main"函数的"返回值"被认为是程序的"退出代码" - 它告诉它调用环境(例如终端会话)是否认为程序的执行是成功的.它必须是一个int
,0
这里的值意味着"一切都很顺利":
值得注意的是,您实际上可以完全省略return 0;
"main"函数,因为它将隐式包含在内.但是,如果您想要return 1;
或其他一些值,这对您没有多大帮助,并且它不会与其他功能发挥作用.
[C++11: 3.6.1/5]:
return语句main
具有离开main函数(销毁具有自动存储持续时间的任何对象)并std::exit
使用返回值作为参数进行调用的效果.如果控件到达结尾而main
没有遇到return语句,则效果就是执行return 0;
[C++11: 18.5/8]:
Run Code Online (Sandbox Code Playgroud)[[noreturn]] void exit(int status)
该功能
exit()
在本国际标准中有其他行为:
- 首先,销毁具有线程存储持续时间并与当前线程相关联的对象.
接下来,销毁具有静态存储持续时间的对象,并调用通过调用注册的函数atexit
.有关破坏和调用的顺序,请参见3.6.3.(由于调用exit(),自动对象不会被销毁.)
如果控制离开了一个由exit调用的注册函数,因为该函数没有为抛出异常提供处理程序,terminate()
则应调用(15.5.1).- 接下来,
<cstdio>
刷新所有打开的C流(由声明的函数签名调解)和未写入的缓冲数据,关闭所有打开的C流,并tmpfile()
删除通过调用创建的所有文件.- 最后,控制权返回给主机环境.如果status为零
EXIT_SUCCESS
,则返回状态成功终止的实现定义形式.如果status为EXIT_FAILURE
,则返回状态为不成功终止的实现定义形式.否则返回的状态是实现定义的.
我建议使用其中一种资源,因为在任何体面的同行评审的C++书中都能正确解释这种情况; YouTube教程不是学习C++的好方法,Stack Overflow贡献者通常会希望您在求助之前有一本体面的书来形成您之前的研究.
归档时间: |
|
查看次数: |
28781 次 |
最近记录: |