什么是语句?
程序就像一份食谱,由一条一条的“指令”组成。在C语言中,这些指令被称为语句。它们是程序执行的基本单元,告诉计算机在何时、做何事。
大多数语句以分号 ; 结尾——它就像句号,表示一条操作的结束。但C语言中的语句类型多样,有的甚至不需要分号。我们就从最简单的一句开始。
1. 空语句——什么都不做的语句
最简单、也最容易让人困惑的语句,是一个单独的分号:
;
这就是空语句,它什么都不做。既然什么都不做,为什么还需要它?因为在C语言的语法中,有些地方必须有一条语句,但我们在逻辑上却不需要做任何事,这时候空语句就派上了用场。
典型场景:循环体的全部工作已经在条件部分完成了,但语法要求循环体存在。
// 把字符串 s 复制到 t,循环条件里完成了所有操作
while(*t++ = *s++)
; // 空语句,循环体什么都不需要额外做
另一个例子:如果某个 for 或 while 循环不需要体,可以用空语句占位。不过,书写空语句时要格外小心,千万不要在不该出现的地方多写分号,否则会引入难以察觉的逻辑错误。比如在 if 条件后误加分号,会导致 if 语句提前结束,后面的代码无条件执行。
2. 表达式语句——最基础的动作
在任意表达式后面加上一个分号,就构成了一条表达式语句。这是我们最常书写的语句形式。
int a;
a = 10; // 赋值语句,副作用是把a改成10
a = a + 5; // 计算并赋值
printf("%d", a); // 函数调用语句,副作用是在屏幕上输出
表达式语句的特点是:先计算表达式的值,然后把值丢弃,只保留表达式带来的副作用(比如修改变量的值、输出信息等)。没有副作用的表达式语句虽然没有语法错误,但通常毫无意义,比如 3 + 5; 计算后什么都没发生。
注意:一个完整的表达式语句必须有分号。忘了写分号是初学者最常见的错误之一。
3. 复合语句——多条语句打包成“一条”
当我们需要把多条语句捆绑在一起,让它们在逻辑上作为一个整体时,可以用花括号 { } 把它们包围起来,这就形成了复合语句,也叫代码块。
{
int a = 5;
int b = 10;
printf("%d", a + b);
}
复合语句的几个要点:
- 右花括号
}后面不需要加分号。 - 在复合语句内部定义的变量,其作用范围通常仅限于该代码块内部(称为块作用域),离开花括号就不能再使用。
- 复合语句可以嵌套,花括号里面还能再套花括号。
复合语句在 if、循环等控制结构中特别重要,因为那些结构在语法上通常只能跟“一条语句”,而我们往往需要执行多条语句,此时就可以用复合语句把它们包装成“一条”。
4. 语句的书写风格
好的书写风格让程序清晰易读,减少错误:
- 每条语句占一行:虽然C语言允许一行写多条语句,但分开写更清晰。
- 适当缩进:每进入一个代码块(花括号内),向右缩进4个空格或一个Tab;离开代码块时回退。这能直观展现程序的层次。
- 分号不要漏:尤其是在大段代码里找遗漏的分号会很头疼。记住,除了复合语句的右花括号和预处理指令外,大多数功能语句都需要分号。
- 小心多余分号:空语句虽有用,但不该出现的地方多了一个分号,可能完全改变程序逻辑(例如在
if、循环条件后面误加分号)。 - 花括号位置:有多种风格,选择一种并保持一致。最常见的写法是把开括号放在行末:cif(a > 0) { printf(“正数\n”); }
5. 控制语句——让程序“变聪明”
如果只有顺序执行的语句,程序就只能做固定的事情。控制语句是C语言的精华,它能根据条件判断、重复执行某些代码,从而实现复杂的逻辑。控制语句通常由一个关键字引出,后跟圆括号和受控的子语句(可以是一条简单语句,也可以是一个复合语句)。
控制语句主要分为三类:
(1)选择语句:根据条件决定走哪条路。
if、if...else、if...else if...else:最常用的条件判断。switch...case:基于一个整型表达式的值,进行多路跳转。
(2)循环语句:让一段代码重复执行。
while:先判断条件,再执行循环体。do...while:先执行一次循环体,再判断条件是否继续。for:将初始化、条件判断、更新步骤集中在一起的循环结构。
(3)跳转语句:强行改变执行顺序。
break:跳出当前循环或switch语句。continue:跳过本次循环的剩余部分,直接进入下一次迭代。return:从函数中返回,并可带回一个返回值。goto:无条件跳转到函数内的某个标号处(应谨慎使用)。
下面用一个综合示例来展示控制语句的配合使用:
#include <stdio.h>
int main()
{
int score = 85;
// 选择语句
if(score >= 90) {
printf("优秀\n");
} else if(score >= 60) {
printf("及格\n");
} else {
printf("不及格\n");
}
// 循环语句 + 跳转语句
int i;
for(i = 1; i <= 5; i++) {
if(i == 3) {
continue; // 跳过3
}
if(i == 5) {
break; // 提前终止循环
}
printf("当前数字:%d\n", i);
}
return 0; // 跳转语句,结束main函数
}
输出:
及格 当前数字:1 当前数字:2 当前数字:4
可以看到,通过 if 判断分数,通过 for 和 continue、break 控制输出,程序的行为丰富了起来。控制语句将在后续专题中逐一详细讲解,这里你只需先建立整体印象:它们是让程序拥有“决策能力”和“重复执行能力”的关键。
总结
语句是C程序的骨架。从最简单的空语句 ;,到执行操作的表达式语句,再到打包多条语句的复合语句,最后到赋予程序智慧的控制语句,它们层层递进,共同构成了程序的行为。
把语句理解为一条条清晰的指令,保持好的书写习惯,你就能像读句子一样顺畅地阅读和编写C程序。现在,打开任何一个程序,试着去辨认里面的每一种语句吧。