目录
五、选择结构程序设计
在C语言中,选择结构是用if语句实现的。if语句最常用的形式如下:
if(关系表达式) 语句1 else 语句2
例如:
if(x>0)
y=1;
else
y=-1;
其中 x>0 是一个关系表达式;">" 是一个关系运算符。
5.1关系运算符和关系表达式
关系运算是逻辑运算中比较简单的一种。所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断其比较的结果是否符合给定的条件。符合即为“真”,不符合即为“假”。
关系运算符机器优先次序
C语言提供6种关系运算符:
-
< 、<= 、> 、>= 优先级相同(高)
-
== 、 != 优先级相同(低)
关于优先次序:
赋值运算符 < 关系运算符 < 算术运算符
5.2逻辑运算符和逻辑表达式
用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。在BASIC和Pascal语言中有以下形式的逻辑表达式(AND是逻辑运算符):
(a>b) AND (x>y)
如果(a>b) 且 (x>y) ,则上述逻辑表达式的值为"真"。
逻辑运算符及其优先次序:
C语言提供3种逻辑运算符:
-
&& 逻辑与 (相当于其他语言中的AND)
-
|| 逻辑或 (相当于其他语言中的OR)
-
!逻辑非 (相当于其他语言中的NOT)
运算举例:
a&&b // 若a、b为真,则a&&b为真
a||b //若a、b其中一个为真,则a||b为真
!a //若a为真,则!a为假
运算符的优先性:
赋值运算符 < &&和|| < 关系运算符 < 算术运算符 < !(非)
逻辑表达式
逻辑表达式的值应该是一个逻辑量“真”或“假”。C语言编译系统在表示逻辑运算结果时,以数值1代表“真”,以数值0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。即一个非零的数值默认为“真”。
逻辑运算的真值表
a | b | !a | !b | a&&b | a||b |
---|---|---|---|---|---|
非0 | 非0 | 0 | 0 | 1 | 1 |
非0 | 0 | 0 | 1 | 0 | 1 |
0 | 非0 | 1 | 0 | 0 | 1 |
0 | 0 | 1 | 1 | 0 | 0 |
小例子:
要判断用year表示的某一年是否为闰年。
闰年条件:能被4整除,但不能被100整除或者能被400整除.
可以用一个逻辑表达式来表示:
(year % 4 == 0 && year % 100 != 0) || year % 400 == 0 //表达式的值为1时,为闰年,否则为非闰年
可以加!来判别非闰年
!((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ) //表达式的值为1时,为非闰年,否则为闰年
5.3if语句
if语句是用来判定所给的条件是否满足,根据判定的结果(真或假)来决定执行给出的两种操作之一。
if语句的3种形式:
//eg1:
if(x>y) printf("%d",x);
//eg2:
if(x>y)
printf("%d",x);
else
printf("%d",y);
//eg3:
if(num>500) cost=0.15;
else if (num>300) cost=0.10;
else if (num>100) cost=0.075;
else if (num>50) cost=0.05;
else cost=0;
输入两个实数,按代数值由小到大的顺序输出者两个数。
#include<stdio.h>
int main()
{
float a,b,t;
scanf("%f%f",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
}
printf("%.2f,%.2f\n",a,b);
return 0;
}
输入3个数a、b、c,要求从小到大的顺序输出。
#include<stdio.h>
int main()
{
float a,b,c,t;
scanf("%f%f%f",&a,&b,&c);
if(a>b)
{
t=a; //实现a和b的互换
a=b;
b=t;
}
if(a>c) //实现a和c的互换
{
t=a;
a=c;
c=t;
}
if(b>c) //实现b和c的互换
{
t=b;
b=c;
c=t;
}
printf("%.2f,%.2f,%.2f\n",a,b,c);
return 0;
}
条件运算符
条件运算符要求有3个操作对象,称三目(元)运算符,它是C语言中唯一的一个三目运算符。条件表达式的一般形式为:
表达式1 ? 表达式2 :表达式3
max = (a>b)?a:b;
//它是这个执行的:
//如果a条件为真,则条件表达式取值a,否则取值b
又因为条件运算符的优先级别比关系运算符和算术运算符都低。因此可以写成
max = a>b?a:b;
//如果有这样的
a>b?a:b+1; //相当于 a>b?a:(b+1);
条件运算符的结合方向为“自右向左”。如果有以下条件的表达式:
a>b?a:c>d?c:d //相当于 a>b?(c>d?c:d)
条件表达式还可以写成以下表达形式:
a>b?(a==100):(b==100);
//或
a>b? printf("%d",a):printf("%d",b);
即“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或者函数表达式。
例子:输入一个字符,判断它是否大写字母,如果是,将它转换成小写字母,如果不是,不转换。然后输出最后得到的字符。
#include<stdio.h>
int main()
{
char ch;
scanf("%c",&ch);
ch = (ch>='A'&&ch<='Z')?(ch+32):ch;
printf("%c\n",ch);
return 0;
}
5.4switch语句
switch语句是多分支选择语句。
switch(表达式):
{
case 常量表达式1: 语句1;
case 常量表达式2: 语句2;
... ...
case 常量表达式n: 语句n;
default: 语句n+1;
}
说明:
-
switch后面括号内的表达式,其值可以是整型 ,字符型,枚举型等数据;
-
当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所以的case中的常量表达式的值都没有与表达式的值匹配的时候,就执行default后面的语句。
-
每一个case的常量表达式的值必须互不相同;否则就会出现互相矛盾的现象。
-
执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case常量表达式“只是起语句标号作用,并不是在该出进行条件判断。在只想switch语句时,根据switch后面表达式的值找到匹配的入口标号,就会从此标号执行下去,不再进行判断。
例子:
switch(grade) { case 'A':printf("85~100\n"); case 'B':printf("70~85\n"); case 'C':printf("60~69\n"); case 'D':printf("<60\n"); default: printf("error\n"); } //假设 grade='A'; //会连续输出: 85~100 70~85 60~69 <60 error
因此,应该在执行一个case分支后,使流程跳出switch结构,终止switch语句的执行。
可以用一个break语句来达到此目的。将上面的switch结构改写为:
switch(grade) { case 'A':printf("85~100\n");break; case 'B':printf("70~85\n");break; case 'C':printf("60~69\n");break; case 'D':printf("<60\n");break; default: printf("error\n"); } //假设 grade='A'; //出: 85~100
声明:本文章为个人学习笔记,资料整理参考谭浩强《C程序设计(第三版)》如有错误,欢迎大家指正!