购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.1 if控制语句

3.1.1 if…else语句

if…else语句通过对一个条件进行判断,当条件为真时,执行一个操作,否则执行另一个不同的操作。if…else语句的语法格式如下:

对应的流程图如图3-1所示,如果表达式的值为真,则执行语句1,否则执行语句2。其中,语句1和语句2可以是一条单独的语句,也可以是用花括号括起来的一组语句。

图3-1 双分支if语句流程图

if(表达式)、语句1、else和语句2一起组成了一个分支结构,它们并非两条完整的语句,if条件表达式的括号后面没有分号。

请注意语句1和语句2中都有一个缩进。这样的缩进并不是语法上的要求,是可选的。但是强烈推荐采用这样的缩进,因为它有利于突出结构化程序的内在结构特点,使程序易于理解。本书采用“缩进”这样的程序书写风格。缩进增加的空格并不会使编译后得到的目标程序变大,因为编译器在编译时会将所有的空白符,如空格、Tab键和换行符全部忽略。

解决问题:输出两个整数中较大的一个。

从键盘输入两个整数,要求输出这两个整数中较大的一个。

解题思路: 如果a > b,则输出a的值,否则输出b的值。用如下伪代码来表达该问题的求解过程。

(1)读入整数a、b;

(2)如果a > b,则输出a的值;

否则,输出b的值。

/*程序3-1:使用if…else语句输出两个数的最大值*/

(1)将if控制的语句体中的语句整体向后缩进,是一个很好的编程习惯,有利于突出代码段的内在结构特点;

(2)if()后面没有分号!如果不小心在后面加了分号,会有语法错误,错误提示会指向else:非法的else,没有与之匹配的if;

(3)建议用花括号明确表示if或else的控制范围。

3.1.2 伪代码

在编写程序3-1之前,先使用了伪代码分析问题:

(1)读入整数a、b;

(2)如果a > b,则输出a的值;

否则,输出b的值。

伪代码是一种人工的、非正式的辅助人们来进行算法设计的语言。伪代码跟我们日常使用的语言极为类似,但它能方便地转换为C语言程序,并且书写方便、易学易用。

伪代码程序只包含“操作语句”,变量定义语句不是“操作语句”,例如:

int i;

只是程序员想通知编译器:名为i的变量的类型是int,为其预留出相应的存储空间。所以在编写伪代码程序时,可以不进行变量定义。但是有的程序员喜欢在伪代码程序的开头列出所有的变量,并简要说明其目的。

使用伪代码有助于程序员在编写程序前专心地“思考”程序该如何设计,至于将伪代码转换成C语言源程序的工作就是相对简单的劳动了。

解决问题考是否通过

从键盘读入一个整数,代表一个学生的考试成绩,若大于或等于60分,则输出“Passed”,否则输出“Failed”。

解题思路: 因为问题比较简单,可直接用如下伪代码来表达该问题的求解过程。

(1)读入成绩score;

(2)如果score >=60,则输出“Passed”;

否则,输出“Failed”。

/*程序3-2:使用if…else语句判别考试是否通过*/

3.1.3 缺省else子句的if语句

在if控制语句中,else子句是可选项。缺省else子句的if语句格式如下:

如果括号内表达式的值为真,则执行if后面的语句,否则什么也不做。语句是否执行取决于表达式的值。下面这条if语句是通过比较成绩是否小于60,来决定是否执行输出语句:

if(score < 60)

printf(″不及格\n″);

解决问题:输出两个整数中较大的一个。

从键盘读入两个整数,要求输出这两个整数中较大的一个。

解题思路: 用变量max来存储最大值,先将a赋给max,然后判断b是否大于max,如果是,则将b赋给max。用如下伪代码来表达该问题的求解过程。

(1)读入整数a、b;

(2)将a存入max(暂时认为a最大);

(3)如果b>max,用b更新max;

(4)输出max。

/*程序3-3:使用基本if语句求两个整数的最大值*/

也许初学者会认为程序3-3不如程序3-1直接输出结果那么简洁明了,但这种方法很有启发性,易于扩充到规模更大的问题上,例如求3个整数的最大值,详见程序3-4。

3.1.4 关系运算

关系运算符用于比较表达式,提出“b是否大于max”等问题。含有关系运算符的表达式的运算结果只有两个:1(true)或0(false)。因此,关系运算的结果是整型数据。如果关系成立,结果为1;如果关系不成立,结果为0。

关系运算符用于比较整数和浮点数,也允许比较混合类型的操作数。常用的关系运算符如表3-1所示。

表3-1 关系运算符

关系运算符的优先级低于算术运算符,其中,前四个运算符的级别比后两个的优先级高。

表达式1 < 2==3 < 4的结果为1,因为该表达式等价于(1 < 2)==(3 < 4)。

表达式4==4 > 0的结果为0,因为“>”运算符优先级高于“==”,故表达式等价于4==(4 > 0),而子表达式(4 > 0)的值为1,进而表达式4==1的值为0。

表达式4 > 3 > 2的结果为0,因为该表达式等价于(4 > 3)> 2,而子表达式(4 > 3)的值为1,进而表达式1 > 2的值为0。初学者很容易受数学习惯的影响,把表达式4 > 3 > 2理解为4 > 3并且3 > 2,这需要引起注意,在C语言中,表达式4 > 3 > 2是按优先顺序计算的,没有并且的含义。在C语言中如何表示数学表达式“a < x < b”将在3.2一节讲解。

解决问题:求三个整数的最大值。

从键盘上读入三个整数,要求输出这三个整数中最大的数。

解题思路:

方法1: 如果用程序3-1中直接输出结果的方法,需要列举出所有可能的关系:

如果a >=b并且a >=c,则输出a

否则,如果b >=a并且b >=c,则输出b

否则,如果c >=a并且c >=b,则输出c

方法2: 如果用程序3-3的方法,则可在程序3-3的基础上进行扩充。在程序3-3中,已将a和b的最大值存入max,在此基础上,让c与max比较:如果c > max,则用c更新max。

实现过程如下:

(1)读入整数a和b;

(2)将a存入max(暂时认为a最大);

(3)如果b > max,用b更新max;

(4)如果c > max,用c更新max;

(5)输出max。

/*程序3-4:使用if语句求三个整数的最大值*/

(1)第一个常见的错误是:if语句中,在括起条件的右括号后面多写了一个分号;

(2)第二个常见错误是:将“==”和“=”弄混淆了;

(3)将if控制的语句体中的语句整体向后缩进,是一个很好的编程习惯;

(4)为了增加程序的可读性,最好在每个if语句的前后都留出一个空行。

3.1.5 复合语句

在if语句中,if子句或else子句条件能控制的只是一条语句,而实际情况中条件分支要处理的操作往往需要多条语句才能完成,这时就要使用花括号将这些语句括起来。一般地,将一组逻辑相关的语句用一对花括号{}括起来所构成的语句,称为复合语句,也叫语句块,其一般形式为:

由于复合语句在逻辑上形成一个整体,因此可以被当作一条语句来处理,并且可以用在单个语句可以使用的任何地方。

解决问题:交换两个变量的值。

输入两个整数存入a、b两个变量,若a>b,则a与b交换内容,即:要求a中存较小数,b中存较大数,最后输出a和b的值。

解题思路:

(1)从键盘读入两个整数存入a、b两个变量中;

(2)如果a > b,则互换a和b的内容。

此问题的难点在于如何互换两个变量的内容。内存的特性是对其赋值后,原有的内容会被覆盖,所以不能简单地用"a=b;b=a;"这两条赋值语句来实现互换。

其道理等同于这样一个问题:有一瓶雪碧(用a表示)和一瓶可乐(用b表示),现在,要求用雪碧瓶子装可乐,可乐瓶子装雪碧,如何实现?

相信大家都有答案:找一个空瓶子(用t表示)来周转,如图3-2所示。

图3-2 两个瓶子交换内容

交换两瓶饮料的具体步骤如下:

(1)把a瓶中的雪碧倒入空瓶t中;

(2)把b瓶中的可乐倒入a瓶中;

(3)把暂存在t瓶中的雪碧倒入b瓶中。

交换两个变量值的步骤如下:

(1)把a的值存入t中:t=a;

(2)把b的值存入a中:a=b;

(3)把t的值存入b中:b=t;

由此可知,此问题对应的源代码如下:

/*程序3-5:使用复合语句交换两个变量的值*/

运行结果:

此例中,要注意if语句控制的范围,如果if后面的条件成立,要执行的语句多于一条,一定要用花括号括成一条复合语句。如果上面的if语句改为:

运行结果:

输入:3 5↙

输出:5 -858993460

为什么出现这样的结果?通过单步执行会发现,只有“t=a;”这条语句受if的限制,而“a=b;b=t;”这两条语句不再受if的限制,当if后面的条件不成立时也会被执行,因此会把b的值赋给a,把t的值赋给b,而t没有初始化,所以b被赋为一个垃圾值。

3.1.6 条件表达式

除了if语句,C语言还提供了一种特殊的运算符,用来依据条件选择两个值中的一个。条件表达式的格式:

表达式1 ?表达式2:表达式3

以上的组合表达式称为条件表达式,它是唯一一个要求三个操作数的运算符,因此,常将其称为三元运算符。

求解过程:

(1)求解表达式1的值;

(2)如果表达式1的运算结果为1(非0),求解表达式2的值,将其作为整个表达式的值,表达式3不计算;

(3)如果表达式1的运算结果为0,求解表达式3的值,将其作为整个表达式的值,表达式2不计算。

/*程序3-6:使用条件表达式求两个整数的最大值*/

其中(a > b)? a:b是一个条件表达式,若条件(a>b)成立,则条件表达式取值a;否则,取值b。由此可以将程序3-4改写成程序3-7。

/*程序3-7:用条件表达式求三个整数的最大值*/ GPdGzKxAyoa5MNpdHy3hx+Lc+PR0iL8aDmUSSAgZb4nhjkxN4R7U9H+xsUO6mRts

点击中间区域
呼出菜单
上一章
目录
下一章
×