条件表达式

在上一章我们有学习一种变量类型,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.逻辑运算符

逻辑运算符可以用来表示更为复杂的条件表达式,共有三种:

逻辑运算符的优先级

andor 的优先级要低于比较运算符,但 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;
}

课上例题

可以吃肯德基吗?

判断奇偶

是否能被3整除且不能被5整除

闰年判断

恰好有一门课不及格的学生

2.多分支语句

如果我们要实现的功能有很多情况,例如:

用基本 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 写,我们每个分支的条件是必须描述得很详细的,但其实这段功能的各个条件之间是有并列关系的,可以描述为:

像第二个条件的 “小于等于89” 不需要判断,为什么?因为第一个条件 “成绩大于等于90” 已经判断过是不成立的,所以一定是 “小于等于89” 的。也就是说,在多分支结构中,每个条件其实都有一个隐藏条件,就是前面的条件是不成立的

另外,如果全部用 if 语句来写,那么每个条件都会判断,而如果是 if...else if...else,则判断到有一个条件成立后,后续的条件就不会判断了。

课上例题

成绩判断

奖金

暗号

BMI指数

神奇装置

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;
    }
}

练习

开关灯

骑车与走路

判断生肖

孔融让梨

后天星期

还要等多久

字符加密

选择题判定

田忌赛马