文章目录
1.if语句
1.1 if
if语句我们可以用来根据表达式是否为真,来确定语句是否执行。
C语言中非零即为真。除了0之外都是真。
if(表达式)
语句;
这里,如果表达式为真,则执行语句。如果表达式为假,则不执行语句。
1.2 分⽀中包含多条语句
if(表达式)
语句1;
语句2;
这个例子里面,如果表达式为真,则执行语句1。然后执行语句2。
如果表达式为假,则不执行语句1。然后执行语句2。
这里面和1.1
里面有所不同,因为默认在 if 和 else 语句中默认都只控制一条语句。
也就是说,1.2
里面的例子相当于
if(表达式){
语句1;
}
语句2;
😊这么说应该能明白了。
如果要语句1和语句2都执行的话要怎么办呢?
if(表达式){
语句1;
语句2;
}
这个时候我们只要用大括号{}
把语句1和语句2括起来就可以了。
1.3 if else
如果说,想要根据表达式来进行语句执行的筛选操作,就可以用if else
语句。这么说可能有点迷糊,下面我举个例子。
例如:想要根据成绩来确定自己有没有及格?
int main() {
int score = 0;//定义成绩是score这个变量
scanf("%d", &score);//输入成绩
if (score >= 60) {
printf("成绩合格\n");//如果成绩大于等于60分,就输出成绩合格
}
else {
printf("成绩不合格\n");//否则,就输出成绩不合格
}
}
1.4 嵌套if
那如果成绩有好多个等级,那我们怎么写呢?
这个时候,我们可以用else if
语句来构成多重判断。
else if
中间有个空格的,这个要注意!
例如:score>=90优秀,70<=score<90良好 ,60<=score<70合格,score<60不合格。
int main() {
int score = 0;//定义成绩是score这个变量
scanf("%d", &score);//输入成绩
if (score >= 90) {
printf("成绩优秀。\n");//如果成绩90<=score,就输出成绩优秀
}
else if (70 <= score < 90) {//如果成绩70<=score<90,就输出成绩良好
printf("成绩良好。\n");
}
else if (60 <= score < 70) {//如果成绩60<=score<70,就输出成绩合格
printf("成绩合格。\n");
}
else {
printf("成绩不合格。\n");//否则,就输出成绩不合格
}
}
1.5 else悬空
如果有多个 if 和 else ,可以记住这样一条规则, else 总是跟最接近的 if 匹配。
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
打印:
其实什么都不打印🤣
上面说过,else 总是跟最接近的 if 匹配。我们可以把格式整理一下:
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
这个else
,相当于是和if(b == 2)
匹配的。
因为a=0,在执行if(a == 1)
的时候,a == 1
为假,所以就不会执行后面的if(b == 2)
和它对应的else
语句了 。
欸,那如果我们想让这个else
和第一个if
匹配该怎么搞?
int main()
{
int a = 0;
int b = 2;
if(a == 1){
if(b == 2)
printf("hehe\n");
}
else
printf("haha\n");
return 0;
}
直接加个{}
就行了~😍
2.关系操作符
“关系运算符”主要有下面6个:
>
大于运算符<
小于运算符>=
大于等于运算符<=
小于等于运算符==
相等运算符!=
不相等运算符
关系表达式通常返回 0 或 1 ,表示真假。
例如:
int main() {
int a, b, c, d, e, f, g, h;
a = (1 > 2);//假
b = (1 < 2);//真
c = (1 <= 2);//真
d = (1 >= 2);//假
e = (1 == 2);//假
f = (1 == 1);//真
g = (1 != 2);//真
h = (1 != 1);//假
printf("a=%d\n", a);
printf("b=%d\n", b);
printf("c=%d\n", c);
printf("d=%d\n", d);
printf("e=%d\n", e);
printf("f=%d\n", f);
printf("g=%d\n", g);
printf("h=%d\n", h);
return 0;
}
打印:
a=0
b=1
c=1
d=0
e=0
f=1
g=1
h=0
在这里需要注意的是:
==
和=
容易写错,一旦写错,可能就会出现逻辑上的bug了,比较麻烦。
这个情况可以避免的,只要我们把数字写在==
的左侧。
if(3==a){
printf("1\n");
}
为什么说这个情况可以避免呢?因为如果漏了个=
,就变成了
if(3=a){
printf("1\n");
}
众所周知,我们不能给常量3
赋值呀,这样机器就会报错了,你就知道在哪一行里面有问题了。
另外,另一个需要注意的是:多个关系运算符不宜连用。
int main() {
int a;
a = 2 < 3 < 2;
printf("a = %d", a);
return 0;
}
例如这个,打印:
a = 1
这里面先执行了2 < 3
,得到真,也就是1。
然后(2 < 3) < 2
,相当于1 < 2
,为真。得到1。
a = (2 < 3) < 2 = (1 < 2) = 1
-> a = 1
如果要用多个关系运算符连用的话,要么自己分清楚优先级,要么就加小括号来限定哪一个先来👍
3.条件操作符
条件操作符也叫三目操作符,形式如下:
exp1 ? exp2 : exp3
| | |
表达式1?表达式2:表达式3
表达式为真,计算表达式2
表达式为假,计算表达式3
举个例子:使用条件表达式实现找两个数中较大值。
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int m = a>b ? a : b;//如果a>b,那么m=a;如果a<=b,那么m=b。
printf("%d\n", m);
return 0;
}
4.逻辑操作符:&& , || , !
4.1 逻辑取反运算符 !
a | !a |
---|---|
非0 | 0 |
0 | 1 |
举个例子:
int main() {
int a = 1;
int b = 0;
int c, d;
c = !a;
d = !b;
printf("c=%d\n", c);
printf("d=%d\n", d);
return 0;
}
打印:
c=0//a = 1,!a=0
d=1//b = 0,!b=1
4.2 逻辑与运算符
a | b | a&&b |
---|---|---|
非0 | 非0 | 1 |
非0 | 0 | 0 |
0 | 非0 | 0 |
0 | 0 | 0 |
看着记不住怎么办?
记住:有0则0
只要a和b里面有一个是0,a&&b
就是0。
除非a和b都是1,那么a&&b
就等于1。
4.3 逻辑或运算符
a | b | a||b |
---|---|---|
非0 | 非0 | 1 |
非0 | 0 | 1 |
0 | 非0 | 1 |
0 | 0 | 0 |
同样的,记住:有1则1
只要a和b里面有一个是1,a||b
就是1。
除非a和b都是0,那么a||b
就等于0。
4.4 短路
C语言逻辑运算符总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
if(month >= 3 && month <= 5)
如果不满足month >= 3
,那么&&
就不会执行后面的month <= 5
这个判断了。可以结合我上面说的有0则0
。
这就是所说的C语言的短路。
if(month == 12 || month==1 || month == 2)
如果month == 12
刚好满足,那么||
就不会执行后面的month==1
和month == 2
这个判断了。可以结合我上面说的有1则1
。
5.switch语句
5.1 if语句和switch语句的对⽐
如果有3种蛋糕,A🎂,B🎂,C🎂。一次只能买一块吃掉。
一块A🎂1块钱,一块B🎂2块钱,一块C🎂3块钱。
用if语句写:
int main() {
int n;
scanf("%c", &n);
if (n == 'A') {
printf("给你A蛋糕");
}
else if (n == 'B') {
printf("给你B蛋糕");
}
else if (n == 'C') {
printf("给你C蛋糕");
}
return 0;
}
输入:
2
打印:
给你B蛋糕
用switch语句写:
int main() {
int n;
scanf("%d", &n);
switch (n) {
case 1:
printf("给你A蛋糕");
break;
case 2:
printf("给你B蛋糕");
break;
case 3:
printf("给你C蛋糕");
break;
}
return 0;
}
输入:
2
打印:
给你B蛋糕
当我输入2以后。
- 把2赋值给n。
- switch(n)就相当于switch(2)
- 这里switch(2),就会跳转到
case 2:
那里面去。
注意:
-
case 和后边的数字之间必须有空格。
-
每一个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。
5.2 switch语句中的break
如果去掉break
会咋样?
int main() {
int n;
scanf("%d", &n);
switch (n) {
case 1:
printf("给你A蛋糕");
case 2:
printf("给你B蛋糕");
case 3:
printf("给你C蛋糕");
}
return 0;
}
①
输入:
1
打印:
给你A蛋糕给你B蛋糕给你C蛋糕
②
输入:
2
打印:
给你B蛋糕给你C蛋糕
③
输入:
3
打印:
给你C蛋糕
通过上面3个例子,我们可以看出没有break的话,程序会按照顺序往下走动。直到走完或者遇到break
为止。
5.3 switch语句中的default
有时候switch
后的表达式中的值无法匹配代码中的 case
语句的时候,这时候要在 switch
语句中加入default
子句。
int main() {
int n;
scanf("%d", &n);
switch (n) {
case 1:
printf("给你A蛋糕");
break;
case 2:
printf("给你B蛋糕");
break;
case 3:
printf("给你C蛋糕");
break;
default:
printf("你输错了");
}
return 0;
}
输入:
4
打印:
你输错了
5.4 switch语句中的case和default的顺序问题
在 switch 语句中 case 语句和 default 语句是没有顺序要求的。
不过我们通常是把 default 子句放在最后处理的。
求三连!