注释
1. 定义
注释的作用是在代码内写文档供人类阅读;编译器会忽略注释(技术上,是把注释替换成一个空格)。
2. 分类
- 行内注释:以
//开始:编译器会忽略从//开始到行末的所有字符。 - 块注释:以
/*开始,以*/结束。编译器会忽略从/*开始到*/结束的所有字符,包括/*和*/。
形式化语法
行内注释
any-char-except-newline:除换行符(如\n或\r)以外的任何字符。
bnf
line-comment ::= "//" line-content
line-content ::= any-char-except-newline line-content
| empty
empty ::= ""1
2
3
4
5
6
2
3
4
5
6
块注释
non-star-char:除星号*以外的任何字符。non-star-non-slash-char:除星号*和斜杠/以外的任何字符。
bnf
/* 块注释由 "/*" 开始,进入状态 S0 */
block-comment ::= "/*" state-S0
/* 状态 S0:上一个读入的字符不是 "*" */
state-S0 ::= non-star-char state-S0
| "*" state-S1
/* 状态 S1:上一个读入的字符是 "*" */
state-S1 ::= "/"
| "*" state-S1
| non-star-non-slash-char state-S01
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
3. 示例
c
#include <stdio.h>
int main(void) {
// 这是行内注释
/* 这是块注释 */
puts("Hello World 01");
// puts("Hello World 02");
/*
puts("Hello World 03");
puts("Hello World 04");
puts("Hello World 05");
*/
/*
* 为了整齐美观,也可以这样写:
* puts("Hello World 06");
* puts("Hello World 07");
* puts("Hello World 08");
*/
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
可能的输出:
bash
Hello World 01
4. 常见错误
块注释不能嵌套,也就是 /* ... /* ... */ ... */ 这种写法不合法。
原因:块注释从 /* 开始,到下一个 */ 结束,导致 /* ... /* ... */ 在注释范围之内,被处理掉了;还剩下单独的 ... */ 未被处理,编译器不认识它。