C语言是结构化的程序设计语言,而结构化指的是现实世界事物发展逻辑的抽象,即顺序结构、选择结构和循环结构。
C语言的大多数语句属于以下3大类。
分支语句
循环语句
跳转语句
此外还有复合语句(compound statement,把几条语句组合成一条语句)和空语句(void statement,不执行任何操作)。
学习这些语句之前需要了解是语句什么。
语句是程序运行时执行的命令。C语言规定每条语句都要以分号结尾(但也存在少许例外),因为语句可以连续占用多行,需要用分号来确定其结束位置——而指令通常只占用一行,因此不需要分号结尾。
因此可以简单理解为:在C语言中,由一个分号;隔开的就是一条语句。
在一组可选项中选择一条特定的执行路径的语句,称为分支语句/选择语句(selection statement)。
语法结构如下:
- 第一种:
- if(表达式)
- 语句;
-
- 第二种:
- if(表达式)
- 语句1;
- else
- 语句2;
-
- 第三种(多分支/级联式):
- if(表达式1)
- 语句1;
- else if(表达式2)
- 语句2;
- else
- 语句2;
当表达式结果为真时,其对应的分支就会执行。
那么C语言中如何表达真假呢?在C89规范中,非0就是真(包括-1等负数),0就是假。
(C99中提供了_Bool型和能够提供bool宏的头,但由于本文主要讲C89规范,因此先不进行讲解。实际上,C99中的true和false也只是使用了无符号整型的1和0而已。)
因此括号中的表达式可以使用各种语句,包括关系操作符等来计算。
补充1:
级联式if语句不是新的语句类型,而是普通的if语句,只不过碰巧有另外一条if语句作为else下的子句。
如果要一个分支下要执行多条语句,则应该使用代码块{}来组成复合语句。
注意:代码块{}后不需要加分号;。
补充2:悬空else问题
- int a = 0;
- int b = 2;
- if (a == 1)
- if (b == 2)
- printf("yes\n");
- else
- printf("no\n");
上面这段代码的else对应的是哪个if呢?
C语言遵循的规则是,else子句应该属于离它最近的且还未和其他else匹配的if语句。
因此这里的else会被判断为第二个if语句的分支。
这表明,想要使分支语句有清晰的逻辑和结构,则最好加上代码块{}。
另外,某些if...else...表达式可以被条件表达式(三元操作符)替代。
switch也是一种分支语句,常常用于多分支的情况,比如将表达式和一系列值进行比较,从中找出当前匹配的值。
其结构为:
- switch(整型表达式) //注意,这里必须是 整型,int long 甚至 char 都行,但 float 不可以
- {
- 语句项;
- }
语句项里是一些case语句,如下: