#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,一般的操作系统是否就不会对这个函数进行处理呢?
不好意思 ,你的解答反而弄得我有点糊涂了。因为之前在我查询过是 人家说的 主函数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 OFFXCOPY F:\test.bat D:\
IF ERRORLEVEL 1 ECHO 文件拷贝失败
IF ERRORLEVEL 0 ECHO 成功拷贝文件
XCOPY 成功返回0,失败返回1。BAT批处理检查返回值,提示文件复制成功还是失败。
再例如 linux 下:
rm testfile && echo "文件删除" || echo "文件删除失败"根据 rm 的返回,提示文件删除成功还是失败。
有一些书上的,都使用了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函数的执行结果。
首先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的子进程,执行完命令后可以根据返回值来判断这个命令是否执行成功,便于自动化处理。
执行赋值操作出错,系统会做出不同响应,这个要取决于具体的错误类型,比如访问空指针、除数为0都是严重错误而停止进程
函数返回值的意义是程序员定义的,函数外部根据这个定义来决定函数运行的情况,比如我可以让函数返回0来代表函数执行失败,也可以定义-10来代表执行失败。
比如你在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;
}