3.2 二分支选择结构
使用二分支结构的形式主要有两种,由使用基本的if语句实现,即if-else语句和省略else的if语句。在if语句中的条件表达式可由关系表达式或逻辑表达式组成。因此在讲解if语句之前,首先介绍一下关系表达式和逻辑表达式。
3.2.1 关系运算与关系表达式
例3-1的程序中,if((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0))的条件表达式中包含了关系运算符“==”(等于)和“!=”(不等于)。
关系运算符是二元运算符,共有6个运算符,如表3-1所示。
关系表达式是由关系运算符将运算对象连接起来的式子,运算对象可以是常量、变量或者任何有效的C语言表达式。关系表达式的运算结果为逻辑值,如果表达式成立,结果为逻辑真,否则为逻辑假。在C语言中逻辑“真”用整数“1”来表示,逻辑“假”用整数“0”来表示。
关系运算符优先级低于算术运算符,关系运算符中,“<”,“>”,“<=”,“>=”的优先级高于“==”和“!=”的优先级。当多个关系运算符同时出现在一个表达式中,根据优先级决定计算顺序,相同优先级的关系运算符按照从左到右的顺序计算。
下面的关系表达式是有效的:
3<0,表达式不成立,结果为0。
7>6>5,7>6表达式成立,结果为1,再计算1>5,表达式不成立,结果为0。
若x=2,y=4,z=-5,则关系表达式x+3>y+z成立,结果为1。
若x=2,y=4,则关系表达式x!=3>y先计算3>y,结果为0,再计算x!=0,结果为1。
关系运算符也可以用来比较字符型数据,字符型数据按ASCII码值的大小比较。例如‘a’>‘A’结果为1,‘A’>‘B’结果为0。
注意 浮点数的比较不能用“==”或“!=”关系运算符,因为float型和double型的数据是由二进制方式存储,都有精度限制。十进制小数没有准确的二进制表示,所以浮点数判断相等的方式一般采用判断两个数差的绝对值小于一个可以接受的范围。例如浮点变量a,不能用if(a==0.0)判断a是否等于0.0,而应转换成if(a−0.0>1e−4)。
3.2.2 逻辑运算与逻辑表达式
例3-1的程序中,if((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0))的条件表达式中包含了逻辑运算符“||”和“&&”。逻辑表达式能够表达比关系表达式更复杂的条件。C语言中逻辑运算符包括“&&”(逻辑与)、“||”(逻辑或)和“!”(逻辑非)。
逻辑表达式是用逻辑运算符将运算对象连接起来的式子。运算对象可以是关系表达式和逻辑表达式。逻辑表达式的结果为真(1)或假(0)。表3-2是三种逻辑运算符的真值表。
逻辑与“&&”和逻辑或“||”为二元运算符,逻辑非“!”为一元运算符,“!”的优先级最高,“&&”的优先级次之,“||”的优先级最低。表3-3说明了算术运算符、关系运算符和逻辑运算符的优先级和运算的结合方向。
括号的优先级最高,它也可以使表达式更清晰易读。
若x=2,y=4,z=5,下面的表达式是合法的逻辑表达式:
xz>x+y等价于z>(x+y),结果为0(假)。
z&&!y+2等价于z&&((!y)+2),结果为1(真)。
z||y&&!x等价于z||(y&&(!x)),结果为1(真)。
5&&-1,5和-1均为非0值,为真,进行“与”运算的结果为1(真)。
注意 逻辑表达式在求解中,并不是所有的运算符都执行,当前面的表达式已经能够确定结果时,后面的运算符就不再执行。例如逻辑表达式a&&b&&c,当a为假时,不管b和c的值为真或假,结果均为假(0),所以当a为真时才判断b的值,当b为真时才判断c的值;表达式a||b||c,当a为真时,不管b和c的值为真或假,结果均为真(1),所以当a为假时才判断b的值,当b为假时才判断c的值。
3.2.3 基本的if语句
在解决实际问题时,经常会遇到根据不同的情况采取不同的行为的情形。C语言中的分支结构就是根据条件值选择要执行的语句,分支结果分为二分支选择结构和多分支选择结构,用if-else结构和switch-case结构实现。
基本的if语句有两种形式,if语句和if-else语句。
1.if语句
最简单的选择语句具有如下的语法结构:
if(表达式)
语句;
如果表达式为真,则执行if结构内的语句,否则不执行该语句,直接执行if结构后面的语句。执行流程如图3-1所示。
if语句中的表达式可以是任何表达式,如关系表达式、逻辑表达式或算术表达式,也可以是整数,只要表达式的值为0(假)或非0(真)即可。
【例3-2】 从键盘上输入一个整数,求其绝对值。
/*
程序名:prg3-2.c
功能:求一个整数的绝对值
*/
#include<stdio.h>
int main()
{
float dat;
printf("Enter a number: ");
scanf("%f", &dat);
if(dat < 0)
dat = -dat;
printf("the absolute value is %5.2f",dat);
return 0;
}
输出结果为:
Enter a number:-5.6
the absolute value is 5.60
例3-2中如果输入为正数或零,则跳过if语句直接打印;否则,执行if语句。
注意 如果if表达式为真时,要执行多条语句,要将多条语句用花括号括起来,构成一个复合句。一个复合句的通用格式如下:
if(表达式)
{
语句1;
语句2;
…
语句n;
}
例3-3说明了复合语句的使用。
【例3-3】 从键盘中输入两个数到little、large变量值中,如果little变量中的值大于large,则交换两个变量的值。
/*
程序名:prg3-3.c
功能:两个数little、large,如果little的值大于large,则交换两个变量的值
*/
#include<stdio.h>
int main()
{
float little,large,temp;
printf("Enter two numbers: ");
scanf("%f %f", &little,&large);
if(little>large)
{ //复合语句块,交换两个数的值
temp = little;
little = large;
large = temp;
}
printf("little = %5.2f, large = %5.2f",little,large);
return 0;
}
2.if-else语句
if-else语句的语法结构为:
if(表达式)
语句1;
else
语句2;
如果表达式为真,执行语句1,否则执行语句2,两者只能选择一个执行。当语句1或语句2有不止一条语句时构成复合语句,用花括号括起来,格式如下:
if(表达式)
{
语句1;
语句2;
…
语句n;
}
else
{
语句1;
语句2;
…
语句n;
}
if-else结构的执行流程如图3-2所示。
【例3-4】 从键盘输入两个数,输出两数相除的
结果。
/*
程序名:prg3-4.c
功能:求两个数相除的结果
*/
#include<stdio.h>
int main()
{
float num1,num2,result;
printf("Enter two numbers: ");
scanf("%f ,%f", &num1,&num2);
if(num2 != 0) //除数不能为0
{
result = num1 / num2;
printf("%5.2f / %5.2f= %5.2f",num1,num2,result);
}
else
printf("num2 can not be zero");
return 0;
}
运行结果1:
Enter two numbers: 6,2
6.00 / 2.00= 3.00
运行结果2:
Enter two numbers: 3, 0
num2 can not be zero