程序语言中的控制流语句用于控制各计算操作执行的次序。
3.1语句与程序块
表达式之后加上一个分号(;)就变成了语句。
在C语言中,分号是语句结束符。
用一对花括号把一组声明和语句括在一起就构成了一个复合语句(也叫做程序块),复合语句在语法上等价于单条语句。
右花括号用于结束程序块,其后不需要分号。
3.2if-else语句
if-else语句用于条件判断。其语法如下:
if(表达式)
语句1
else
语句2
else部分可选。
语句执行时先计算表达式的值,其值为真,则执行语句1,其值为假,并且该语句包含else部分,则执行语句2。
用if(表达式)代替if(表达式!=0)可以对代码的编写进行简化,某些情况下这种形式自然清晰,但有些情况会含义不清。
每个else与最近的前一个没有else配对的if进行匹配。
程序的缩进结构明确表明了设计意图,但编译器无法获得这一信息,因此建议在有if语句嵌套的情况下使用花括号。
3.3else-if语句
if(表达式)
语句
else if(表达式)
语句
else if(表达式)
语句
else
语句
上述这种if语句序列是编写多路判定最常用的方法,各表达式将被依次求值,一旦某个表达式结果为真,则执行相关的语句,并终止整个语句序列的执行。其中各语句既可以是单条语句,也可以是用花括号括住的复合语句。
最后一个else用于处理上述条件均不成立的情况或默认情况。有时候不需要针对默认情况执行显示的操作,这种情况可以省略末尾的else语句。该部分也可以用来检查错误,捕获不可能的条件。
3.4switch语句
switch语句是一种多路判定语句,它测试表达式是否与一些常量整数值的某一个值匹配,并执行相应的分支动作。
switch(表达式){
case 常量表达式:语句序列
case 常量表达式:语句序列
default:语句序列
}
每一个分支由一个或多个整数值常量或常量表达式标记。如果某个分支与表达式的值匹配,则从该分支开始执行。各分支表达式必须互不相同。如果没有哪一分支能匹配表达式,则执行标记为default的分支。default的分支是可选的。如果没有default分支也没有其他分支与表达式的值匹配,则该switch语句不执行任何动作。各分支及default分支的排列次序是任意的。
break语句将导致程序的执行立即从switch语句中退出。
在switch语句中,case的作用只是一个标号,在某个分支中的代码执行完后,程序将进入下一分支继续执行,除非在程序中显示地跳转。
跳出switch语句最常用的方法是使用break语句与return语句,break语句还可强制控制从while、for、do循环语句中立即退出。
依次执行各分支的做法的好的一面是可以把若干分支组合在一起完成一个任务,但是,正常情况下为了防止直接进入下一个分支执行,每个分支后必须以一个break语句结束。从一个分支直接进入下一个分支执行的做法并不健全,这样做在程序修改时容易出错。除了一个计算需要多个标号的情况外,应尽量减少从一个分支直接进入下一个分支执行这种用法,在不得不使用的情况下应该加上适当的程序注释。
作为一个良好的程序设计风格,在switch语句最后一个分支(即default分支)的后面也加上一个break语句,这样做在逻辑上没有必要,但当我们需要向该switch语句后添加其他分支时,这种防范措施会降低犯错误的可能性。
3.5while循环与for循环
while(表达式)
语句
while循环语句中先求表达式的值,如果其值为真,则执行语句,并再次求该表达式的值,这一循环过程一直进行下去,直到该表达式的值为假为止,随后继续执行语句后面的部分。
for循环语句:
for(表达式1;表达式2;表达式3)
语句
for循环语句的三个组成部分都是表达式,常见的情况是表达式1和表达式3是赋值表达式或函数调用,表达式2是关系表达式。这三个组成部分中的任何部分都可以省略,但分号必须保留。
在没有初始化或重新初始化的操作时,用while循环语句更自然一些。
如果语句中需要执行简单的初始化和变量递增,使用for语句更合适一些,它将循环控制语句集中放在循环的开头,结构更紧凑、更清晰。
for语句的各组成部分可以是任何表达式,但牵强地把一些无关的计算放到for语句的初始化和变量递增部分是一种不好的程序设计风格,该部分放置循环控制运算更合适。
把循环控制部分集中在一起,对于多重嵌套循环,优势更为明显。
逗号(,)运算符是C语言优先级最低的运算符。被逗号分隔的一对表达式按从左到右的顺序进行求值,各表达式右边的操作数的类型和值即为其结果的类型和值。
某些情况下的逗号并不是逗号运算符,比如分隔函数参数的逗号,分隔声明中变量的逗号等,这些逗号并不保证各表达式从左至右的顺序求值。
应该慎用逗号运算符,逗号运算符最适用于关系紧密的结构,对于需要在单个表达式中进行多步计算的宏也很合适。
3.6do-while循环
do-while循环在循环体执行后测试终止条件,循环体至少被执行一次。
do
语句
while(表达式);
先执行循环体中的语句部分,然后再求表达式的值,如果表达式为真,则再次执行语句,当表达式为假,则循环终止。
3.7break语句与continue语句
break语句可用于从for、while与do-while循环中提前退出,能使程序从switch语句或最内层循环中立即跳出。
continue语句用于使for、while、do-while语句开始下一次循环的执行,在while与do-while循环中,continue语句的执行意味着立即执行测试部分,在for循环中,则意味着使控制转移到递增循环变量部分。
continue语句只用于循环语句,不用于switch语句。某个循环包含的switch语句中的continue语句,将导致进入下一次循环。
3.9goto语句与标号
C语言提供了可随意滥用的goto语句以及标记跳转位置的标号。从理论上来讲,goto语句是没有必要的,但在某些场合下还是用得着的,最常见的用法是终止程序在某些深度嵌套的结构中的处理过程,例如一次跳出两层或多层循环。
标号的命名同变量命名的形式相同,标号的后面要紧跟一个冒号。标号可以位于对应的goto语句所在函数的任何语句的前面。标号的作用域是整个函数。
大多数情况下使用goto语句的程序段比不使用goto语句的程序段要难以理解和维护。我们建议尽可能少地使用goto语句
感想:
本章让我更深地了解了while、for和do-while循环,对逗号运算符有了清楚的认识,本章还向我介绍了Shell排序算法,并从中介绍了for循环的一些特点,让我印象很深。书包括练习上对于itoa函数的介绍也让我对其有了一个更深的了解。写得确实简洁,也介绍了很多好的程序风格。