条件表达式
在上一章我们有学习一种变量类型,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;
}
}