目录
一、逻辑运算
(一)关系运算符
1、关系运算符
关系运算,又称比较运算,将两个值进行比较;
在比较中使用的运算符就称为“关系运算符”
6种关系运算符含义及优先级
表出处:王健伟,《C++新经典》,清华大学出版社,2020年8月出版,表4.1
注:
【等于 "=="】 是两个等号,一定不能写成一个等号的【赋值 "="】
多个关系运算符不宜连用,关系运算符从左向右计算,连用时通常达不到想要的结果:
x < y < z
实际执行:(x < y) < z
要求:输入一个年龄,若年龄在18~36岁之间,输出“青年”
#include <stdio.h>
int main()
{
int age = 0;
printf("请输入年龄:");
scanf("%d", &age);
if(18 <= age <= 36)
printf("青年");
return 0;
}
结果是无论输入几岁都会输出青年
实际判断:(18 <= age) <= 36, 即 (0或1) 与 36 比较
改进:if(18 <= age && age <= 36)
2、关系表达式
(1)概念
用 关系运算符 将两个表达式连接起来的式子就叫关系表达式。
(2)表达式结果值
在 C语言中, “真”用 true 表示,也可以用1表示;“假”用 false 表示,也可以用 0 表示;
可以认为 true == 1,false == 0 ;
所以,关系表达式(比较)的结果值是 0 或者 1,也可以认为是 true 或者 false。
(二)逻辑操作符
1、逻辑操作符
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式
C语言提供的三种逻辑操作符
表出处:王健伟,《C++新经典》,清华大学出版社,2020年8月出版,表4.2
2、逻辑表达式
用逻辑运算符将关系表达式(比大小式子)连接起来,就构成了逻辑表达式
下面用 a 表示一堆表达式,b 表示另一堆表达式,来说明逻辑表达式的运算规则
逻辑运算真值表
表出处:王健伟,《C++新经典》,清华大学出版社,2020年8月出版,表4.3
运算规律总结:
&& 有假则假
|| 有真则真
! 取反
注: C语言中,参加运算的对象(或者说是表达式)非0表示真,0表示假;
逻辑判断的结果值不是真(==1),就是假(==0),
printf("结果为:%d\n", 4 && 5);
输出:结果为:1
参与【逻辑与(and)】运算的对象4和5都非0,都表示真,运算的结果值为真(==1)
int a = 6;
printf("结果为:%d\n", !a);
输出:结果为:0
参与【逻辑非(not)】运算的对象【6】非0,表示真,运算的结果值为假(==0)
3、短路求值
逻辑运算符还有一个特点:它总是先对左侧的表达式求值,再对右边的表达式求值;
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”,利用的正是运算规律总结:
&& 有假则假
|| 有真则真
if(month >= 3 && month <= 5)
如果是month >= 3进行判断运算时结果为假(==0),则不进行后面的判断运算
if(month == 12 || month == 1 || month == 2)
如果month == 12判断结果为真(==1),则不进行后面的判断运算
过程:【a (①是否满足)】逻辑操作符 【b(②是否满足)】 逻辑操作符 【c (③是否满足)】
(三)条件操作符
也被称为三目运算符(三个操作数,C语言中唯一一个三目运算符)
每个表达式都是运算对象(非0表示真,0表示假)
如果【表达式1】为真(非0),【表达式2】计算,计算的结果是整个表达式的结果;
如果【表达式1】为假(为0),【表达式3】计算,计算的结果是整个表达式的结果。
注:结合顺序为从右向左:
max = a > b? a:c > d? c:d
等价于
max = a > b? a:(c > d? c:d)
二、分支
进阶版条件操作符
(一)if 语句
if 语句来判断给定的条件是否满足,根据判断的结果决定执行什么样的操作
if 语句有三种形式:
1、if 语句
if (表达式)
语句;
执行流程:
表达式成立(非0,为真),则语句执行,
表达式不成立(0,为假),则语句不执行
注:
if 语句只能控制一条语句,所以 if(表达式)后加 “ ; ”就表示 if 语句控制的是空语句;
if(表达式);
多条语句用 { } 括起来(一块复合语句 { } 也是“一条语句”)
2、else
if(表达式)
语句1;
else
语句2;
执行流程:
表达式成立则执行语句1,否则执行语句2;
注:
else 语句也只能控制一条语句;
多条语句用 { } 括起来(一块复合语句 { } 也是“一条语句”)
3、if 嵌套语句
if(表达式1)
语句1;
else
{
if(表达式1)
语句2;
else
{
if(表达式3)
...
}
}
等价于
if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
...
执行流程:
如果判断表达式1成立,则执行语句1,否则看表达式2是否成立,则执行语句2......如果表达式m成立,则执行语句m......
4、else悬空问题
有多个 if 和 else ,且代码风格不好造成的
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
解决:else和最近的if匹配
(二)switch 语句
switch 语句是一种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重的else if 改成更易用、可读性更好的形式。
switch (表达式)
{
case 常量表达式1:
1或多条语句;
break;
case 常量表达式2:
1或多条语句;
break;
.
.
.
default:
1或多条语句;
break;
}
常量表达式:常量组成的表达式,如:"5"、"A"、"2+6" 等
执行流程:
switch后面表达式的值若满足(等于)任何某个case后面的常量表达式,则执行该case后面的1或多条语句,直到遇到break为止;
如果所有case条件都不满足:①不处理 ;②执行default中的语句来处理
注:
① switch后面的表达式可以是整型表达式,也可以是字符表达式;因为字符型数据和整型数据之间可以互通使用。【知识篇(一)、十二、(九)】;
② 各个case之间、case和default之间没有先后顺序,谁在上面or下面都行;
③ 绝对不要忘记break语句,如果某一个case语句的后面没有break语句,代码会继续往下执行,有可能执行其他case语句中的代码,直到遇到break语句或者switch语句结束;
④ case后面有多条语句,加不加大括号 { } 都行;
⑤ default可以没有,那么所有case都不满足的条件下,整个switch相当于没被执行;
⑥ 多个case条件可以挨着写在一起,其中任意一个条件成立时共用一组执行语句
case 3:
case 4:
printf("都很帅");
break;
三、循环
(一)while 、do...while 语句
1、while 语句
while(表达式)
语句;
执行流程:
首先执行判断表达式,表达式的值为0,循环直接结束;
表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
2、do...while 语句
do
语句;
while(表达式);
执行流程:
do...while 循环先直接执行循环语句,然后再执行 while 后的判断表达式,
表达式为真,就会进入下一次循环语句,表达式为假,退出循环
注:
do...while 循环体至少执行一次;
while 后面不要忘记分号
(二)for 语句
for(表达式1;表达式2;表达式3)
语句;
表达式1 用于循环变量的初始化
表达式2 用于结束循环的判断
表达式3 用于循环时变量的调整
执行流程:
首先执行【表达式1】初始化循环变量,
接下来执行【表达式2】的判断部分,如果【表达式2】 == 0 , 则结束循环;如果【表达式2】 !=0 则执行循环语句,
循环语句执行完后,再去执行【表达式3】,调整循环变量,再去【表达式2】执行判断,【表达式2】的结果是否为0,决定循环是否继续。
整个循环的过程中,【表达式1】初始化部分只被执行1次,剩下的就是【表达式2】、循环语句、【表达式3】在循环。
(三)循环控制语句(转向语句)
1、break
break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行循环后面的代码。
注:多重嵌套循环中,一个break只会跳出一层循环
2、continue
continue 是继续的意思,在循环中的作用就是跳过本次循环中 continue 后边的代码,继续进行下一次循环的判断。
3、goto
可以实现在同一个函数内跳转到设置好的标号处
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以建议是能不用尽量不去使用;
但是 goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出,使用 goto 就非常的方便了。
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto outside;
}
}
}
outside:
...
本来 for循环想提前退出得使用 break,一个 break 只能跳出一层 for循环,如果3层循环嵌套就得使用3个 break 才能跳出循环,所以在这种情况下我们使用 goto 语句就会更加的快捷。
四、有意思的点
(一)避免【等于 "==" 】写成【赋值 "=" 】的建议
当一个变量和一个常量比较相等的时候,为了避免 【等于 "==" 】 写成 【赋值 "=" 】 而不自知的情况,建议将常量写在 == 号左边
if (3 == a)...
(二)【逻辑非 "!"】的使用场景
#include <stdio.h>
int main()
{
int flag = 0;
if(!flag)
{
printf("do something\n");
}
return 0;
}
使用场景:当变量为假时,需要干什么;
flag 为假, ! flag 就是真,为真就可以通过 if 语句的判断;
所以上面的代码的意思就是 flag 为假,执行 if 语句中的代码。
以上博客内容仅供分享