语句
语句是按某种顺序执行的一段程序。
语句可以被标号。
分类
语句分为以下五种类型:
上面的分类覆盖了日常 C 程序的控制流骨架:表达式语句负责“做一件事”,选择语句和循环语句负责“控制走向”,跳转语句负责“提前结束或切换路径”,复合语句负责“组织作用域”。理解这五类之后,再看任何函数实现,都能先把它拆成结构,再看细节。
关于“标号语句”
C Primer Plus 等书指出 C 语言有 6 种语句而不是五种;在本文所述五种语句之外额外添加了一种“标号语句”。
在 C 语言标准文档中,关于 Statements 的部分 BNF 如下:
statement ::= labeled-statement | unlabeled-statement
labeled-statement ::= label statement2
3
运行结果:该代码块主要用于语法或结构说明,单独运行通常无终端输出。
这些 BNF 说明:语句分为“带标号的语句”和“不带标号的语句”;可以在语句前加(任意数量的)标号。“标号语句”这个词可能不合理。
执行语义与工程建议
语句按顺序执行并不等于“表达式内部也按书写顺序求值”。这两层语义要分开理解:语句级顺序由语法结构决定,表达式级求值顺序则受运算符规则和标准约束控制。因此,建议尽量写“单一意图语句”,把复杂求值拆开,以减少未定义行为和可读性风险。
int i = 0;
int arr[2] = {0, 0};
arr[i] = 10;
i++;
arr[i] = 20;2
3
4
5
6
运行结果:该代码块主要用于语法或结构说明,单独运行通常无终端输出。
上面这种拆分写法通常比把多个副作用塞进一行更稳妥,也更符合代码审查与调试习惯。
语句组织顺序建议
阅读或编写函数时,可以按“输入校验 → 主路径处理 → 收尾返回”组织语句层次。这样做的好处是:选择语句主要承担入口分流,循环语句聚焦核心处理,跳转语句集中在异常或提前结束路径,整体控制流更容易一眼看清。语句本身不复杂,难点在于放置顺序;顺序清楚后,函数意图就会自然显现。
语句边界与模块边界
语句层级的清晰结构最终会体现在模块接口质量上。一个函数若在语句层面已经出现大量交错分支,通常说明它承担了过多职责;把流程拆分为多个职责单一的小函数,再通过清晰调用顺序组合,往往比在单函数里继续堆叠语句更稳定。语句章节的学习目标,不只是会写语法,更是建立这种分层组织能力。
static int parse_input(const char *s, int *out);
static int compute_result(int in, int *out);
int run_once(const char *s) {
int in = 0;
int out = 0;
if (parse_input(s, &in) != 0) {
return -1;
}
if (compute_result(in, &out) != 0) {
return -1;
}
return out;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
运行结果:该代码块主要用于语法或结构说明,单独运行通常无终端输出。