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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言中int main()和int main(void)区别
1.K&R书上main函数定义写成main(){...} 形式,不写返回值类型也不写参数列表,这是Old Style C的风格。Old Style C规定不写返回值类型就表示返回int型,不写参数列表 就表示参数类型和个数没有明确指出。这种宽松的规定会导致很多复杂的Bug产生,不幸的是现在的C标准为了兼容旧的代码仍然保留了这种语法。  2. 其实系统在调用main函数时是传参数的,所以m
一道C语言和static有关的题
有以下程序:#include &amp;lt;stdio.h&amp;gt;fun(int x, int y){static int m=0, i=2;i+=m+1; m=i+x+y; return m;}main(){int j=1, m=1, k;k=fun(j,m); printf(&quot;%d,&quot;,k);k=fun(j,m); printf(&quot;%d\n&quot;,k);}执行后的输出结果是( A )。A) 5, 11B...
C语言main(int argc,char *argv)
Main函数的参数我们经常用的main函数都是不带参数 的。因此main 后的括号都是空括号。实际 上,main函数可以带参数,这个参数可以 认为是main函数的形式参数。     C语言规定main函数的参数只能有两个, 习惯上这两个参数写为argc和argv。所以main函数的函数头可写为:           main (argc,argv)     C语言还规定argc(第一个形参)
C语言,为什么要用int main不用void吗?
1.main函数的定义,很多例子程序将main的类型定义为void,但是照谭浩强的讲法,C99标准建议的是将main指定成int类型,正常运行,return 0; 有些编译系统会自动加上这些东西。同时可以通过操作指令根据return判断是否正常运行。      突然间脑筋短路,在ctrl+r窗口狂试exe,运行超快,根本就看不到,突然间想起了dos,键入cmd,只需要运行完exe后键入e
面试题:结构体
1、结构体中的冒号作用 下列程序输出结果多少? #include #include typedef struct{ int a:2; int b:2; int c:1; }test; int main(){ test t; t.a=1; t.b=3; t.c=1; printf("%d\n%d\n%d\n",t.a,t.b,t.c); return 0; } 结
C语言中int main与void main的区别
<br />正确而且标准的方式应该是int main()或者int main(int argc, char* argv[])<br /> <br />原因是:main函数的返回值是用来表示程序的退出状态的,return 0表示无错误,其他的返回值根据系统不同可能代表不同的类型,如果不返回可能会无法检测到错误。<br /> <br />另外一个原因是:如果返回值是返回到栈上的,则程序未返回值的情况下,程序的调用者会从栈上误pop一个值认为是程序的返回值,这样的话就会造成下面的操作错误,因为多pop了一个值。<
对于C语言中int main(int argc,char **argv)的理解
前者可接受 命令行参数,argc表示参数个数, argv[]是参数数组,其中第0个参数是程序本身的名称(包含路径)。   argv[]是一个字符数组. argv[0]:指向程序的全路径名 argv[1]:指向在DOS命令行中执行程序名后的第一个字符串。 argv[2]:指向第二个字符串。 说一下main(int argc,char *argv[])函数的两个形参,第一个int
c语言main函数的argc和argv[]参数问题
第一个参数argc是int型的,用来存放命令行参数的个数,实际上argc所存放的数值比命令行参数的个数多1,即将命令字(可执行文件名)也计算在内。  第二个参数argv是一个一维的一级指针数组,它是用来存放命令行中各个参数和命令字的字符串的,并且规定:  argv[0]存放命令字  argv[1]存放命令行中第一个参数  argv[2]存放命令行中第二个参数  这里,argc的值和arg
C语言主函数返回值问题:return type of 'main' is not 'int' [-Wmain]
当c语言main函数,返回值是void时,有提醒:return type of 'main' is not 'int' [-Wmain]
辨析int main()、int main(void)、void main(void)、main()和main(void)、int main() 和 void main()
//--------------------------------------------------标准的main函数格式为:int main(int argc, char *argv[]); /*即返回值为整型,带两个参数,argc为命令行参数的个数,argv为指针数组,                                                  前argc个指针为参数...