#include<stdio.h>intmain(void){printf("hello, world!\n");}
我们以前说过(请参看文末的相关阅读),如果 main 函数最后没有返回语句,则 C 编译器会自动插入一个返回语句,以符合 main 函数返回整型值的语法要求。在实际编程中,我们应该自己明确写出返回语句,以便根据程序执行情况返回相应的值,以表明程序执行成功与否。所以,完整的最简 C 程序应该是这样:#include<stdio.h>intmain(void){printf("hello, world!\n");return0; // 0 means SUCCESS!}
上面代码中的 // 0 means success! 表示注释,用来对所注释的语句进行补充说明。C 中的注释分为两种:- 用双斜线(//)表示单行注释,从 // 开始到该行结束都属于注释内容。
- 用 /* 和 */ 符号对表示行内注释或多行注释。
C 编译器在对 C 源程序进行编译时,将删除注释并用一个空格替代。所以,程序中的注释对代码没有影响,注释只对人理解代码起补充说明的作用,当然,这只是对有效注释而言。譬如,上面代码中的注释说明返回 0 意味着程序执行成功,这就是一条有效注释。关于注释,以后随着内容的展开还会有更多说明。C 在 stdlib.h 头文件中定义了两个常量,用来表示程序执行情况:我们应该使用这两个常量来表示 main 函数的返回值。所以,上述程序可以修改如下:#include<stdio.h>#include<stdlib.h>intmain(void){printf("hello, world!\n");return EXIT_SUCCESS;}
对于这个小程序而言,这样写也就足够了。下面我们来看看如何在 shell 中捕捉 main 函数返回的整型值。echo 是 Windows CMD shell 命令,显示后面给出的内容。errorlevel 是 shell 变量,包含上一条命令执行的结果,在我们的例子中即 main 函数的返回值。%errorlevel% 是对 errorlevel 变量的引用,echo %errorlevel% 就是显示 errorlevel 中的值。正如我们所看到的,这个值是 0,正是 main 函数返回的值。我们可以让 main 函数返回别的值,来验证一下我们上面所说的内容:#include<stdio.h>intmain(void){printf("hello, world!\n");return15;}
这次是随便指定了一个值 15,我们来看看 errorlevel 变量中的值是不是 15:正如我们所预期的,errorlevel 的值确实是 15。关于 EXIT_SUCCESS 和 EXIT_FAILURE:在 stdlib.h 头文件中,这两个常量宏是这样定义的:// stdlib.h#define EXIT_SUCCESS 0#define EXIT_FAILURE 1
和我们已经认识的 #include 一样,#define 也是 C 的预处理器指令,作用是定义一个宏(macro)。所谓宏,就是在预处理过程中需要被替换的符号常量。下面的语句:// ...return EXIT_SUCCESS;// ...
在预处理过程中,EXIT_SUCCESS 宏将被 0 替换:既然这样,为什么我们还要费劲写成 return EXIT_SUCCESS;,直接写 return 0; 不就行了吗?理由如下:- 首先,用 EXIT_SUCCESS、EXIT_FAILURE 符号,比直接用 0 或 1,来得直观。EXIT_SUCCESS、EXIT_FAILURE 具有“自解释”功能,不需要再添加注释进行补充说明,而用 0 或其他数值,就不那么直观。
- 其次,在 C 的标准文本中,EXIT_SUCCESS 和 EXIT_FAILURE 都说明为由实现定义,这说明,不同的 C 的实现,这两个宏的定义有可能不同。使用这两个常量宏,可以最大程度地保持 C 程序的可移植性/跨平台性。