我们的pun.c程序仍然缺乏某些重要内容:文档说明。每一个程序都应该包含识别信息,即程序名、编写日期、作者、程序的用途以及其他相关信息。C语言把这类信息放在
注释
(comment)中。符号
/*
标记注释的开始,符号
*/
标记注释的结束。例如:
/* This is a comment */
注释几乎可以出现在程序的任何位置上。它既可以独占一行,也可以和其他程序文本出现在同一行中。下面展示的程序pun.c就把注释加在了程序开始的地方:
/* Name: pun.c */
/* Purpose: Prints a bad pun. */
/* Author: K. N. King */
#include <stdio.h>
int main(void)
{
printf("To C, or not to C: that is the question.\n");
return 0;
}
注释还可以占用多行。如果遇到符号
/*
,那么编译器读入(并且忽略)随后的内容直到遇到符号
*/
为止。如果愿意,还可以把一串短注释合并成为一条长注释:
/* Name: pun.c
Purpose: Prints a bad pun.
Author: K. N. King */
但是,上面这样的注释可能难以阅读,因为人们阅读程序时可能不易发现注释的结束位置。因此,单独把
*/
符号放在一行会很有帮助:
/* Name: pun.c
Purpose: Prints a bad pun.
Author: K. N. King
*/
更好的方法是用一个“盒形”格式把注释单独标记出来:
/**********************************************************
* Name: pun.c *
* Purpose: Prints a bad pun. *
* Author: K. N. King *
**********************************************************/
有些程序员通过忽略3条边框的方法来简化盒形注释:
/*
* Name: pun.c
* Purpose: Prints a bad pun.
* Author: K. N. King
*/
简短的注释还可以与程序中的其他代码放在同一行:
int main(void) /* Beginning of main program */
这类注释有时也称作“翼型注释”。
如果忘记终止注释,则可能会导致编译器忽略程序的一部分。请思考一下下面的示例:
printf("My "); /* forgot to close this comment...
printf("car ");
printf("has "); /* so it ends here */
printf("fleas");
因为在第一条注释中遗漏了结束标志,所以编译器忽略了中间的两条语句,因此程序最终只打印了
My fleas
。
C99提供了另一种类型的注释,以
//
(两个相邻的斜杠)开始:
// This is a comment
这种风格的注释会在行末自动终止。如果要创建多于一行的注释,既可以使用以前的注释风格(
/* ... */
),也可以在每一行的前面加上
//
:
// Name: pun.c
// Purpose: Prints a bad pun.
// Author: K. N. King
新的注释风格有两个主要优点:首先,因为注释会在行末自动终止,所以不会出现未终止的注释意外吞噬部分程序的情况;其次,因为每行注释前面都必须有
//
,所以多行注释看上去更加醒目。