条件表达式
在上一章我们有学习一种变量类型,bool
布尔类型,这一类型的结果一般是条件表达式的运算结果。
条件表达式,用来判断某个或某些条件是否是成立的,例如 “我的数学成绩是否大于等于 90 分?”、“今天是疯狂星期四吗?”、“晚上吃的是麻婆豆腐吗?” 等等。。。
而在程序中,我们使用 比较运算符 和 逻辑运算符 来编写条件表达式。
1.比较运算符
用于比较两个数据之间的关系,共有六种:
运算符 | 描述 | 示例:int a=11, b=10; | 结果 |
---|---|---|---|
> | 大于 | a > b | true |
>= | 大于或等于 | a >= b | true |
< | 小于 | a < b | false |
<= | 小于或等于 | a <= b | false |
== | 等于 | a == b | false |
!= | 不等于 | a != b | true |
需要注意的是,比较运算符皆为双目运算符,它们之间运算优先级相同,所以如果写了这样的条件表达式:a < b < c ,假设 a = 3, b = 2, c = 4 ,那么会遵循运算规则,从左往右计算,先计算 a < b 得到结果 false ,再计算 false < c 得到结果 true 。 |
另,比较运算符的优先级均低于算术运算符,也就是说,如果计算 a < b+c
,会先计算 b+c
再进行比较。
2.逻辑运算符
逻辑运算符可以用来表示更为复杂的条件表达式,共有三种:
-
逻辑与:用符号
&&
或者关键字and
来表示,双目运算符,可以理解为 并且。计算规则为:两边都为true
最终结果就为true
,否则为false
。 -
逻辑或:用符号
||
或者关键字or
来表示,双目运算符,可以理解为 或者。计算规则为:只要有一边是true
结果就是true
,否则为false
。 -
逻辑非,用符号
!
或者关键字not
来表示,单目运算符,可以理解为 不。计算规则为:! true
为false
,! false
为true
。
and
和 or
的优先级要低于比较运算符,但 not
的优先级高于算术运算符,所以使用 not
时要注意。
另外,and
的优先级高于 or
。
假设 a = 12, b = 17, c = 13
,给出使用示例:
若想判断 a < b
并且 b < c
,可以写 a < b and b < c
,也可以写 a < b && b < c
。
若想判断 a > b
或者 c > b
,可以写 a > b or c > b
,也可以写 a > b || c > b
。
若想判断 a == b
是不对的,可以写 not (a == b)
和 ! (a == b)
,当然也可以直接写 a != b
。
3.课上例题
分支结构
分支结构,用于在代码中实现 “满足 xx 条件,做 xx 事情” 这样的功能,例如 “如果数学考了一百分,就去写一套数学试卷” 。。。
依靠该结构,我们可以做到在一些数据不同的情况下,程序执行不同的功能。
1.基本 if 语句
结构如下:
if (条件表达式) {
代码段1;
}
else {
代码段2;
}
其执行逻辑为,当条件表达式的结果为 true
时,那么会执行代码段1;若结果为 false
,则执行代码段2。代码段中可以是任何符合语法的代码。
例如要实现功能:“当变量 a
大于 90
时,输出 YES
,否则输出 NO
”,示例代码:
if (a > 90) {
cout << "YES";
}
else {
cout << "NO";
}
如果 else
这段没有任何需要执行的代码,可以省略掉,写为:
if (条件表达式) {
代码段;
}
例如要实现功能:“当变量 a
小于 0
时,将变量 a
赋值为 0
”,示例代码:
if (a < 0) {
a = 0;
}
课上例题
2.多分支语句
如果我们要实现的功能有很多情况,例如:
- 当成绩在
90~100
之间时,输出 休息一天 - 当成绩在
80~89
之间时,输出 吃顿好的 - 当成绩在
70~79
之间时,输出 做套卷子 - 当成绩在
70
以下时,输出 芭比Q咯
用基本 if
语句其实可以实现这个功能:
int s;
cin >> s; // 成绩,输入的数字小于等于 100
if (s >= 90) {
cout << "休息一天";
}
if (s >= 80 and s <= 89) {
cout << "吃顿好的";
}
if (s >= 70 and s <= 79) {
cout << "做套卷子";
}
if (s < 70) {
cout << "芭比Q咯";
}
这样写是可以实现功能的,只是如果用多分支结构来写,逻辑会更简单,多分支结构如下:
if (条件表达式1) {
代码段1;
}
else if (条件表达式2) {
代码段2;
}
else if (条件表达式3) {
代码段3;
}
... // else if 的分支个数没有限制
else {
代码段x;
}
它会从上往下执行,依次判断这些条件表达式,若这次表达式结果为 false
,就接着判断下一个条件表达式;直到某个条件表达式成立,就执行其对应的代码段,并且结束这段分支结构的执行。
而如果所有条件表达式都不成立,则会执行 else
分支里的代码段。同样的,如果要实现的功能里,else
分支没有要做的事情,可以省略。
上面描述的那个例子,用多分支可以写成这样:
int s;
cin >> s; // 成绩
if (s >= 90) {
cout << "休息一天";
}
else if (s >= 80) {
cout << "吃顿好的";
}
else if (s >= 70) {
cout << "做套卷子";
}
else {
cout << "芭比Q咯";
}
假设输入的 s
值为 87
,那么这段代码执行逻辑为:
先判断 s >= 90
,结果为 false
,继续判断下一个条件。
判断 s >= 80
,结果为 true
,所以输出 “吃顿好的”,判断结束。
对比一下上面两段代码的写法,有什么不同呢?如果全用 if
写,我们每个分支的条件是必须描述得很详细的,但其实这段功能的各个条件之间是有并列关系的,可以描述为:
- 如果成绩大于等于90,那么。。
- 否则如果成绩大于等于80,那么。。
- 否则如果成绩大于等于70,那么。。
- 否则,那么。。
像第二个条件的 “小于等于89” 不需要判断,为什么?因为第一个条件 “成绩大于等于90” 已经判断过是不成立的,所以一定是 “小于等于89” 的。也就是说,在多分支结构中,每个条件其实都有一个隐藏条件,就是前面的条件是不成立的。
另外,如果全部用 if
语句来写,那么每个条件都会判断,而如果是 if...else if...else
,则判断到有一个条件成立后,后续的条件就不会判断了。
课上例题
switch语句
对于 switch
语句,其所有功能都可以用 if
语句完成,所以我们只作了解,明白其执行的逻辑即可。
switch
语句并不是为了处理取值范围而设计的。switch
语句中的每一个 case
标签必须是一个单独值(即下面的label),这个值必须是整数(包括 char
),因此它也无法处理浮点运算。另外,case
标签值必须是常量。
如果是取值范围的话,用 if-else
判断;如果选项超过两个,且固定,使用 switch
语句更加简单明了。
switch()
中的选项必须是一个结果为整数值的表达式。
switch(结果为整数值的表达式) {
case label1: statement(s);
case label2: statement(s);
...
default : statemens(s);
}
程序跳到 switch
中特定代码后,将依次执行之后所有语句,除非有明确其他指示break
,都在将一直执行下去。
cin >> choice;
while(choice != 'Q' && choice != 'q') {
swith(choice) {
case 'A':cout << "a\n";
break;
case 'R':cout << "r\n";
break;
case 'L':cout << "l\n";
break;
default: cout << "没有这个选项.\n";
break;
}
}