第五章 选择语句
根据语句执行过程中顺序所产生的影响方式,C语言的其他语句大多属于以下三类:
-
选择语句( selection statement )。 if 语句和 switch 语句允许程序在一组可选项中选择一条特定的执行路径。
-
循环语句( iteration statement )。 while 语句、 do 语句和 for 语句支持重复操作。
-
跳转语句( jump statement )。 break 语句、 continue 语句和 goto 语句引起无条件地跳转到程序中的某个位置。( return 语句也属于此类)
C语言还有其他两类语句,一类是由几条语句组合成一条语句的复合语句,一类是不执行任何操作的空语句。
逻辑表达式
包括 if 语句在内的某些C语句都必须测试表达式的值是“真”还是“假”。诸如i<j
这样的比较运算会产生整数:0(假)或1(真)。
关系运算符
C语言的关系运算符( relational operator )用在C语言中时产生的结果是0(假)或1(真)。
符号 | 含义 |
---|---|
< | 小于 |
> | 大于 |
<= | 小于或等于 |
>= | 大于或等于 |
关系运算符的优先级低于算术运算符,关系运算符都是左结合的。表达式i+j<k-1
意味着(i+j)<(k-1)
。
判等运算符
符号 | 含义 |
---|---|
== | 等于 |
!= | 不等于 |
判定运算符是左结合的,也是产生0或1作为结果。然而,判等运算符的优先级低于关系运算符。例如表达式i<j == j<k
等价于表达式(i<j) == (j<k)
。
逻辑运算符
符号 | 含义 |
---|---|
! | 逻辑非 |
&& | 逻辑与 |
|| | 逻辑或 |
逻辑运算符所产生的结果是0或1。逻辑运算符将任何非零值操作数作为真值来处理,同时将任何零值操作作为假值来处理。
运算符&&和||都对操作数进行“短路”计算。
运算符!的优先级和一元正号、负号的优先级相同。运算符&&和||的优先级低于关系运算符和判等运算符。运算符!是右结合的,而运算符&&和||是左结合的。
if 语句
if 语句允许程序通过测试表达式的值从两种选项中选择一种。 if 语句的最简单的格式如下:
if (表达式) 语句
执行 if 语句时,先计算圆括号内的表达式的值。如果表达式的值非零,那么接着执行括号后面的语句,C语言把非零值解释为真值。
复合语句
如果想用 if 语句处理两条或更多语句,该怎么办呢?可以引入复合语句( compound statement )。复合语句有如下格式:
{ 多条语句 }
else 子句
if 语句可以有 else 子句:
if (表达式) 语句 else 语句
如果在圆括号内的表达式的值为0,那么就执行 else 后边的语句。
条件表达式
C语言提供了一种特殊的运算符,这种运算符允许表达式依据条件的值产生两个值中的一个。
条件运算符( conditional operator )由符号?和符号:组成,两个符号必须按如下格式一起使用:
表达式1 ? 表达式2 : 表达式3
条件运算符是C运算符中唯一一个要求3个操作数的运算符。因此,经常把它称为三元运算符。
条件表达式的求值步骤是:首先计算出表达式1的值,如果此值不为零,那么计算表达式2的值,并且计算出来的值就是整个条件表达式的值;如果表达式1的值为零,那么计算表达式3的值,并且此值就是整个条件表达式的值。
布尔值
因为许多程序需要变量能存储假值和真值,所以C语言缺少适当的布尔类型可能会很麻烦。可以使用 int 型变量来模拟布尔类型:
int flag;
flag = 0;
flag = 1;
为了使程序更加便于理解,一个好的方法是用类似 TRUE 和 FALSE 这样的名字定义宏:
#define TRUE 1
#define FALSE 0
flag = FALSE;
flag = TRUE;
为了更进一步实现这个想法,甚至可以定义用作类型的宏:
#define BOOL int
BOOL flag;
switch 语句
C语言提供了 switch 语句作为级联式 if 语句的替换:
switch (grade) {
case 4: printf("Excellent"); break;
case 3: printf("Good"); break;
case 2: printf("Average"); break;
case 1: printf("Poor"); break;
case 0: printf("Failing"); break;
default: printf("Illegal grade"); break;
}
switch 语句的最常用的格式如下:
switch (表达式) {
case 常量表达式: 多条语句
...
case 常量表达式: 多条语句
default: 多条语句
}
switch 语句的组成部分:
-
控制表达式。 switch 后面必须跟着右圆括号括起来的整型表达式。C语言把字符当成整数来处理,因此可以在 switch 语句中对字符进行判定。但是,不能用浮点数和字符串。
-
情况标号。常量表达式( constant expression )更像是普通的表达式,5是常量表达式,5 + 10也是,而n + 10不是(除非n是表示常量的宏)。
-
语句。每个情况标号的后边可以跟任意数量的语句,不需要用大括号括起来。每组语句的最后通常是 break 语句。