第三章 控制流

3.1 语句与程序块

在x=0、i++这样的表达式之后加上一个分号(;),它们就变成了语句。C语言中,分号是语句结束符。

用一对花括号{}把一组声明和语句括在一起就构成了一个复合语句(也叫做程序块),复合语句在语法上等价于单条语句。函数体中被花括号括起来的语句便是明显一例。

if、else、while与for之后被花括号括住的多条语句也是类似的例子(任何程序块中可以声明变量)。

右花括号用于结束程序块,其后不需要分号。

3.2 if-else语句

用于条件判定:语法如下:

if(表达式):

    语句1;

else

    语句2;

其中else部分是可选的。

该语句执行时,先计算表达式的值,如果其值为真(即表达式的值为非0),则执行语句1;

如果其值为假(即表达式的值为0),并且该语句包含else部分,制性质语句2;

另,有些情况下if-else可能语义不清。

以为if-else语句的else部分是可选的,所以在嵌套的if语句中省略它的else部分将导致歧义。

解决的方法是:将每个else与最近的前一个没有else配对的if进行匹配。

#include<stdio.h>
main() {
    int a = 1;
    int b = 1;
    if (a > 0) 
      if (b > 0)
         printf("a>0 and b>0");
      else 
         printf("a>0 but b<0");
}

else部分与内层的if匹配,通过缩进结构也可以看处理。

如果这不符合我们的意图,则必须使用花括号强制实现正确的匹配关系。

#include<stdio.h>
main() {
    int a = 1;
    int b = 1;
    if (a > 0) {
      if (b > 0)
         printf("a>0 and b>0");
    }else 
      printf("a<=0");
}

3.3 else-if语句

结构如:

if(表达式)

语句

else if(表达式)

语句

else if(表达式)

语句

else if(表达式)

语句

else

语句

(1)这种if语句序列是编写多路判定最常用的方法。

其中的各表达式将被依次求值,一旦某个表达式结果为真,则执行与之相关的语句,并终止整个语句序列的执行。

(2)同样,其中的语句可以是单条语句或者花括号括住的复合语句。

(3)最后一个else部分处理“上述条件均不成立”的情况或者默认情况。

有时候并不需要针对默认情况执行显式的操作,此时,可以把else部分省略掉。

该部分也可以用来检查错误,以捕获“不可能”的条件。

通过折半查找来进行演示使用:


#include<stdio.h>
main() {
    int low = 0;
    int high = 9;
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    int b = 7;
    int v = 0;
    v = (low + high) / 2;
    for(;low <= high; v = (low + high) / 2) {
        if(b == a[v]) {
            printf("%d---%d----%d\n", b, a[v], v);
            break;
        } else if (b > a[v]) {
            low = v;
        } else if (b < a[v]) {
            high = v;
        }
    }
    return v;
}

3.4 switch语句

多路判定语句。它测试表达式是否与一些常量整数值中的某一个值匹配,并执行相应的分支动作。

switch(表达式){

case 常量表达式:语句序列

case 常量表达式:语句序列

case 常量表达式:语句序列

default:语句序列

}

(1)每一个分支都由一个或多个整数值常量或常量表达式标记。

如果某个分支与表达式的值匹配,则从该分支开始执行。各分支表达式必须互不相同。

(2)如果没有哪一分支能匹配表达式,则执行default的分支。default分支是可选的。

(3)如果没有default分支也没有其他分支与表达式的值匹配,则该switch语句不执行任何动作。

(4)各分支及default分支的排列次序是任意的。

程序例子如下:

==============

break语句使程序的执行立即从switch语句中退出。

(1)在switch语句中,case的作用只是一个标号,因此,某个分支中的代码执行完后,程序将进入下一个分支继续执行,除非在程序中显示得跳转。

跳出switch语句最常用的办法:使用break或者return。

(2)依次执行各分支的做法有优点也有缺点。

好的一面是它可以把若干个分支组合在一起完成一个任务,如上例中对数字的处理。

但是,正常情况下为了防止直接进入下一个分支执行,每个分支后必须以一个break语句结束。

从一个分支直接进入下一个分支执行的做法并不健全,这样做在程序修改时很容易出错。

除了一个计算需要多个标号的情况外,尽量减少从一个分支直接进入下一个分支这种用法。

(2)一种良好的程序设计风格,在switch语句最后一个分支的后面也要加上一个break语句。这样做逻辑上没有必要,但当我们需要向该switch语句后添加其他分支时,这种防范措施会降低犯错误的可能性。

3.5 while循环与for循环

while循环语句:

while(表达式)
	语句

首先求表达式的值,如果值为真,执行语句,并再次求该表达式的值。

这一循环过程一直进行下去,直到该表达式的值为假,随后继续执行语句后面的部分。

for 循环语句:

for (表达式1;表达式2;表达式3)
	语句

等价于下列while语句:

表达式1
while(表达式2){
	语句;
	表达式3;
}

但,当while或for循环语句中包含continue语句时,上述二者之间就不一定等价了。

(1)

for循环的3个组成部分都是表达式,一般,表达式1和表达式3是赋值表达式或者函数调用。表达式2是关系表达式。

3个组成部分的任何部分都可以省略,但分号必须保留。

如果在for循环中省略表达式1和表达式3,就退化成了while循环语句。

如果省略测试条件,即表达式2,则认为其值永远是真值,因此,下列for循环语句:

for(;;) {
}

是一个“无限”循环语句,这种语句需要借助其他手段(如break语句或return语句)才能终止执行。

是选择while还是for循环,取决于程序设计人员的个人偏好。

while((c = getchar()) == '' || c == '\n' || c == '\t')
	;

因为其中没有初始化或重新初始化操作,所以使用while循环语句更自然一些。

如果语句中需要执行简单的初始化和变量递增,使用for语句更合适一些,它将循环控制语句集中放在循环的开头,结构更紧凑、更清晰。


3.6 do-while循环

3.7 break语句与continue语句

3.8 goto语句与标号



转载于:https://my.oschina.net/cqlcql/blog/536450

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值