程序语言中的控制流语句用于控制各计算操作执行的次序。下面更详细地讲述控制流语句。
3.1 语句与程序块
在x=0、i++或printf(...)这样的表达式之后加上一个分号(;),它们就变成了语句。例如:
x = 0;
i++;
printf(...);
在C语言中,分号是语句结束符,而Pascal等语言却把分号用作语句之间的分隔符。
用一对花括号"{"与"}"把一组声明和语句括在一起就构成了一个复合语句(也叫作程序块),复合语句在语法上等价于单条语句。函数体中被花括号括起来的语句便是明显一例。if、else、while与for之后被花括号括起来的多条语句也是类似的例子。右花括号用于结束程块,其后不需要分号。
3.2 if-else语句
if-else语句的基本语法如下:
如果条件为真,则执行if代码块中的语句;如果条件为假,则执行else代码块中的语句。else块是可选的,如果没有else块,当条件为假时,不会执行任何操作。
以下是一个简单的示例,用于判断一个数是否大于10:
在这个例子中,程序会提示用户输入一个整数,然后判断这个数是否大于10,并输出相应的结果。
国为if-else语句的else部分是可选的,所以在套的if语句中省路它的else部分将导致歧义。解决的方法是将每个else与最近的前一个没有else配对的if进行匹配。
else部分与内层的if匹配,我们通过程序的缩进结构也可以看出来。如果这不符合我们的意图,则必须使用花括号强制实现正确的匹配关系:
3.3 else-if语句
**else-if
语句用于在多个条件判断中执行不同的代码块,使得程序能够根据不同的条件执行相应的操作。**
else-if
语句的基本语法结构如下:
else-if
语句可以嵌套使用,即在一个else-if
语句中再使用if-else
结构。例如:
最后一个else部分用于处理"上述条件均不成立"的情况或默认情况,也就是当上面名条件都不满足时的情形。
3.4 switch语句
switch语句是一种多路判定语句,它测试表达式是否与一些常量整数值中的某一个值配,并执行相应的分支动作。
基本语法 :switch
语句接收一个表达式,该表达式的结果将与每个case
后的常量进行比较。如果找到匹配的case
,则执行该case
下的语句,直到遇到break
语句。如果没有找到匹配的case
,则执行default
下的语句(如果有的话)。
3.5 while循环和for循环
在while循环语句中,首先求表达式的值。如果其值为真非0,则执行语句,并再次求该表达式的值。这一循环过程一直进行下去,直到该表达式的值为假(0)为止,随后继续执行语句后面的部分。
for循环语句
等价于下列while语句:
但当while或for循环语句中包含continue语句时,上述二者之间就不一定等价了 。
3.6 do-while循环
while与for这两种循环在循环体执行前对终止条件进行测试。与此相反,C语言中的第三种循环------do-while循环则在循环体执行后测试终止条件,这样循环体至少被执行一次。
do-while循环的语法如下:
3.7 break语句与continue语句
不通过循环头部或尾部的条件测试而跳出循环,有时是很方便的。break语句可用于从for、while与do-while等循环中提前退出,就如同从switch语句中提前退出一样break语句能使程序从switch语句或最内层循环中立即跳出。
continue语句与break语句是相关联的,但它没有break语句常用。continue语句用于for、while或do-while语句开始下一次循环的执行。在while与do-while中、continue语句的执行意味着立即执行测试部分;在for循环中,则意味着使条件转移到递增循环变量部分。coneinue语句只用于循环语句,不用于switch语句。某个循环包含的switch语句中的continue语句,将导致进入下一次循环。
3.8 goto语句和标号
C语言提供了可随意滥用的goto语句以及标记跳转位置的标号。goto语句是一种控制语句,用于无条件地将程序的执行流跳转到程序中的另一个位置'
尽管goto语句在编程实践中常常被认为是不好的实践,因为它可能导致代码的可读性和维护性降低,但在某些特定情况下,goto语句仍然是有用的:
- 错误处理:在复杂的程序中,使用goto来处理错误清理的情况可以简化代码。通过将清理代码集中在一个地方,可以避免重复代码。
- 打破多重循环:在嵌套循环中,需要中断多个循环时,goto可以快速跳出。
标号的命名同变量命名的形式相同,标号的后面要紧跟一个冒号。标号可以位于对应的goto语句所在函数的任何语句的前面。标号的作用域是整个函数。