代码编写完成后有个返回给系统的值,为什么?


比如c语言在最后编写阶段会有个return 0(标准情况),意味着有个返回值返回给系统,我想的是在执行return 之前就已经得出结果(中间不管有复杂),既然有了个结果,那就应该输出结果,那么为何还需要要个返回值给系统?那么为了执行完毕后停止dos系统运行, 还是可能有别的原因?希望详细解释.

编译原理 编译器

29dk89 9 years, 11 months ago

记得老师好像说过是,返回个0代表程序执行成功了,没有的话就是失败了,做判断用的。

O啊o呜O answered 9 years, 11 months ago

简单来说,所有程序都是某个父进程的子进程,当然老大进程是systemd.
而有的时候子进程需要将执行程序的状态报告给父进程,就是通过return值来实现的.比如return 0;代表正常,return -1代表遇到某错误,return -2代表另一个错误,等等.
而大型程序的错误判断可能有几百个,这些错误随时可能发生,程序自己不知道何时会出岔子,这时候就需要通过返回值来告诉父进程遇到什么错误了,让父进程来依据返回值进行相应的处理,当然也让用户知道了return value,可以查找发生错误的类型

油库里九号 answered 9 years, 11 months ago

你说的这是C语言吧,其实有返回值是 C99 的规范吧

在C99之前,c语言main的原型是 void main(), 也就是没人care返回值什么,你操作就得了。 C语言为了使得函数调用返回值和main的一致,规定了main的返回值是一个int类型。对于你来说,你期望它将输出显示到控制台或是屏幕上就OK了,但对于操作系统,有时需要了解程序是否正常运行,因此需要获知返回值。

PS: 在Linux上查看上一个进程退出时的返回值是 echo $?
你会发现不是所有的程序都返回0.

此外,也有些语言没有规定程序的返回值,或者说是声明的时候,声明为void即可,不过楼主可以略过了。。。。

补充下场景,楼主是否可以体会下?


 int main(){
   try {
      foo();
      return 0;
   }
   catch (... )
   {
      return -1;
   }
}

这里用了try...catch来表示异常,正常情况下函数是返回0的,异常为-1. 假设这个进程专门用来serve user的request,另外有一个监视器进程专门检查所有的进程,规则是进程返回0就是正常结束,否则是异常,比如某些资源不可用导致程序无法正常执行等。这种情况下monitor进程是不是可以根据程序的返回值来判断进程是否正常结束?

当然,在实现中,很少人用这种方法来判断一个请求是否完成或进程是否正常结束,所以最简单直观的理解就是把这个理解为一个C99的规范好了。

我已经out了 answered 9 years, 11 months ago

Your Answer