本文已参与[新人创作礼]活动,一起开启掘金创作之路
一.关系运算符和关系表达式
1.关系运算符
关系运算符 | 含 义 | 数学中的表示 |
---|---|---|
< | 小于 | < |
<= | 小于或等于 | ≤ |
大于 | > | |
>= | 大于或等于 | ≥ |
== | 等于 | = |
!= | 不等于 | ≠ |
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。
c>a+b //运算符由高到低的顺序是+,>
a>b==c //运算符由高到低的顺序是>, ==
a==b<c //运算符由高到低的顺序是<, ==
a=b>c //运算符由高到低的顺序是>, =
a>b==c,a=b!c //运算符由高到低的顺序是>,==和!=,=,
2.关系表达式的值
关系表达式的值是一个逻辑值,数学中用“真,假”来表示,C语言中用1和0表示。当表达式成立时为1,否则为0.
c>=a+b //关系表达式,值为1
a>b==c //关系表达式,值为0
a==b<c //关系表达式,值为1
a=b>c //赋值表达式,值为0,因a的值为0,a为何为0?因b>c不成立
a>b==c,a=b!=c //逗号表达式,值为1,执行后a的值为1
f=c>b>a //赋值表达式,值为0,因c>b>a的结果为0
二.逻辑运算符和逻辑表达式
1.逻辑运算符
运算符 | 说明 | 结合性 | 举例 |
---|---|---|---|
&& | 与运算,双目,对应数学中的“且” | 左结合 | 1&&0、(9>3)&&(b>a) |
|| | 或运算,双目,对应数学中的“或” | 左结合 | 1||0、(9>3)||(b>a) |
! | 非运算,单目,对应数学中的“非” | 右结合 | !a、!(2<5) |
&&和||都是双目运算符,!是单目运算符,优先级如下
2.逻辑表达式
5&&0 //(参与运算的两个表达式都为真时,结果才为真,否则为假。)5为真,0 为假,相与的结果为假,也就是 0。
10 || 0 //(参与运算的两个表达式只要有一个为真,结果就为真;)两个表达式都 为假时结果才为假。10为真,0为假,相或的结果为真,也就是 1。
!0 //(参与运算的表达式为真时,结果为假;参与运算的表达式为假时,结果 为真。)0 为假,非运算的结果为真,也就是 1。
逻辑表达式求解时的短路效应
逻辑与&& 和逻辑或|| 的结合性都是从左到右,在求解包含&&或||的表达式,都是先计算运算符左边的式子,一旦确定整个表达式的值,右边就不再求解了
int a = 1, b = 10, c = 2;
printf("%d,", (a = b) || (c = b));
printf("%d,%d,%d\n", a, b, c);
运行结果:
1,10,10,2
可以看到,c的值还是原来的2,说明c=b并没有被执行。
原因:表达式(a = b) || (c = b)的计算顺序是先求解||左侧的a=b,其值为10 (因a=b是赋值),因为左侧已经为真,所以右侧 c=b已经不用求解了,故c为2不变 。
三. if语句
1.if 格式
if 和 else 是两个新的关键字,if 意为“如果”,else 意为“否则”,用来对条件进行判断,并根据判断结果执行不同的语句。总结起来,if else 的结构为:
if (判断条件){
语句块1
} else {
语句块2
}
意思是,如果判断条件成立,那么执行语句块1,否则执行语句块2 。其执行过程可表示为下图:
2.用案例让你体会if , else if,else
****输入二蛋分数,如果100为满分,高于等于80分优秀,高于等于60分及格,50和60之间差一点 ,低于50分不合格。
int n; //表示要输入的分数
printf("输入二蛋分数");
scanf_s("%d", &n);
if (n == 100) {
printf("满分");
}
if (n >= 80) {
printf("优秀");
}
if (n >= 60) {
printf("及格");
}
if (n >= 50 && n < 60) {
printf("差一点");
}
if (n < 50) {
printf("不合格");
}
用100测试一下
出现此结果的原因:100属于即在满分的区间也在优秀和及格的区间里,而我们需要的是输出满分就可以了。改正一下:
int n; //表示要输入的分数
printf("输入二蛋分数");
scanf_s("%d", &n);
if (n == 100) {
printf("满分");
}
else if (n >= 80) {
printf("优秀");
}
else if (n >= 60) {
printf("及格");
}
else if (n >= 50 && n < 60) {
printf("差一点");
}
else if (n < 50) {
printf("不合格");
}
这里使用了else if:
一旦遇到能够成立的判断条件,则不再执行其他的语句块,所以最终只能有一个语句块被执行,100遇到了第一个成立的条件,然后跳出,不执行其他语句块。
或者最后一个else if 可以改为如下:
else
printf("不合格");
else 表示其他的条件都不成立时执行此条件
四.表达式1?:表达式2:表达式3
其求值规则是,若表达式1的逻辑值为真,则条件表达式的值等于表达式2的值,否则等于表达式3的值
int a=1,b=3, c;
c=a>b?a:b; //表示,如果a>b时c=a,否则c=b;
最大值表示函数:
int max(int a,int b){
int max;
return max=a>b?a:b;
}
最小值
int min(int a,int b){
int min;
return min=a<b?a:b;
}
五.switch语句
1.switch 是另外一种选择结构的语句
用来代替简单的、拥有多个分枝的 if else 语句,基本格式如下:
switch(表达式){
case 整型数值1: 语句 1;
case 整型数值2: 语句 2;
......
case 整型数值n: 语句 n;
default: 语句 n+1;
}
它的执行过程是:
(1) 首先计算“表达式”的值,假设为 d。
(2) 从第一个 case 开始,比较“整型数值1”和 d,如果它们相等,就执行冒号后面的所有语句,也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功。
(3) 如果“整型数值1”和d 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 d 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。
(4) 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
2.实例
int a;
printf("成绩");
scanf_s("%d", &a);
switch (a/10) {
case 10: printf("A\n");
case 9: printf("B\n");
case 8: printf("C\n");
case 7: printf("D\n");
case 6: printf("E\n");
case 5: printf("F\n");
case 3: printf("G\n");
case 2: printf("H\n");
case 1: printf("I\n");
default:printf("error\n");
}
return 0;
输入成绩100, 100/10=10满足case 10
输出结果如下
我们本意想输出A即可,但是其余BCD……全部都被输出,这本不是我们想要的结果
这时我们使用 break
break 是C语言中的一个关键字,专门用于跳出 switch 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。
int main() {
int a;
printf("成绩");
scanf_s("%d", &a);
switch (a/10) {
case 10: printf("A\n"); break;
case 9: printf("B\n"); break;
case 8: printf("C\n"); break;
case 7: printf("D\n"); break;
case 6: printf("E\n"); break;
case 5: printf("F\n"); break;
case 3: printf("G\n"); break;
case 2: printf("H\n"); break;
case 1: printf("I\n"); break;
default:printf("error\n");
}
return 0;
}