第4章 分支与循环控制

4.1 if语句

C语言是一种结构化程序设计语言。它不允许交叉程序流程的存在,而是以模块为基本单位。一个程序只有一个入口和一个出口,不允许有突然的中途插人或退出。

结构化程序由若干模块组成,每个模块中包含着若干个基本结构,而每个基本结构中可以有若干条语句。

归纳起来,C语言有3种基本结构:

①顺序结构;

②选择结构;

③循环结构。

1.顺序结构及其流程图

顺序结构是一种最基本、最简单的编程结构。在这种结构中,程序由低地址向高地址顺序执行指令代码。如图4-1所示,程序先执行A操作,再执行B操作,两者是顺序执行的关系。

2.选择结构及其流程图

如果计算机只能做像顺序结构那样简单的基本操作,则它的用途十分有限。计算机功能强大的原因就在于它具有决策能力或者说具有选择能力。如图4-2所示。

978-7-111-30335-0-Chapter04-1.jpg

图4-1 顺序结构流程图

●依靠条件选择开关,打开或关闭水泵。

●如果上面的这种操作重复执行了22次,那么继续执行下面另一个操作。

●连续监测一个信号。这个信号指示语言芯片可以接受下一个字的代码。

C语言的条件语句与其他语言一样,“如果XX就XX”或是“如果XX就XX否则XX”。也就是当条件符合时就执行语句。条件语句又被称为分支语句,它根据给定的条件进行判断,以决定执行某个分支程序段。也有人会称为判断语句,其关键字是由if构成,这在众多的高级语言中都是基本相同的。C语言提供了3种形式的条件语句。

978-7-111-30335-0-Chapter04-2.jpg

图4-2 选择结构流程图

4.1.1 if语句的3种形式

1.第1种形式为基本形式:if

if(表达式)语句

其语义是:如果表达式的值为真,则执行其后的语句,否则就不执行该语句。其过程如

图4-3所示。

【例4-1】

978-7-111-30335-0-Chapter04-3.jpg

978-7-111-30335-0-Chapter04-4.jpg

图4-3 第1种if语句执行情况

例4-1中,输入两个数a,b。把a先赋予变量min,再用if语句判别min和b的大小,如min大于b,则把b赋予min。所以min中放的总是小的数,最后将其值进行输出。

2.第2种形式为:if-else

if(表达式)

语句1;

else

语句2;

其语义是:如果表达式的值为真,则执行语句1,否则执行语句2。

其执行过程如图4-4所示。

978-7-111-30335-0-Chapter04-5.jpg

图4-4 第2种if语句执行情况

【例4-2】

978-7-111-30335-0-Chapter04-6.jpg

}

例4-2中,输入两个整数,用if-else语句判别,当a等于b时,c=1;否则,c=2。通过printf语句输出变量c的值。

3.第3种形式为:if-else-if

前面两种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用第3种形式,即if-else-if语句,其一般形式为

if(表达式1)

语句1;

elseif(表达式2)

语句2;

else if(表达式3)

语句3;

else if(表达式m

语句m

else

语句n

其语义是:先判断表达式1的值,如果为真,则执行语句1;如果表达式1的值为假,则再判断表达式2的值,如果表达式2的值为真,则执行语句2;否则继续判断表达式3的值,就这样依次判断表达式的值,当出现某个值为真时,则执行其后面对应的语句,语句执行完后跳到整个if语句之外继续执行程序代码。如果所有的表达式都为假,那么执行语句n,即最后一个else后面的语句,然后再继续执行后面的程序代码。if-else-if语句的执行过程如图4-5所示。

978-7-111-30335-0-Chapter04-7.jpg

图4-5 第3种if语句执行情况

【例4-3】

978-7-111-30335-0-Chapter04-8.jpg

例4-3中,程序的功能是判断键盘输入字符的类别。其原理是根据输入字符的ASCII码值来进行判别字符类型。我们查一下ASCII码表便可知ASCII码值小于32的为控制字符。在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母,在“a”和“z”之间为小写字母,其余则为其他字符。这是一个多分支选择问题的典型应用,用if-else-if语句来实现,判断输入的字符ASCII码所在的范围,分别给出不同的输出提示信息。例如输入为“x”,输出显示“这是一个小写字母”。

4.在使用if语句中应注意的问题

1)在3种形式的if语句中,在if关键字之后均为表达式,它除了是常见的关系表达式或逻辑表达式外,也允许是其他类型的数据,如整型、实型、字符等。

例如:

if(x=8)语句;

if(x)语句;

如以上式子中(x=8)和(x)都是允许的,只要表达式的值为非0值,即为“真”,那就执行if后面的语句。

如将上面的式子改为:

if(x=y)

printf(“%d”,x);

else

printf(“x的值为0”);

该程序段的意思是,把y的值赋给x,如果x不为0,即表达式的值不为0,那么就执行printf(“%d”,x);语句,打印输出x的值,否则输出“x的值为0”的字符串。

2)与BASIC语言不同的是,在if语句中,条件判断语句必须用括号将表达式括起来,而且在语句后面必须加分号。

3)在所有的if语句形式中,if后面跟着的语句应为单条语句。如果想在满足条件分支时执行多条语句,那么,我们必须把这若干条语句用“{}”括起来,我们称此为复合语句。C语言中,每一条语句末尾需要加上“;”,在复合语句中,需要注意的是,分号应加在“}”之内,而不能加在“}”外面。

例如:

978-7-111-30335-0-Chapter04-9.jpg

该程序段意义:如果x>y,变量a自加1,打印输出“x>y”;如果x<0或x=0,变量a自减1,打印输出“x<=y”。

在C语言中有不少的括号,如{},[],()等,确实会让一些初入门的朋友不解。在VB等一些语言中同一个()号会有不同的作用,它可以用于组合若干条语句形成功能块,可以用做数组的下标等。而在C语言中括号的分工较为明显,{}号是用于将若干条语句组合在一起形成一种功能块,这种由若干条语句组合而成的语句就叫复合语句。复合语句之间用{}分隔,而它内部的各条语句还是需要以分号“;”结束。复合语句是允许嵌套的,也是就是在{}中的{}也是复合语句。复合语句在程序运行时,{}中的各行单语句是依顺序执行的。C语言中可以将复合语句视为一条单语句,也就是说在语法上等同于一条单语句。对于一个函数而言,函数体就是一个复合语句,因此复合语句中不单可以用可执行语句组成,还可以用变量定义语句组成。要注意的是在复合语句中所定义的变量,称为局部变量,所谓局部变量就是指它的有效范围只在复合语句中,而函数也算是复合语句,所以函数内定义的变量有效范围也只在函数内部。

4.1.2 if语句的嵌套

如果if语句后面的执行语句中又出现了if语句时,这就是if语句的嵌套使用。

其一般形式可表示如下

if(表达式)

if语句;

或者为

if(表达式)

if语句;

else

if语句;

嵌套部分内容可能是if语句,也有可能是if-else类型的语句,当然也可能出现很多个if和else重叠的情况,在这时,我们需要特别注意if和else的配对使用问题,自己的脑中要清晰地知道程序代码中后面的else语句是相应前面的哪个if语句。

下面我们来看一个例子:

if(表达式1)

if(表达式2)

语句1;

else

语句2;

大家看了以上的if程序结构后,想一想,其中的else究竟是与哪一个if配对呢?是与表达式1配对,还是与表达式2配对呢?

或许你有可能将其理解成这样:

978-7-111-30335-0-Chapter04-10.jpg

也许你也有可能理解成这样:

978-7-111-30335-0-Chapter04-11.jpg

那么究竟哪种理解才是对的呢?为了避免这种二义性情况,C语言规定,程序中的else语句总是与它前面最近的if相配对,因此对上述例子前一种情况理解是正确的。

【例4-4】比较两个数的大小关系。

978-7-111-30335-0-Chapter04-12.jpg

例4-4中用了if语句的嵌套结构。采用嵌套结构的目的是为了进行多分支选择,即两个数字比较大小,将会有3种情况出现,x>y、x<y或x=y。当x不等于y的条件满足时,再去执行(x>y)的if条件表达式。

【例4-5】计算函数

978-7-111-30335-0-Chapter04-13.jpg

这是由if else语句组成的嵌套,用来实现多个条件分支,使用时应注意if和else的配对使用,要是缺了一半编译器就会报语法出错,else语句总是与最近的if语句相配对。一般条件语句用于单一条件或少量的分支数,如果是数量多的分支时,则更多的会用到开关语句——SWITCH语句。如果使用条件语句来编写超过3个以上的分支程序的话,会使程序变得不太清晰易读。