第三章 控制流
3.1 语句与程序块
在表达式之后加上一个分号(;),它们就变成了语句,分号是语句结束符。
用一对花括号“{”与“}”把一组声明和语句括在一起就构成了一个复合语句(也叫作程序块),复合语句在语法上等价于单条语句。(在任何程序块中都可以声明变量)右花括号用于结束程序块,其后不需要分号。
3.2 if-else语句
if-else语句用于条件判定,其语法如下所示:
if {表达式}
语句1
else
语句2
其中else部分是可选的。该语句执行时,先计算表达式的值,如果其值为真(即表达式的值为非0),则执行语句1;如果其值为假(即表达式的值为0),并且该语句包含else 部分,则执行语句2。
3.3 else-if语句
在 C语言中我们会经常用到下列结构:
if (表达式)
语句
else if (表达式)
语句
else if (表达式)
语句
else if (表达式)
语句
else
语句
这种语句常用于多路判定最常用的方法。其中的各表达式将被依次求值一旦某个表达式结果为真,则执行与之相关的语句,并终止整个语句序列的执行。最后一个else部分用于处理“上述条件均不成立”的情况或默认情况,也就是当上面各条件都不满足时的情形。
3.4 switch语句
switch (表达式) {
case 常量表达式: 语句序列
case 常量表达式: 语句序列
default: 语句序列
每一个分支都由一个或多个整数值常量或常量表达式标记。如果某个分支与表达式的值匹配,则从该分支开始执行。
break 语句将导致程序的执行立即从switch 语句中退出。在switch 语句中,case的作用只是一个标号,因此,某个分支中的代码执行完后,程序将进入下一分支继续执行,除非在程序中显式地跳转。跳出switch语句最常用的方法是使用break语句与return语句。
依次执行各分支的做法有优点也有缺点。好的一面是它可以把若干个分支组合在一起完成一个任务,如上例中对数字的处理。但是,正常情况下为了防止直接进入下一个分支执行,每个分支后必须以一个break语句结束。从一个分支直接进入下一个分支执行的做法并不健全,这样做在程序修改时很容易出错。除了一个计算需要多个标号的情况外,应尽量减少从一个分支直接进入下一个分支执行这种用法,在不得不使用的情况下应该加上适当的程序注释。
作为一种良好的程序设计风格,在switch语句最后一个分支(即default分支)的后面也加上一个break语句。这样做在逻辑上没有必要,但当我们需要向该switch语句后添加其它分支时,这种防范措施会降低犯错误的可能性。
3.5 while循环和for循环
while (表达式)
语句
首先求表达式的值。如果其值非0,则执行语句,并再次求该表达式的值。这一循环过程一直进行下去,直到该表达式的值为0为止,随后继续执行语句后面的部分。
for (表达式1; 表达式2; 表达式3)
语句
它等价于下列while语句:
表达式 1;
while (表达式2) {
语句
表达式 3;
}
表达式1与表达式3 是赋值表达式或函数调用,表达式2 是关系表达式。这3 个组成部分中的任何部分都可以省略,但分号必须保留。如果在for 语句中省略表达式1 与表达式3,它就退化成了while 循环语句。
3.6 do-while循环
while与for这两种循环在循环体执行前对终止条件进行测试。与此相反,C语言中的第三种循环——do-while循环则在循环体执行后测试终止条件,这样循环体至少被执行一次。
do
语句
while (表达式);
在这一结构中,先执行循环体中的语句部分,然后再求表达式的值。如果表达式的值为真,则再次执行语句,依此类推。
3.7 break语句和continue语句
break 语句可用于从for、while与do-while等循环中提前退出,就如同从switch语句中提前退出一样。break语句能使程序从switch语句或最内层循环中立即跳出。
continue 语句用于使for、while 或do-while 语句开始下一次循环的执行。
在while 与do-while语句中,continue 语句的执行意味着立即执行测试部分;在for 循环中,则意味着使控制转移到递增循环变量部分。continue 语句只用于循环语句,不用于switch 语句。某个循环包含的switch语句中的continue语句,将导致进入下一次循环。
3.8 goto语句与标号
最常见的用法是终止程序在某些深度嵌套的结构中的处理过程,例如一次跳出两层或多层循环。这种情况下使用break语句是不能达到目的的,它只能从最内层循环退出到上一级的循环。
标号的命名同变量命名的形式相同,标号的后面要紧跟一个冒号。标号可以位于对应的goto语句所在函数的任何语句的前面。标号的作用域是整个函数。
所有使用了goto语句的程序代码都能改写成不带goto语句的程序,但可能会增加一些额外的重复测试或变量