c语言面试题----main函数

版权声明:本文转载于公众号TeachPlus---C语言面试题---main函数


1、下面的代码能编译通过吗?如果能,它有什么潜在的问题吗?

本题解析

在绝大多数的编译器中,该段代码都是可以编译通过的,但是可能会报出警告。main()的返回类型应该是“int”而不是“void”。因为“int”返回类型会让程序返回状态值。这点非常重要,特别当程序是作为依赖于程序成功运行的脚本的 一部分运行时。

相关知识点

我们可能在许多地方都会看到这样的写法,或者其他多种多样的写法,这让初学者,甚至 一部分老手都会搞不明白main函数到底应该怎么去写。下面就是几种常 见的main函数的写法:

1.

int main()

    //do something

    return 0;

}

这是大家最常见的写法,那么这种写法好不好呢?

这种写法会产生歧义,函数main是有参数,还是没有参数。

你可能觉得很奇怪,它明明是没有参数的,但编译器 可不这么认为。

不同编译器 可能有不同解释。原因在于要与旧式代码风格的兼容。如下面的代码:

int fun()

int main()

{

    //do somethings

    return  0;

}

int fun(int a,int b)

{

    //do somethings

}


int main()

{

    //do somethings

    return ;

}

int fun(int a,int b)

{

    //do somethings

}

这段代码编译完全没有问题,可是fun函数明明是有参数的.

这种写法,编译器只会记住函数的返回类型,并不会检查函数的参数个数和类型是否匹配。你写了了这么多,编译器就只记住intfun() ;

所以,只能通过这种形式main( void ),表明main函数没有参数

2.

void main()

{

    //do somethings

}

这种写法的流传也非常广泛,因为许多教科书里就是这么写的, 而且绝大部分编译器 都能够正常编译。

虽然在 一些编译器中,voidmain可以通过编译(如vc6)。

并且编译器 对于你写的voidmain,在实际编译的时候还是默认返回一个int.

有些编译器允许这种形式,但是还没有任何标准考虑接受它。

C++之 父Bjarne Stroustrup在他的主 页上的FAQ中明确地表示:

voidmain()的定义从来就不存在于C++或者C。

所以,编译器不必接受这种形式,并且很多编译器也不允许这么写。

我们要考虑程序的可扩展性,养成 一个良好的习惯。

3.

main()

{

    //do somethings

}

这种方法比较罕见,但是现在仍然有很多编译器支持这种写法。

这种写法往往存在于非常老的c语 言版本中。

C90标准允许这种形式,但是C99标准不允许。因此即使你当前的编译器允许,也不要这么写.

正本清源

其实在C99标准中,只有以下两种定义 方式是正确的:

int main(void) /*无参数形式*/

{

    //do somethings

    return 0;

}

int main(int argc, char*argv[]) /*带参数形势*/

{

    //do somethings

    return 0;

}

int指明了了main()函数的返回类型,函数名后面的圆括号 一般包含传递给函数的信息。void表示没

有给函数传递参数。

main函数可以不带参数,也可以带参数,这个参数可以认为是main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为:

main (argc,argv)

C语言还规定argc(第 一个形参)必须是整型变量,argv(第 二个形参)必须是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为:

main (int argc,char *argv[])

由于main函数不能被其它函数调用,因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main函数的形参呢?实际上,main函数的参数值是从操作系统命令 行上获得的。当我们要运行 一个可执行文件时,在命令提示符下键 入文件名,再输入实际参数即可把这些实参传送到main的形参中去。

Linux命令提示符下的 一般形式为:

ubuntu@ubuntu:~$./可执 行行 文件名 参数1参数2……;

但是应该特别注意的是,main的两个形参和命令行中的参数在位置上不是 一 一对应的。因

为,main的形参只有二个, 而命令行中的参数个数原则上未加限制。argc参数表示了了命令行中参

数的个数(注意: 文件名本身也算 一个参数),argc的值是在输入命令行时由系统按实际参数的个

数 自动赋予的。

例如有命令 行行为:

ubuntu@ubuntu:~$./a.out   BASIC  foxpro  FORTRAN

由于文件名a.out本身也算 一个参数,所以共有4个参数,因此argc取得的值为4。argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理理)的首地址。 指针数组的长度

即为参数个数。数组元素初值由系统自动赋予。其表示如下所示:

int main(int argc,char *argv[])

{

    int i = 0;

    for(i = 1 ; i< argc; i++)

    {

        printf("%s\n",argv[i]);

    }

    return 0;

}

本例是显示命令行中输入的参数。如果上例的可执行文件名为a.out,因此输入的命令行为:

ubuntu@ubuntu:~$./a.outBASIC foxpro FORTRAN

则运 行行结果为:

BASIC

foxpro

FORTRAN

该行共有4个参数,执行main时,argc的初值即为4。argv的4个元素分为4个字符串的首地址。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,422评论 3 44
  • 1、c语言的函数有以下特点: (1)才源程序由函数组成,一个主函数main()+若干其他函数 C程序中的函数类似文...
    滕王阁序阅读 1,329评论 0 6
  • C语言函数(一) 谨记 短暂的人生中,注定有很多人陪伴着你度过,陪你一起欢呼,陪你一起伤心流泪,陪你一起走过一条又...
    长风留言阅读 2,236评论 1 7
  • 1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧...
    金巴多阅读 1,721评论 0 9
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470