`
zhengdl126
  • 浏览: 2538482 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

C语言main()函数详解

    博客分类:
  • C
 
阅读更多

C的设计原则是把函数作为程序的构成模块。main()函数称之为主函数,一个C程序总是从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("
I’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:
", argc - 1);
    for(count = 1; count < argc ; count++)
        printf("%d: %s
", 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;//FILE 是变量类型,实际上是C语言定义的标准数据结构,用于文件。 FILE *fp 是声明,声明fp是指针,用来指向FILE类型的对象。
    fp = fopen(argv[1], "w");
    fputs("I love you.", fp);
    fclose(fp);
    return 0;
}
编译运行,打开命令行并输入d love.txt 回车。这样,打开d.c文件所在的目录,你会发现多了一个名为 love.txt 的文件,打开后里面的内容正是世界上说的最多的那句话。

当然,你可能会说我不需要使用命令行参数就可以做到这些。是的,你当然可以。使用命令行参数的理由或许就是练习命令行用法,以备以后需要编写基于命令行的程序。还有一个好处是,不需要C环境就可以运行已经编译好的程序。比如,你把上面那个程序编译后生成的d.exe发给你的女朋友,再告诉她怎么运行,这样,你的女朋友可以用另一种方式体会到你对她的浓情蜜意。

分享到:
评论

相关推荐

    C语言time函数详解

    ### C语言time函数详解 在C语言编程中,时间处理是一项基本且重要的功能。无论是进行日期计算、定时任务还是性能测试等场景,都需要对时间有深入的理解和掌握。本文将详细解析C语言中的`time`函数及其相关概念,...

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

    关于C语言中main()函数详解 一、main()函数的形式 在最新的C99标准中,main()函数只有两种定义方式是正确的: 1. int main(void) /* 无参数形式 */ 2. int main(int argc, char *argv[]) /* 带参数形式 */ 其中...

    C语言函数库详解(收藏版).docx

    ### C语言函数库详解 #### 第一章:C标准库概览 本章节将详细介绍C语言标准库中的各个部分,包括但不限于诊断、字符类别测试、错误处理等方面的基础知识及其应用场景。 ### 1. `&lt;assert.h&gt;`:诊断 - **定义**:`...

    C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解 C语言main函数是C语言程序的入口点,它是程序的开始执行点。在C语言中,main函数有三种形式:无参数形式、有两个参数形式和有三个参数形式。下面我们将对这三种形式进行详细的解释...

    C语言图像函数库详解

    在C语言图像函数库中,一系列的图形处理函数被封装以提供对图像的创建、编辑与显示能力。本文将深入解析部分关键函数的功能与用法,帮助开发者更好地掌握C语言图像函数库的核心技术。 ### 1. putpixel()函数:绘制...

    C语言 标准函数库 详解

    ### C语言标准函数库详解 #### 一、概述 C语言是一种广泛使用的编程语言,具有高效性和灵活性。为了方便开发者编写高效且稳定的程序,C语言提供了丰富的标准库支持。本篇将详细介绍C语言中的标准函数库,包括各个...

    C语言函数库详解

    ### C语言函数库详解 #### 第一章:C标准库概览 本章节将详细介绍C语言中的标准库函数,这是所有C程序员都应该了解的核心部分。这些库提供了丰富的功能,覆盖了从基本的数据类型操作到复杂的数学计算等多个领域。 ...

    C语言函数参数的传递详解

    ### C语言函数参数传递详解 #### 一、引言 在C语言中,函数是非常重要的概念,它允许我们将代码组织成可重复使用的模块。而函数参数则是传递数据给函数的关键方式之一。根据传递数据的不同方式,可以将参数传递...

    C语言函数库!

    C语言提供了一系列的函数库来帮助开发者高效地处理字符串。这些函数库通常被包含在`&lt;string.h&gt;`和`&lt;stdlib.h&gt;`等头文件中,它们包含了从简单的字符串复制、比较到复杂的字符串解析和转换等功能。 ### C语言字符串...

    [C语言开发技术详解].戴建华.扫描版.pdf

    从给定的文件信息来看,虽然标题提及的是“C语言开发技术详解”,但实际上描述和标签都指向了“C++经典书籍”。这可能意味着文件实际内容是关于C++编程的深入探讨,而非C语言。不过,鉴于标题的误导,我们首先简要...

    C语言参数个数可变函数详解

    尽管`main()`函数的`argc`和`argv`参数看起来类似可变参数,但它们实际上是固定的,因为`argc`告诉程序有多少个命令行参数,`argv`则是一个包含这些参数的字符串数组。 在C语言中实现可变参数函数的关键在于`stdarg...

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

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

    C语言练习题(带详解答案)

    在C语言程序中,main函数是入口点,程序的执行从main函数开始。 3. C语言程序总是从main函数开始执行。在C语言程序中,main函数是入口点,程序的执行从main函数开始。 4. C语言的工作过程是编辑、编译、连接、运行...

    c语言的函数要如何调用

    C语言函数调用详解 C语言中的函数调用是通过函数名和参数列表来实现的。函数调用是C语言中的一种基本机制,允许我们将一段代码分割成小块,以便于代码的重用和维护。下面我们将详细解释C语言函数调用的机制和步骤。...

    C语言回调函数详解及实例.docx

    C语言回调函数详解及实例 在计算机编程中,回调函数(Callback Function)是一种特殊的函数调用机制,它允许一个函数在执行过程中,调用另一个函数,并将控制权交给该函数。在本文中,我们将详细介绍C语言中的回调...

    c语言图形函数简介教你怎样应用c函数做图

    ### C语言图形函数详解:如何运用C函数绘图 在探讨C语言图形函数的应用之前,我们首先需要了解C语言在图形界面编程领域的地位。虽然C语言最初被设计为一种系统级编程语言,主要用于操作系统和底层硬件控制,但通过...

Global site tag (gtag.js) - Google Analytics