C语言基础(三)
系列合集 初窥C语言
四、选择结构程序设计
4.1 关系运算与逻辑运算
4.1.1 关系运算符与关系表达式
符号 | 含义 |
---|---|
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
== | 等于 |
!= | 不等于 |
由低到高:赋值运算符 --> 关系运算符 --> 算术运算符
关系表达式:
一般形式为 :表达式 关系运算符 表达式
关系表达式的值是一个逻辑值,要么是“真”,要么是“假”
C语言没有逻辑型变量,用”1“表示”真“,用”0“表示”假“,视所有”非0“为真。
4.1.2 逻辑运算符与逻辑表达式
1)&&(逻辑与)and
2)||(逻辑或)or
3)!(逻辑非)not
由低到高:赋值运算符 --> && 和 || --> 关系运算符 --> 算术运算符 --> !(非)
说明:
1)&& 和 ||是双目运算符,它要求有两个运算量,例如:(a>b)||(x>y)
2)!是单目运算符,它只要求一个运算量,例如:!(a>b)
逻辑表达式:
1)一般形式:表达式 逻辑运算符 表达式
2)运算规则:只有在必须执行下一个表达式才能求解时,才求解该表达式(并不是所有的表达式都被求解)即短路运算
3)对于逻辑与(&&)运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数。
4)对于逻辑或(||)运算,如果第一个操作数被判定为“真”,系统不再判定或求解第二操作数。
5)&&和||是逻辑运算,&与|是位运算
6)&&同真为真,有假为假,||同假为假,有真为真
4.2 if选择结构
4.2.1 if语句的作用
用来判定所给定的条件是否满足,并根据判定的结果(真或假)决定执行给出的两种操作之一。
例如:
if(x > 0){
printf("%f",x);
}else {
printf("%f",-x);
}
4.2.2 if语句三种基本形式
(1)if
(2)if-else
(3)if-else if
前两种形式的if语句一般用于两个分支的情况,当有多个分支选择时,用第三种形式。
if(表达式1)
语句1;
else if(表达式2)
语句2;
...
else if(表达式(n-1))
语句(n-1);
else
语句n;
其语义为:
依此判断表达式的值,
当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。
如果所有的表达式均为假,则执行最后else所在的语句n,然后继续执行后续程序。
4.2.3 if语句注意的问题
1)在三种形式的if语句中,在if关键字之后均为表达式。
2)该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至可以是一个变量。如:if(b),只要表达式的值为非0,即为真。
3)在if语句中,条件判断表达式必须用括号括起来,单条语句之后必须加分号“;”。
如:if(a>b)max = a;
4)在if语句的三种形式中,如果想在满足条件时执行多个语句,要用大括号{}括起来组成一个复合语句,但要注意“}”后不要加分号“;”。
4.2.4 if语句的嵌套
可以在if语句中又包含一个或多个if语句。
if()
if() 语句1;
else 语句2;
else
if() 语句3;
else 语句4;
else总是与它前面最近的if配对
4.3 条件运算
条件运算符:?(三目运算符)
格式:表达式1 ?表达式2 : 表达式3
使用场合: 若在if语句中,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值时,可以用一个条件运算符处理。
如:
if(a > b) max = a;
else max = b;
可以写成
max = (a > b) ? a : b;
说明:
1)条件运算符符运算优先级低于关系运算符和算术运算符,但高于赋值运算符
2)条件运算符?和:是一对运算符,不能分开单独使用
3)条件运算符的结合方向是自右至左
#include<stdio.h>
#include<stdlib.h>
int main() {
int max = 0;
int i = 10, j =8, k = 5;
max = i > j ? i > k ? i : k : j > k ? j : k;
printf("max = %d\n", max);
return 0;
}
//先判断 j > k ? j : k
//再判断 i > k ? i : k
//最后再到 i > j ? i > k
//可以这样理解 i > j ? (i > k ? i : k) : (j > k ? j : k);
4.4 switch多分支选择结构
一般形式:
switch(表达式){
case 常量表达式1:语句1;
case 常量表达式2:语句2;
...
case 常量表达式n-1: 语句n-1;
default:语句n;
}
说明:
1)在case后面的各常量表达式的值不能相同,否则会出现错误。
2)在case后,允许有多个语句,可以不用{}括起来,没有语句是,什么也不做,执行后面case的语句,直到遇到break。
3)各case和default子句的先后顺序可以变动,不会影响程序执行结果。但是当default不在末尾时,如果执行了,又没有break语句,那么会继续依次执行下面的语句块,直到遇到break。(default语句会在所有case语句不符合的情况下执行)
4)default子句可以省略不用。
4.5 程序举例
//很简单的题
1.路程(s)越远,每公里运费越低。标准如下:
s<250km | 没有折扣 |
250<=s<500 | 2%折扣 |
500<=s<1000 | 5%折扣 |
1000<=s<2000 | 8%折扣 |
2000<=s<3000 | 10%折扣 |
3000<=s | 15%折扣 |
设每公里每吨货物的基本运费为P,货物重为w,折扣为d,则总运费f的计算公式为:
f = pws*(1-d)
#include <stdio.h>
int main()
{
int c, s;
float p, w, d, f;
scanf("%f %f %d", &p, &w, &s);
if(s > 3000) c = 12;
else c = s/250;
switch(c){
case 0: d = 0; break;
case 1: d = 2; break;
case 2:
case 3: d = 5; break;
case 4:
case 5:
case 6:
case 7: d = 8; break;
case 8:
case 9:
case 10:
case 11: d = 10; break;
case 12: d = 15; break;
}
f = p*w*s*(1-d/100.0);
printf("freight = %15.4f",f);
}
2.比较两个数的大小关系
#include <stdio.h>
int main()
{
int a, b;
printf("please input A,B: ");
scanf("%d %d", &a, &b);
if(a != b){
if(a > b) printf("A>B\n");
else printf("A<B\n");
}else printf("A=B\n");
}
3.逻辑表达式
#include <stdio.h>
int main()
{
char c = 'k';
int i = 1, j = 2, k = 3;
float x = 3e+5, y = 0.85;
printf("%d,%d\n", !x*!y, !!!x);
printf("%d,%d\n", x || i && j-3, i < j && x < y);
printf("%d,%d\n", i == 5 && c && (j-8), x + y || i + j + k);
}
//0,0
//1,0
//0,1