问题描述
- 关于c语言的int main()的问题
-
在int main()中有int,程序最后就要加return 0;书上说函数类型可以省略,此时函数的默认数据类型为int型,但为何在只写main()这样的程序时,后面就可以不加return 0?同时还想问一下return和exit直接有什么区别呢?
解决方案
问题一回答:楼主可以搜索下,在任何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作为返回.
解决方案二:
要看什么编译器,一些编译器不检查代码中是否返回,一些编译器检查。
对于前者,虽然可以编译,但是返回结果是未知的。这其实很糟糕。如果一个函数返回的是一个指针,而你的函数有很多分支,偏偏某个分支忘记写返回值了,就可能丢出野指针。而且这种错误特别难查。
看下面代码:
int * foo(int x)
{
for (int i = 0; i < x; i++)
{
if (i == x - 1) return xxx;
}
}
这代码看上去会返回一个值,但是如果x <0,循环不执行,那么根本不会调用return,如果编译器没有检查,返回什么就不知道了。
所以允许编译并不是好事。
解决方案三:
第一个问题:因为C的编译器规则比较宽松,并不检查任何函数(包括main函数)是否返回了值。
第二个问题:return是用来对一个函数进行返回,它是基本语句。而exit(0)本身是一个带有一个参数的函数,用来表示这个程序已经结束。
解决方案四:
从我学C语言的角度来看:
首先,写int 面()时,因为已经写了int,所以必须有一个int类型的返回值,即return 0,当然你也可以返回别的int类型的值,其次,省略的时候,可能是因为c
语言在构造运行这个程序的时候有一些规则,也就是顺序,或者说这可能是编写人员在开始时设定的规则,也就是默认是这样的,你只要知道就好。
return是返回一个值给这个函数,结束这个函数,而exit是直接结束这个程序。
学习c语言,最重要的需要知道构造函数,析构函数,继承等等一些的调用顺序,等等,多了解内部运行机制是最重要的。加油吧
解决方案五:
如果函数前没有声明返回类型,在 C 语言里默认是返回 int 的。想不写返回可以使用 void main()。
return 和 exit 对于返回类型是一样的。