跳转至

第五章 选择语句

根据语句执行过程中顺序所产生的影响方式,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 语句。