`

C99标准中的 main()函数

阅读更多
一、main()函数的形式
     在最新的 C99 标准中,只有以下两种定义方式是正确的:
        int main( void )--无参数形式
         {
         ...
         return 0;
         }
       
         int main( int argc, char *argv[] )--带参数形式
         {
         ...
         return 0;
         }

     int指明了main()函数的返回类型,函数名后面的圆括号一般包含传递给函数的信息。void表示没有给函数传递参数。关于带参数的形式,我们等会讨论。
   
     浏览老版本的C代码,将会发现程序常常以
   
    main()

     这种形式开始。C90标准允许这种形式,但是C99标准不允许。因此即使你当前的编译器允许,也不要这么写。
   
     你还可能看到过另一种形式:

    void main()
   
     有些编译器允许这种形式,但是还没有任何标准考虑接受它。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地表示:void main( ) 的定义从来就不存在于 C++ 或者 C 。所以,编译器不必接受这种形式,并且很多编译器也不允许这么写。
   
     坚持使用标准的意义在于:当你把程序从一个编译器移到另一个编译器时,照样能正常运行。


二、main()函数的返回值

     从前面我们知道main()函数的返回值类型是int型的,而程序最后的 return 0; 正与之遥相呼应,0就是main()函数的返回值。那么这个0返回到那里呢?返回给操作系统,表示程序正常退出。因为return语句通常写在程序的最后,不管返回什么值,只要到达这一步,说明程序已经运行完毕。而return的作用不仅在于返回一个值,还在于结束函数。
     现在我们来做一个小试验(注意:本人的系统是Windows XP, 编译环境是TC)来观察main()函数的返回值。编写如下代码并编译运行:

   //a.c   
     #include "stdio.h"
     int main(void)
     {
         printf("I love you.");
   
         return 0;
     }

     将这个文件保存为a.c,编译运行后会生成一个a.exe文件。现在打开命令提示符,在命令行里运行刚才编译好的可执行文件,然后输入   echo %ERRORLEVEL% ,回车,就可以看到程序返回 一个0 。如果把 return 0; 改为 return 99; ,那么很显然,再次执行上述步骤以后你可以看到程序返回99。要是你这样写 return 99.99; 那还是返回99,因为99.99被传给操作系统之前,被强制类型转换成整数类型了。
     现在,我们把a.c改回原来的代码,然后再编写另一个程序b.c:

    //b.c
     #include "stdio.h"
     int main(void)
     {
         printf("\nI'm too.");
   
         return 0;
     }

     编译运行后打开命令提示符,在命令行里输入a&&b 回车,这样你就可以看到《人鬼情未了》里面经典的爱情对白:
   
    I love you.
    I'm too.

     && 的含义是:如果 && 前面的程序正常退出,则继续执行 && 后面的程序,否则不执行。所以,要是把a.c里面的 return 0; 删除或者改为 return 99; ,那么你只能看到 I love you. 。也就是说,程序b.c就不执行了。现在,大家该明白 return 0; 的作用了吧。
   

三、main()函数的参数

     C编译器允许main()函数没有参数,或者有两个参数(有些实现允许更多的参数,但这只是对标准的扩展)。这两个参数,一个是int类型,一个是字符串类型。第一个参数是命令行中的字符串数。按照惯例(但不是必须的),这个int参数被称为argc(argument count)。大家或许现在才明白这个形参为什么要取这么个奇怪的名字吧,呵呵!至于英文的意思,自己查字典吧。第二个参数是一个指向字符串的指针数组。命令行中的每个字符串被存储到内存中,并且分配一个指针指向它。按照惯例,这个指针数组被称为argv(argument value)。系统使用空格把各个字符串格开。一般情况下,把程序本身的名字赋值给argv[0],接着,把最后的第一个字符串赋给argv[1],等等。
     现在我们来看一个例子:

    //c.c  
     #include "stdio.h"
     int main(int argc, char *argv[])
     {
         int count;
   
         printf("The command line has %d arguments: \n",argc-1);
         for(count=1;count<argc;count++)
             printf("%d: %s\n",count,argv[count]);
     
         return 0;
     }
     编译运行,在命令行输入c I love you 回车,下面是从命令行运行该程序的结果:

    The command line has 3 arguments:
    1:I
    2:love
    3:you

     从本例可以看出,程序从命令行中接受到4个字符串(包括程序名),并将它们存放在字符串数组中,其对应关系:
    argv[0]   ------>     c(程序名)
    argv[1]   ------>     I
    argv[2]   ------>     love
    argv[3]   ------>     you
     至于argc的值,也即是参数的个数,程序在运行时会自动统计,不必我们操心。
     这个例子中,每个字符串都时一个单词(字母),那既然是字符串,要把一句话当作参数赋给程序该怎么办?你可以在命令行里这样输入 c   "I love you."   "I'm too."。程序运行结果:

    The command line has 2 arguments:
    1:I love you.
    2:I'm too.

     其对应关系:
    argv[0]   ------>     c(程序名)
    argv[1]   ------>     I love you.
    argv[2]   ------>     I'm too.

     要注意的是,你在命令行的输入都将作为字符串形式存储于内存中。也就是说,如果你输入一个数字,那么要输出这个数字,你应该用%s格式而非%d或者其他。
     再来看一个例子:
    //d.c
     #include "stdio.h"
     int main(int argc, char *argv[])
     {
         FILE *fp;
   
         fp=fopen(argv[1],"w");
         fputs("I love you.",fp);
         fclose(fp);
   
         return 0;
     }
     编译运行,打开命令行并输入d love.txt 回车。这样,打开d.c文件所在的目录,你会发现多了一个名为 love.txt 的文件,打开后里面的内容正是世界上说的最多的那句话。


类别:linux&ubuntu||添加到搜藏 |分享到i贴吧|浏览(293)|评论 (1) 上一篇:Hello world 十种写法    下一篇:禁止使用U盘 的四种方法 最近读者:  
分享到:
评论

相关推荐

    main函数的标准定义

    关于main函数的定义标准,C99标准规定main函数是一个有返回值的函数,返回值类型必须为int。main函数的标准定义有两种形式:第一种形式为int main (void){……return 0;》,第二种形式为int main (int argc, char *...

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

    ### C语言面试题:Main函数详解 #### 题目背景 在C语言编程中,`main`函数是每个程序的入口点。正确理解和编写`main`函数对于编写高质量、可移植性强的程序至关重要。本篇文章将深入探讨C语言中的`main`函数,包括...

    ANSI C99标准文档

    ### ANSI C99标准文档详解 #### 一、概述 **ANSI C99标准文档**,即ISO/IEC 9899:1999标准文档,是C99编程语言标准的官方规范。该文档由国际标准化组织(ISO)与国际电工委员会(IEC)联合发布,并被美国国家标准...

    关于C语言中main()函数详解

    在最新的C99标准中,main()函数只有两种定义方式是正确的: 1. int main(void) /* 无参数形式 */ 2. int main(int argc, char *argv[]) /* 带参数形式 */ 其中,int指明了main()函数的返回类型,函数名后面的圆...

    C99完整标准文档(ISO/IEC 9899:1999)

    《C99完整标准文档(ISO/IEC 9899:1999)》作为C语言的标准规范,是每一个C程序员深入理解和掌握C99版本编程语言的基石。...无论是初学者还是经验丰富的开发者,都能从C99标准文档中获得宝贵的知识和启示。

    C语言中return的作用.pdf

    此外,C++中也可以使用return语句在main函数中提前结束程序,并返回一个值。 C语言的历史中对于main函数的定义有所不同。例如,在C89标准中并没有规定必须包含命令行参数的main函数形式。到了C99标准,才明确规定了...

    void main还是int main.docx

    在C语言标准中,main函数的定义是int main(void)或int main(int argc, char *argv[]),其中argc表示命令行参数的个数,argv是命令行参数的数组。这个定义来自ISO/IEC 9899:1999 (E) Programming languages — C 5.1....

    关于C语言中return的一些总结

    在 main 函数中,return 语句的返回值将被传递给程序的激活者(如操作系统),以便通知程序的执行结果。 在 C 语言中,return 语句和 main 函数的定义都是非常重要的。正确地使用 return 语句和 main 函数可以提高...

    C、C++语言误区之:voidmain().pdf

    【C和C++语言中的main()函数规范】 在C和C++编程中,`main()`函数是...同时,尽管C99和C++标准允许在`main()`函数中省略`return 0;`,为了代码的可读性和一致性,最好还是显式包含`return 0;`语句来表明程序正常结束。

    C语言函数速查 C语言函数大全 C函数

    内联函数是C++引入的概念,但在C99标准中也被C语言采纳。内联函数旨在通过代码展开来提高效率,但并非所有编译器都会执行内联。 12. 变参函数(Variable Argument List): 使用`...`作为参数列表的一部分,可以...

    C语言之Main函数返回值问题分析

    - 如果`main`函数没有显式返回值,C99标准规定编译器会自动在生成的可执行文件中添加`return 0;`,但并非所有编译器(如VC6)都会这样做。因此,为保持良好的编程习惯,应在`main`函数末尾添加`return`语句。 2. *...

    hanning.rar_c窗函数_hanning_hanning c语言_窗函数 C++_窗函数c

    这段代码首先定义了一个`hanning_window`函数,用于计算Hanning窗,然后在`main`函数中调用该函数并打印结果。这里的`M_PI`是C99标准库`&lt;math.h&gt;`中的常量,代表π。 C++作为C语言的超集,可以方便地调用C语言编写...

    第6章 函数-1-2函数原型1

    这个原型使得在main函数中调用Average函数时,编译器能够验证传递给Average的参数类型是否正确。 函数定义则包含了函数的所有实现细节,包括函数体,即函数执行的具体步骤。函数定义是函数实际执行的地方,编译器会...

    C语言中的return

    总的来说,`return`语句在C语言中是不可或缺的,它使得函数能够返回值给调用者,并且在`main`函数中,返回值还可以用来传达程序的执行结果。正确理解和使用`return`以及`main`函数的定义,是编写可靠、可移植的C语言...

    C语言中级-9再论函数

    内联函数是C++引入的概念,但在C99标准中,C语言也提供了`inline`关键字,用于请求编译器尝试展开函数,以提高效率。但这不是强制性的,编译器会根据情况决定是否进行内联。 12. 指针与数组: 在处理数组时,数组名...

    C语言函数及相关知识

    为了提高效率,C99引入了内联函数。内联函数的调用过程类似于宏展开,避免了函数调用的开销。但编译器并不保证一定会内联,是否内联取决于编译器优化策略。 通过学习以上知识点,初学者能更好地理解C语言中的函数...

    C语言中return的作用[文].pdf

    在C89标准中,`main()`是可以接受的,但随着C99标准的引入,推荐的`main`函数定义为: 1. `int main(void)` - 当不需要从命令行接收参数时使用。 2. `int main(int argc, char *argv[])` - 当需要处理命令行参数时...

    408函数-递归调用-全局变量和局部变量

    当`main`函数中调用了其他函数时,执行流程会转移到被调用的函数上,然后在函数执行完毕后返回`main`函数,最终程序在`main`函数中结束运行。 4. **函数的独立性**:所有的函数在定义时是相互独立的,函数之间不能...

Global site tag (gtag.js) - Google Analytics