目录
一、关系运算符和逻辑运算符
1.关系运算符
2.关系表达式
3.逻辑运算符
4.逻辑表达式
5.短路求值
二、if语句
1.形式一
2.形式二
3.形式三
三、分支结构的嵌套
1.分支结构的嵌套
2.悬挂else
3.等于号带来的问题
一、关系运算符和逻辑运算符
1.关系运算符
使用关系运算符来比较两个数的大小关系。
- 优先级相同(高):<、<=、>、>=
- 优先级相同(低):==、!=
2.关系表达式
用关系运算符将两边的变量、数据或表达式连接起来,称之为关系表达式。
关系表达式得到的值是一个逻辑值,即真或假,在C语言的逻辑运算中,用数字1表示真,用数字0表示假。
- 1 <2 (其值为1)
- a > b
- a <= 1 + b
- 'a' + 'b' <= 'c'
- (a = 3) > (b = 5) (其值为0)
代码举例:
#includeint main() { int a = 5,b = 3; printf("%dn", 1 < 2); printf("%dn", a > b); printf("%dn", a <= b + 1); printf("%dn", 'a' + 'b' <= 'c'); printf("%dn", (a = 3) > (b = 5)); return 0; }
运行结果:
3.逻辑运算符
C语言一共提供了3种逻辑运算符:
| 运算符 | 含义 | 优先级 | 举例 | 说明 |
|---|---|---|---|---|
| ! | 逻辑非 | 高 | !a | 如果a为真,!a为假; 如果a为假,!a为真。 |
| && | 逻辑与 | 中 | a && b | 只有a和b同时为真,结果才为真; 只要a和b其中一个为假,结果为假。 |
| || | 逻辑或 | 低 | a || b | 只要a或b其中一个为真,结果为真; 只有a和b同时为假,结果才为假。 |
4.逻辑表达式
用逻辑运算符将两边的变量、数据或表达式连接起来,称之为逻辑表达式。
- 3 > 1 && 1 < 2(结果为真)
- 3 + 1 || 2 == 0(结果为真)
- !(a + b)
- !0 + 1 < 1 || ! (3 + 4)
- 'a' - 'b' && 'c'
代码举例:
#includeint main() { int a = 5,b = 3; printf("%dn", 3 > 1 && 1 < 2); printf("%dn", 3 + 1 || 2 == 0); printf("%dn", !(a + b)); printf("%dn", !0 + 1 < 1 || !(3 + 4)); printf("%dn", 'a' - 'b' && 'c');//97-98非0则为真,99非0也为真 return 0; }
运行结果:
5.短路求值
- 短路求值又称最小化求值,是一种逻辑运算符的求值策略。只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值。
- C语言对于逻辑与和逻辑或采用短路求值的方式。
代码举例:
#includeint main() { int a = 3,b = 3; (a = 0) && (b = 5); printf("a = %d,b = %dn",a,b); (a = 1) && (b = 5); printf("a = %d,b = %dn",a,b); return 0; }
运行结果:
二、if语句
1.形式一
if(表达式)
{
…… //逻辑值为真所执行的语句、程序块
}
if(表达式)
{
…… //逻辑值为真所执行的语句、程序块
}
代码举例:
#includeint main() { int i; printf("您老贵庚啊:"); scanf("%d",&i); if(i >= 18) { printf("进门左拐!n"); } return 0; }
运行结果:
若将if语句的{},缩进都删掉,也可以正常运行(因为只有一个语句),如下:
#includeint main() { int i; printf("您老贵庚啊:"); scanf("%d",&i); if(i >= 18) printf("进门左拐!n"); return 0; }
2.形式二
if(表达式)
{
…… //逻辑值为真所执行的语句、程序块
}
else
{
…… //逻辑值为假所执行的语句、程序块
}
代码举例:
#includeint main() { int i; printf("您老贵庚啊:"); scanf("%d",&i); if(i >= 18) { printf("进门左拐!n"); } else { printf("慢走,不送!"); } return 0; }
运行结果:
3.形式三
if(表达式1)
{
……
}
else if(表达式2)
{
……
}
else if(表达式3)
{
……
}
…
else if(表达式n)
{
……
}
else
{
…… //1,2,…,n的表达式返回值均为 0 时执行
}
代码实战:
用C语言实现一个按分数评级的程序:
- 90分及以上:A;
- 80-90分:B;
- 70-80分:C;
- 60-70分:D;
- 低于60分:E
代码如下:
#includeint main() { int i; printf("请输入分数:"); scanf("%d",&i); if(i > 90) { printf("An"); } else if(i >= 80 && i < 90) { printf("Bn"); } else if(i >= 70 && i < 80) { printf("Cn"); } else if(i >= 60 && i < 70) { printf("Dn"); } else { printf("En"); } return 0; }
运行结果:
三、 switch语句
switch(表达式)
{
case 常量表达式1:语句或程序块1
case 常量表达式2:语句或程序块2
……
case 常量表达式n:语句或程序块n
default:语句或程序块n+1
}
代码实战:通过评级来反馈分数范围
代码如下:
#includeint main() { char ch; printf("请输入成绩:"); scanf("%c",&ch); switch(ch) { case 'A':printf("你的成绩在90分以上!n"); case 'B':printf("你的成绩在80-90之间!n"); case 'C':printf("你的成绩在70-80之间!n"); case 'D':printf("你的成绩在60-70之间!n"); case 'E':printf("你的成绩在60分以下!n"); default:printf("请输入有效的成绩评级!"); } return 0; }
运行结果:
可见,不止打印了应有的范围,还把其余在其之下的语句均执行了一次。此时,需要break语句来跳出整个switch语句。修改如下:
#includeint main() { char ch; printf("请输入成绩:"); scanf("%c",&ch); switch(ch) { case 'A':printf("你的成绩在90分以上!n");break; case 'B':printf("你的成绩在80-90之间!n");break; case 'C':printf("你的成绩在70-80之间!n");break; case 'D':printf("你的成绩在60-70之间!n");break; case 'E':printf("你的成绩在60分以下!n");break; default:printf("请输入有效的成绩评级!");break; } return 0; }
重新运行如下:
三、分支结构的嵌套
1.分支结构的嵌套
分支结构程序设计:将一切需要让程序进行判断和选择的设计称为分支结构程序设计。
代码实战:根据流程图编写代码
代码如下:
#includeint main() { int a,b; printf("请输入两个数:"); scanf("%d %d",&a,&b); if(a != b) { if(a > b) { printf("%d > %dn",a,b); } else { printf("%d < %dn",a,b); } } else { printf("%d = %dn",a,b); } return 0; }
运行结果:
2.悬挂else
在if语句省略{}时,esle始终与最接近它的if语句匹配,与其跟哪个if语句对齐无关。
代码举例:
#includeint main() { char isRain,isFree; printf("是否有空?(Y/N)"); scanf("%c",&isFree); getchar();//过滤回车 printf("是否下雨?(Y/N)"); scanf("%c",&isRain); if(isFree == 'Y'){ if(isRain == 'Y'){ printf("记得带伞哟n"); } } else { printf("没空!n"); } return 0; }
运行结果:
3.等于号带来的问题
需注意:‘=’是赋值运算符,‘==’才是比较运算符
代码举例:
#includeint main() { char hasBF; printf("小花你有男朋友吗?(Y/N)"); scanf("%c",&hasBF); if(hasBF = 'Y') { printf("那…祝福你们喽!n"); } else{ printf("那我们在一起吧!n"); } return 0; }
运行结果:
可见,打印结果并不是我们期望的,这是因为 hasBF = 'Y' ,把Y赋值给了hasBF,值为真,故永远不会执行值为假的语句。只要把‘=’改成‘==’即可解决这个问题,修改后运行结果为:



