第四章 选择结构
4.1 关系运算和逻辑运算关系表达式和逻辑表达式的运算结果得到一个逻辑值:真或者假。
C语言中没有专门的逻辑值,用零表示假,用非零值表示真 --非零即为真
4.1.1 C语言中的逻辑值
1、关系运算符在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。 在C语言中有以下 6种关系运算符:
< 小于 <= 小于或等于 > 大于
>= 大于或等于 == 等于 != 不等于关系运算符都是双目运算符,其结合性均为左结合。 关系运算符的优先级低于算术运算符,高于赋值运算符。 在六个关系运算符中,<,<=,>,>=的优先级相同,高于 ==和 !=,==和 !=的优先级相同。
4.1.2 关系运算符和关系表达式
2、关系表达式关系表达式的一般形式为:
表达式 关系运算符 表达式例如,a+b>c-d,x>3/2,'a'+1<c,-i-5*j==k+1;都是合法的关系表达式。由于表达式也可以又是关系表达式。 因此也允许出现嵌套的情况,例如,a>(b>c),a!=(c==d)等。关系表达式的值是
“真”或“假”,分别用,1”和,0”表示。
如,5>0的值为“真”,即为 1。
(a=3)>(b=5)由于 3>5不成立,故其值为假,即为 0。
4.1.2 关系运算符和关系表达式一、逻辑运算符
C语言中提供了三种逻辑运算符
&& 与运算 || 或运算 ! 非运算
1.与运算 &&
参与运算的两个量都为真时,结果才为真,否则为假。
例如,5>0 && 4>2,由于 5>0为真,4>2也为真,相与的结果也为真。
2.或运算 ||
参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。
例如,5>0||5>8,由于 5>0为真,相或的结果也就为真。
4.1.3 逻辑运算符和逻辑表达式
3.非运算 !
参与运算量为真时,结果为假;参与运算量为假时,结果为真。
例如,!(5>0)的结果为假。
虽然C编译在给出逻辑运算值时,以,1”代表“真”,,0
”代表“假”。 但反过来在判断一个量是为“真”还是为“假
”时,以,0”代表“假”,以非,0”的数值作为“真”。
例如:由于 5和 3均为非,0”因此 5&&3的值为“真”,即为
1。又如,5||0的值为“真”,即为 1。
与运算符 &&和或运算符 ||均为双目运算符。具有左结合性
。 非运算符 !为单目运算符,具有右结合性。
4.1.3 逻辑运算符和逻辑表达式二、逻辑表达式逻辑表达式的一般形式为:
表达式 逻辑运算符 表达式其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。
例如,(a&&b)&&c
根据逻辑运算符的左结合性,上式也可写为:
a&&b&&c
逻辑表达式的值是式中各种逻辑运算的最后值,以,1”和
,0”分别代表“真”和“假”。
4.1.3 逻辑运算符和逻辑表达式
4.2.1 if语句
4.2 if语句和用 if语句构成的选择结构表达式语句
= 0
0
形式 1 if(表达式 ) 语句功能,当表达式值非 0时,执行语句,否则不执行语句,
其流程图,
例如,
if (x>y) printf(“%d”,x);
4.2.1 if语句例题,
main()
{
int a,b,max;
printf("\n input two numbers,");
scanf("%d%d",&a,&b);
max=a;
if (max<b) max=b;
printf("max=%d",max);
}
本例程序中,输入两个数 a,b。把 a先赋予变量 max,再用 if
语句判别 max和 b的大小,如 max小于 b,则把 b赋予 max。因此 max中总是大数,最后输出 max的值。
4.2.1 if语句形式 2,if(表达式 )语句 A else 语句 B
功能,表达式为非 0,执行语句 A;表达式为 0,执行语句 B
其流程图,
表达式语句 A 语句 B
0 = 0
例,if(x>y)
printf("%d",x);
else printf(" %d",y);
4.2.1 if语句例题,
main()
{
int a,b;
printf("input two numbers,");
scanf("%d%d",&a,&b);
if(a>b)
printf("max=%d\n",a);
else
printf("max=%d\n",b);
}
输入两个整数,输出其中的大数。改用 if-else语句判别 a,b
的大小,若 a大,则输出 a,否则输出 b。
4.2.2 嵌套的 if语句
1,在 if子句中嵌套具有 else子句的 if语句:
if(表达式 1)
if(表达式 2) 语句 1
else 语句 2
else
语句 3
2,在 if子句中嵌套不含 else子句的 if语句:
if(表达式 1)
{ if(表达式 2) 语句 1 }
else
语句 2
4.2.2 嵌套的 if语句
3,在 else子句中嵌套 if语句,if(表达式 1) 语句 1
else if(表达式 2) 语句 2
else 语句 3
4,多层嵌套,if(表达式 1)
语句 1
else if(表达式 2)
语句 2
else if(表达式 3)
语句 3

else if(表达式 m)
语句 m
else
语句 n
C语言规定,else 总是与它前面最近的 if配对
1,条件运算符?:
是 C语言唯一的一个三目运算符,
2,条件表达式一般形式是,
表达式 1? 表达式,表达式 3
3,条件表达式的运算功能先求表达式 1的值,若为真,则求表达式 2 的值并把它作为整个表达式的值 ;若表达式 1 的值为假,则求表达式 3 的值并把它作为整个表达式的值。
例,if (a>b) max = a ;
else max = b ;
等价于 max = (a>b)? a,b ;
4.3 条件表达式构成的选择结构
4,条件运算符的优先级
4.3 条件表达式构成的选择结构算术运算符关系运算符条件运算符赋值运算符
(高)
(低)
条件运算符结合性为从右至左运算符优先级:逻辑非,算术运算,关系运算,逻辑与,逻辑或,条件运算,赋值运算,逗号运算
4.4 switch语句及用 switch语句和 break语句构成的选择结构当某一表达式有 n个取值,每一取值执行一语句,则如果用内嵌 if会 十分繁锁,而用 switch语句简洁明了一般形式为,
switch(表达式 )
{ case 常量 表达式 1,语句 1或空 ;
case 常量 表达式 2,语句 2或空 ;
.
.
case 常量 表达式 n,语句 n或空 ;
default,语句 n+1或空 ;
}
4.4.1 switch语句执行 switch语句时,将表达式的值逐个与 case后的常量进行比较,若与其中一个相等,则执行该常量下的语句,若不与任何一个常量相等,则执行 default 后面的语句。
¤switch后面括号中的表达式的值,只能是整型或字符型。
¤常量表达式的类型必须与 switch中表达式类型相同。
¤每一个 case后常量表达式的值必须互不相同,否则出现矛盾
¤每个 case或 default后的语句可以是复合语句,不需要使用 "{"
和 "}"括起来。
4.4.2 switch语句的执行过程执行完一个 case后面语句后,流程控制转移到下一个 case 继续执行。因此,若想在不同情况下执行不同的语句,必须使用 break语句。
break语句的功能:将程序流程控制跳出整个 switch
语句,执行 switch语句的下一条语句。
4.4.3 在 switch语句体中使用 break语句例题:
main()
{
int g;
scanf("%d",&g);
switch (g/10)
{
case 10:
case 9:printf("\n优秀 ");break;
case 8:printf(“\n优良 ");break;
case 7:printf("\n良好 ");break;
case 6:printf("\n及格 ");break;
default,printf("\n不及格 ");
}
printf("Ok!");
}
4.4.3 在 switch语句体中使用 break语句输入,65 则输出:
及格 Ok;
思考:如果去掉
break语句,结果如何?
C语言中,可以在任何语句前加上语句标号。
标号可以是任意合法的标识符。
用法,标识符后加上一个冒号就构成了一个语句标号通常,语句标号用做 goto的转向目标
4.5.1 语句标号
4.5 语句标号和 goto语句形式,goto标号 ;
功能,程序无条件跳到语句标号位置,继续执行程序。
(1) 在程序中,必须有语句标号表明的位置。
(2) 使用 goto的应遵守的原则,goto语句只向下跳转;
goto从内层向外层。
(3) goto语句将使程序的流程变得毫无规律,可读性差,应尽量少用。
4.5.2 goto语句