C语言中的条件判断(上)-学习笔记-8

条件判断

在 C 语言中有两种条件判断语句,if 语句switch 语句if 语句实现的是双分支的选择结构,swicth 语句实现的是多分支的选择结构。

if 语句

if 语句是一个双分支选择结构,通过条件表达式的结果判断程序是执行 if 语句模块还是 else 语句模块。

一般形式

if (表达式)语句1
[else 语句2]

  1. 这里的表达式可以是关系表达式、逻辑表达式或者数值表达式。
  2. 上面的方括号中的 else 和 语句2 为可选内容,可以有也可以没有。
  3. 语句 1 和语句 2 可以是一个简单语句、复合语句或者是另一个 if 语句,即在此 if 语句中包含另一个 if 语句。

    常见形式

    一般形式

    1
    2
    3
    4
    5
    6
    int age = 23;
    if (age >= 18){
    printf("年龄为%d 岁,可以考取驾照。",%d);
    } else {
    printf("年龄不满18岁,不可以考取驾照。")
    }

这就是一个简单的 if…else 语句,通过判断年龄是否大于等于18岁,来判断能否考取驾照。

省略 else 部分

1
2
3
4
int age = 23;
if (age >= 18){
printf("年龄为%d 岁,可以考取驾照。",%d);
}

我们可以只写 if 模块,省略掉 else 部分。

if 语句的多行条件判断

我们可以通过多个 if...else...组合的形式,来进行更加详细的判断。

1
2
3
4
5
6
7
8
int age = 23;
if (age>=18){
printf("成年人")
} else if (age<5){
printf("婴儿")
} else {
printf("儿童")
}

我们通过对年龄的多次判断,判断出了当前年龄是成年人、儿童或者是婴儿。
当然了,我们也可以直接在 else 里面包含一个新的 if 语句。

1
2
3
4
5
6
7
8
9
10
int age = 23;
if (age>=18){
printf("成年人")
} else {
if (age<5){
printf("婴儿")
} else {
printf("儿童")
}
}

这样把 if 语句包含在 else 中虽然合法,但是影响可读性,所以我们建议把 if 语句的多行判断,用 else if 来写。

简写

在 C 语言中,整个 if 语句也可以写成1行。

1
2
if (x>0) y=1; else y=-1;
//这样写虽然合法,但是可读性下降,建议写成标准格式

注意
上面的 if 和 else 中间为什么有分号呢?
因为这个不是 if 和 else 的分号,而是 y=1这个语句结束的分号。

几种逻辑变量和表达式

关系运算符和关系表达式

关系运算符

在 C 语言中,比较符号称为关系运算符,可以将关系运算理解为比较运算。
例如:
><==>=等等

关系表达式

在 C 语言中,用关系运算符将两个数值或者数值表达式连起来的式子,称为关系表达式。
例如:
a>b
0<1

逻辑运算符

逻辑运算符

共有三种逻辑运算符:
与(AND)、或(OR)、非(NOT)
在 C 语言中,这些逻辑运算符表示为
与(AND):&&
例子:A && B
解释:如果 A 和 B 同时成立,则成立,有一个不成立,则该式子都不成立。
或(OR):||
例子:A || B
解释:如果 A 和 B 其中有一个成立、或者都成立,则该式子成立,如果都不成立,则该式子不成立。
非(NOT):!
例子:! A
解释:取反, 如果 A 成立,则非 A就是不成立,反之亦然。

逻辑表达式

逻辑表达式的值应该是一个逻辑量,即真或假,我们将 0 看做假,1 看做真。

常见逻辑表达式

a=4,!a 逻辑值等于假,因为所有非0数都是真,取反为假。
a=4,b=5,a&&b 逻辑值等于假,因为4和5都是假,假假为假。
a=4,b=5,a||b 逻辑值等于假,因为4和5都是假,没有真。
a=4,b=5,!a||b 逻辑值为真,因为非!级别最高,!a 为真,有一真,式子为真。

符号权限
!非为最高
算术运算符
关系运算符
先&&后||
赋值运算符

例题1:

1
5>3 && 8<4-!0

这个题非常经典
最高权限的是!0,!0等于1
然后就是算术运算符,4-1,等于3
然后是关系运算符,5>3为真,8<3为假
最后是逻辑逻辑运算符,真 AND 假,为假,因为其一为假都为假。

注意
实际上,所有的逻辑运算符两侧的运算对象,不但可以是0和1,也可以是字符型、浮点型、枚举型或指针型的纯量数据,系统最终以0或者非0来判断他们的真假。

例题2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main(){
int a=1;
int b=2;
int c=3;
int d=4;
int m=1,n=1;
printf("m=%d,n=%d\n",m,n);
if( (m=a>b) && (n=c>d)){
printf("flase");
}else{
printf("假\n");
printf("a=%d,b=%d,c=%d,d=%d,m=%d,n=%d\n",a,b,c,d,m,n);
}
return 0;
}

//结果
//m=1,n=1
//假
//a=1,b=2,c=3,d=4,m=0,n=1

我们看到,一开始 m 和 n 都为1,经过逻辑表达式的转换,两个关系表达式中间用&&相连接,先算左边,>号的权限大于=号,所以我们先算关系表达式,a>b 结果是假,值为0,所以 m 为1,此时&&左边为1,所以&&不可能成立,所以&&右边的关系表达式没有运算,所以结果出来之后,n=1没有变化。

逻辑型变量

逻辑型变量是存储逻辑运算和关系运算结果的一种逻辑变量。

一般形式

_Bool 变量名;

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdbool.h>
int main(){
bool a,b;
float score;
scanf("%f",&score);
a=score<90;
b=score>60;
if (a==true && b==true){
printf("成绩为:%3.0f,恭喜你及格了!",score);
}else{
printf("成绩为:%3.0f,不是没及格就是优秀!",score);
}
return 0;
}

因为在文件开头引入了stdbool.h文件,所以我们的逻辑性变量值从0和1变成了 true 和 false ,这是从 C++ 引入的特性,这样增加了文件的可读性。

条件运算符和条件表达式

有一种 if 语句,当判断为真或假时,都执行一个赋值语句,并且想同一个变量赋值。

定义

1
2
3
4
5
6
7
int  result;
if(a>b){
result = a;
} else {
result = b;
}
//我们判断 a 和 b 的关系,然后将结果赋值给 result

显然这么写太啰嗦了,所以条件运算符条件表达式,应运而生。上面的语句可以改写成一句话。

1
result = (a>b) ? a:b;

在 result 的右侧,是条件表达式,里面的 ?是条件运算符。这句代码的意思是,如果条件为真,则返回 a,result = a ,如果条件为假,那么返回 b,result=b。

注意
1.条件运算符由两个符号组成,(?和:)必须一起使用。
2.要求有三个操作对象,C 语言中唯一的三目运算符。

一般形式

表达式 1 ? 表达式 2 :表达式 3
即先计算表达式1的值,如果为真,就执行表达式2,如果为假则跳过表达式2,执行表达式3。

条件运算符的优先级

条件运算符的优先级
赋值运算符 < 条件运算符 < 关系运算符 < 算术运算符

例题

1
a>b ? a : b+1;

可以把上式转换为a>b ? a : (b+1);
因为算术运算符最大,所以先计算 b+1,然后计算 a>b,如果是假的,那么返回的值是 b+1,不是 b。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!