2 weixin 33939144 weixin_33939144 于 2016.02.06 13:53 提问

关于c语言的int main()的问题

在int main()中有int,程序最后就要加return 0;书上说函数类型可以省略,此时函数的默认数据类型为int型,但为何在只写main()这样的程序时,后面就可以不加return 0?同时还想问一下return和exit直接有什么区别呢?

5个回答

u013484370
u013484370   2016.02.07 09:47
已采纳

问题一回答:楼主可以搜索下,在任何C语言中从来没有哪一种标准是鼓励没有返回值的函数的,也就是void main(),甚至一些国外程序大神是严厉抨击这种void返回类型。 所以在gcc 编译下,无论哪一种标准都是c99,ansi,要么产生
错误,要么产生警告。

//filename a.c
void main(){
}

gcc a.c 的输出信息为a.c:7:1:

warning: return type of 'main' is not 'int' [-Wmain-return-type]
void main(int argc, const char *argv[])

gcc -ansi a.c`

a.c:7:1: error: 'main' must return 'int'
void main(int argc, const char *argv[])

楼主可以看到在ansi标准中对于void返回值直接返回了错误,连编译都通不过。

至于楼主的疑问应该是来源于微软的vc++,该ide中集成的编译器,已经不是原声的符合标准的c编译器,微软自己做了很多改动,这个你可以网上搜索下。

问题二:至于exit 则是用来标识应用程序执行状态的,如果直接return 只能说程序执行成功或者不成功,程序中的分支判断则无线显示,exit退出吗只是用来标识
应用程序到底是以何种状态的,因为应用程序都是要被操作系统加载的,操作系统通过返回码来了解进程的执行细节,这也就是前面的为什么不鼓励用void作为返回.

weixin_33939144
weixin_33939144 回复gonghaiming110: 不好意思还有些问题,就是您所说return不同的东西(0,1,2,3等)代表的含义不同,那这个表示不同含义是自己设定出的还是系统自带的呢?就比如如果仅有一个mian函数,在其最底下写上return 0或者1,2,3等,都能够使程序完整运行,那这几种写法返回给系统的含义也不同?还想问一下您所说的最后一句话:“前提是应用”后面还有什么内容么?”
接近 2 年之前 回复
u013484370
u013484370 回复weixin_33939144: 应用程序被操作系统加载后,比如说如果return 0就表示成功,return 1就表示失败,也可以return 3,return 4,表示某种情况,至于为什么用exit,是因为如果你的main函数还有其他嵌套函数,你又需要立刻返回应用程序执行状态,比如说执行到哪个语句,你就需要用exit,return只是返回当前函数不能终止当前程序。简单来说就是,你如果在main函数中exit和return是没有区别,但是在main函数的函数中,要终止就得用exit。前提是应用程序的入口函数就是main
接近 2 年之前 回复
weixin_33939144
weixin_33939144 回复gonghaiming110: 那请问return和exit都是函数么?然后我没有太理解exit作程序的执行状态是什么意思呢?我理解的exit的作用就是结束整个程序,请问这么理解是否正确或是否全面呢?
接近 2 年之前 回复
caozhy
caozhy 赞,很详细的回答
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.06 20:29
 要看什么编译器,一些编译器不检查代码中是否返回,一些编译器检查。
对于前者,虽然可以编译,但是返回结果是未知的。这其实很糟糕。如果一个函数返回的是一个指针,而你的函数有很多分支,偏偏某个分支忘记写返回值了,就可能丢出野指针。而且这种错误特别难查。

看下面代码:
int * foo(int x)
{
    for (int i = 0; i < x; i++)
        {
            if (i == x - 1) return xxx;
        }
}

这代码看上去会返回一个值,但是如果x <0,循环不执行,那么根本不会调用return,如果编译器没有检查,返回什么就不知道了。
所以允许编译并不是好事。
leilba
leilba 赞成,以前被这个坑过很多次了
接近 2 年之前 回复
wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.06 16:11

第一个问题:因为C的编译器规则比较宽松,并不检查任何函数(包括main函数)是否返回了值。
第二个问题:return是用来对一个函数进行返回,它是基本语句。而exit(0)本身是一个带有一个参数的函数,用来表示这个程序已经结束。

qq_28410301
qq_28410301   2016.02.06 14:19

从我学C语言的角度来看:
首先,写int 面()时,因为已经写了int,所以必须有一个int类型的返回值,即return 0,当然你也可以返回别的int类型的值,其次,省略的时候,可能是因为c
语言在构造运行这个程序的时候有一些规则,也就是顺序,或者说这可能是编写人员在开始时设定的规则,也就是默认是这样的,你只要知道就好。
return是返回一个值给这个函数,结束这个函数,而exit是直接结束这个程序。
学习c语言,最重要的需要知道构造函数,析构函数,继承等等一些的调用顺序,等等,多了解内部运行机制是最重要的。加油吧

weixin_33939144
weixin_33939144 回复NoicFank: 那请问在使用exit的时候其后面是同样写0或者其他数都一样么?还想问一下return自身算不算一个函数?
接近 2 年之前 回复
91program
91program   Ds   Rxr 2016.02.06 18:12

如果函数前没有声明返回类型,在 C 语言里默认是返回 int 的。想不写返回可以使用 void main()。
return 和 exit 对于返回类型是一样的。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!