关于C语言在主函数 main 的返回值为0

#include<stdio.h>
int main(void)
{
int i = 99;
printf(“%d”,i);

return 0;
}
就上面这个函数 来理解返回值0。我想问一下。我是不是可以这样理解。

主函数main 在执行中 流程是 执行i 给i赋值 99 然后输出 i 然后 返回值0 然后0 就交给操作系统 ,操作系统就去执行这个输出99在屏幕上,
那么如果 在主函数 在执行 中 给i赋值99的时候 出错(这个出错是假设), 那么程序就无法继续往下操作,那么这个时候 函数是否就会自动返回-1给操作系统。然后操作系统来终止这个函数?
这里的返回值 我理解的意思 在主函数中,无论你如何对函数内部进行处理,但是必须要经行到return 0这一步。不然 就代表这个函数是失败的。?

另外如果 我为retrun -1,一般的操作系统是否就不会对这个函数进行处理呢?

你的理解有误。首先,这段代码是先执行了输出99在屏幕上,然后在退出之前才返回的0。而不是正常退出了之后系统才去处理输出。其次,返回多少是程序员自己控制的,你喜欢将你上面代码的return 0改成return -1,程序就返回-1出去。另外,程序出错的时候,也不会自动返回什么值给系统,全都是程序员自己代码控制。而至于返回出去的值怎么使用,也不是操作系统自己处理,而是外部调用的人自己根据需要控制。例如如果B程序是被A程序在程序中调用的,A程序就可以检查B程序的返回值来进行相应处理。而一些脚本,批处理也可以检查程序返回值来进行正确的操作。至于返回什么代表什么,是这个程序的开发者自己制定。只是,一般习惯上,都在运行正常,正常退出的时候return 0.追问

不好意思 ,你的解答反而弄得我有点糊涂了。因为之前在我查询过是 人家说的 主函数int main(void)中的return 0 中作用是交给操作系统的。你刚说的例如我不太理解是否可以说详细一点,另外 如果这个return不是按照我所说的操作的话 那么这个返回值的意义 好像就没有什么用处了吗?

不好意思 ,你的解答反而弄得我有点糊涂了。因为之前在我查询过是 人家说的 主函数int main(void)中的return 0 中作用是交给操作系统的。你刚说的例如我不太理解是否可以说详细一点,另外 如果这个return不是按照我所说的操作的话 那么这个返回值的意义 好像就没有什么用处了吗?

追答

是交出去给操作系统,但并不是操作系统自己去检查,而是还是由使用电脑的人自己去检查。

例如windows上的一个A程序,需要dotnet框架支持,因此,安装之前检查是否安装了dotnet框架,没有则调用安装,这个时候,就要检查dotnet框架安装程序是否执行正常。而dotnet安装程序成功返回0,失败返回其他各种值,表达因为什么原因失败。而A的安装程序只有检查到dotnet安装程序返回0表示成功,才继续执行安装,否则则提示dotnet安装失败,自己退出。

而如果你只是自己直接调用dotnet安装程序,则这个返回值对你来说没有意义了,你只需要操作安装程序就是了。而如果简单点的脚本例子,则dos/WINDOWS下的bat批处理,linux之类的脚本很多这些例子。例如:

@ECHO OFF  
XCOPY F:\test.bat D:\  
IF ERRORLEVEL 1 ECHO 文件拷贝失败  
IF ERRORLEVEL 0 ECHO 成功拷贝文件

XCOPY 成功返回0,失败返回1。BAT批处理检查返回值,提示文件复制成功还是失败。

再例如 linux 下:

rm testfile && echo "文件删除" || echo "文件删除失败"

根据 rm 的返回,提示文件删除成功还是失败。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-06-21
1.void main()
有一些书上的,都使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 “The definition void main( ) { /* … */ } is not and never has been C++, nor has it even been C.”
这可能是因为 在 C 和 C++ 中,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void) 。然而这是错误的!main 函数的返回值应该定义为 int 类型,C 和 C++ 标准中都是这样规定的。虽然在一些编译器中,void main() 可以通过编译,但并非所有编译器都支持 void main() ,因为标准中从来没有定义过 void main 。g++3.2 中如果 main 函数的返回值不是 int 类型,就根本通不过编译。而 gcc3.2 则会发出警告。所以,为了程序拥有很好的可移植性,一定要用 int main ()。
2.main()
那既然main函数只有一种返回值类型,那么是不是可以不写?规定:不明确标明返回值的,默认返回值为int,也就是说 main()等同于int main(),而不是等同于void main()。在C99中,标准要求编译器至少给 main() 这种用法来个警告,而在c98中这种写法是被允许的。但为了程序的规范性和可读性,还是应该明确的指出返回值的类型。
3.return 0语句 功能
在C++的程序中,如果你自己写了个子函数。那return的意思是告诉主函数,这个子函数的运行结果,那么同样的道理,main也是个函数,它运行了自然也是有结果的,这个结果通常是告诉操作系统,自身是正常运行结束了(值为0),还是发生了异常(这个值就有很多了)。告诉操作系统值是多少,目的是后台或者SHELL可以从操作系统中取得这个程序的运行结果,从而可以进行进一步操作,比如,你现在这个程序名叫A,是个清屏程序,那么我想在这个程序运行正常后在屏幕上输出运行了。这个输出是由另外一个B程序实现的,那么如果没有返回值,怎么知道这个程序运行正常还是不正常呢。上面的是main函数返回值最常用的作用。当然。其实main函数本身是可以调用这个返回值的,这个的作用就在于多线程的编程中,另外一个线程等待这个程序执行完毕,等待的就是这个MAIN函数的执行结果。
第2个回答  2014-02-12

首先main函数返回多少是不会影响输出的,因为当执行到return语句的时候,printf语句已经执行过了,没有后悔药的,因为main函数也是一个普通的函数。一个程序的执行大致过程如下:

int main(int argc, char* argv[])
{
    printf("hello\n");
    return 0;
}

void start()
{
    init(); // 一些准备工作,如打开标准输入,输出,错误等等
    int argc = ... // 命令行参数个数
    char* argv[] = ... // 各个命令行参数
    int ret = main(argc, argv);
    doclear(); // 一些清理工作,如atexit等等
    exit(ret);
}

这个隐含的start函数先做一些准备工作,然后执行main函数,然后做一些清理工作,最后调用exit结束执行。


这个返回值有什么用? 一般来说进程有父子关系一说,子进程的返回值(就是exit的参数)可以被父进程捕获,父进程可以根据约定的返回来判断子进程的执行状态,然后做其他事情。

你在shell或cmd下执行的程序都是shell或cmd的子进程,执行完命令后可以根据返回值来判断这个命令是否执行成功,便于自动化处理。

第3个回答  2014-02-12
打印语句是立即执行,所以理想的情况是先打印99,然后退出main函数,只不过,打印的数据立即会交给串口驱动然后才退出main函数,而串口驱动是有自己的缓存的,所以会有一定延迟。

执行赋值操作出错,系统会做出不同响应,这个要取决于具体的错误类型,比如访问空指针、除数为0都是严重错误而停止进程

函数返回值的意义是程序员定义的,函数外部根据这个定义来决定函数运行的情况,比如我可以让函数返回0来代表函数执行失败,也可以定义-10来代表执行失败。
第4个回答  2019-02-05
这个函数返回的是一个地址,不能作为左值
比如你在windows下编程,函数返回值存放在eax寄存器中
那么回到main函数的时候eax里存放的就是whw函数返回的一个地址的值,假设为0xffffffff
想象一下,0xffffffff
=
5是几个意思,就类似于表达式15
=
5
退一步讲whw返回的是一个int*类型,怎么能赋个5
就类似
int
*p
=
5;
也会出错
如果要编译不出错
可以改成这样
int*
whw(int*
a);
main()
{
int
p=12;
*(whw(&p))=5;
printf("*whw(&p)=%d\n",*(whw(&p)));
return
0;
}
int*
whw(int*
a)
{
return
a;
}
相似回答