第二讲 判断语句
学习语言最好的方式就是实践,每当掌握一个新功能时,就要立即将这个功能应用到实践中. ——闫学灿
if语句
一般的程序是顺序执行的,从main函数内的第一个语句开始,执行完第一个语句后执行第二个语句,执行完第二个语句后执行第三个语句,以此类推,直到执行到return 0,是这样的一个顺序的流程.
但是人类的语言并不是平铺直叙,这样一条路走到黑的,还有另外一种逻辑.
例如,顺序结构是这样的:
起床 → to → 穿衣服 → to → 洗漱 → to → 吃早饭 → to → 拿起书包 → to → 出门.
还可能有另外一种情况:
起床 → to → 穿衣服 → to → 洗漱 → to → 吃早饭 → to → 拿起书包 { 如 果 今 天 下 雨 → 带 上 一 把 伞 出 门 如 果 今 天 不 下 雨 → 不 用 带 伞 出 门 begin{cases} 如果今天下雨 &to& 带上一把伞出门 \如果今天不下雨 &to &不用带伞出门end{cases} {如果今天下雨如果今天不下雨→→带上一把伞出门不用带伞出门.
这里展示了一个流程中可能存在两种不同的情况,第一讲中的内容是不足以实现它的,所以代码中会有一个全新的语法,可以让程序分叉.
程序的有些分叉不一定能走到,只有满足一定条件的情况下,才可以走到某些分叉.
例如,我们在考试后得到了一个分数,有如下代码 2-1:
//代码 2-1 #include#include using namespace std; int main() { int score; cin >> score; if (score >= 60) { cout << "及格"; } else { cout << "不及格"; } return 0; }
对于代码 2-1,当输入的分数 ⩾ 60 geqslant 60 ⩾60 时,会输出及格,否则会输出不及格.
代码 2-1的第 9 9 9 行到第 16 16 16 行即为整个的if语句,首先以 if(如果) 开头,随后是一个括号(()),括号中是一个判断表达式(即条件),如果条件成立(为真)的话,会执行条件下花括号({})内部的语句,如果条件不成立的话,会执行 else(否则) 下面的花括号({})内部的语句.
代码 2-1的第 9 9 9 行末尾千万不要加分号(;),即写成if (score >= 60);.
首先,C++语言中是允许空语句的存在的,即;本身就是一个语句;其次,若加上了分号(;),相当于在满足条件后,会执行一个空语句就跳出了整个if语句.
如果条件成立的话,不一定只执行一个语句,可以在花括号({})写上数条语句,它们会顺次执行.
if结构还有一些变形:
- else的内容可以被忽略掉.
#include#include using namespace std; int main() { int score; cin >> score; if (score >= 60) { cout << "及格"; } return 0; }
但是if的内容不能忽略掉.
- 当if或else下的花括号({})内只有一个语句时,可以将花括号({})省略.
#include#include using namespace std; int main() { int score; cin >> score; if (score >= 60) cout << "及格"; else cout << "不及格"; return 0; }
判断表达式当然,也可以写成如下形式:
#include#include using namespace std; int main() { int score; cin >> score; if (score >= 60) cout << "及格"; else cout << "不及格"; return 0; } 因为C语言不是按照缩进或行来划分语句的,而是以分号(;)与花括号({})来划分语句的.
练习:输入一个整数 x x x,输出 x x x 的绝对值.
如果 x 大于等于 0,则输出 x 本身 否则,输出 -x
#include#include using namespace std; int main() { int x; cin >> x; if (x >= 0) { cout << x << endl; } else { cout << -x << endl; } return 0; }
如上代码可以简写为:
#include#include using namespace std; int main() { int x; cin >> x; if (x >= 0) cout << x << endl; else cout << -x << endl; return 0; }
练习:输入两个整数,输出两个数中较大的那个
#include嵌套语句#include using namespace std; int main() { int a,b; cin >> a >> b; if (a > b) cout << a << endl; else cout << b << endl; return 0; }
//代码 2-2 #include#include using namespace std; int main() { int a,b; cin >> a >> b; if (a > b) { cout << a << endl; if (a > 5) { cout << "a大于5!" << endl; } else { cout << "a小于等于5!" << endl; } } else cout << b << endl; return 0; }
如上代码 2-2,if结构中是可以嵌套if结构的,不仅可以加在if后的花括号({})中,还可以加在else后的花括号({})中.
练习:输入三个整数,输出三个数中最大的那个
先用人的语言描述一下,注意人在思考代码逻辑时,一定要把自己想象成一种“低级”生物,不能说“我一眼就看出来了”,因为机器并不能一眼就看出来;机器能进行的规则就是“每次判断两个数的大小”(不能同时比较三个数),在这种情况下,怎样找出三个数中的最大值.
如果 a >= b 如果 a >= c a 是最大值 否则 c 是最大值(因为此时 c > a >= b) 否则 如果 b >= c b 是最大值 否则 c 是最大值
#include#include using namespace std; int main() { int a, b, c; cin >> a >> b >> c; if (a >= b) if(a >= c) cout << a << endl; else cout << c << endl; else if(b >= c) cout << b << endl; else cout << c << endl; return 0; }
注意,if和else是有一个就近原则的,即==else一定和往上离它最近的,尚未配对的if相对应==,而且每个if只能对应一个else.
例如下代码:
#includeusing namespace std; int main() { int a = 1, b = 2, c = 3; if (a == 1) if (b == 1) cout << "b == 1" << endl; else cout << "b == 2" << endl; return 0; } 虽然看似else cout << "b == 2" << endl;好像对应着if (a == 1),但实际上根据就近原则,它其实对应着if (b == 1) cout << "b == 1" << endl;,故运行结果为:
b == 2所以如上代码如果书写规范,应该为:
if (a == 1) if (b == 1) cout << "b == 1" << endl; else cout << "b == 2" << endl;但如果是用花括号({})括起来的if语句,这就不需要else来配对,例如下代码:
#includeusing namespace std; int main() { int a = 1, b = 2, c = 3; if (a == 1) { if (c == 3) cout << "c == 3" << endl; } else cout << "b == 2" << endl; return 0; } 这样,if (c == 3) cout << "c == 3" << endl;就可以没有else来对应,而else cout << "b == 2" << endl;则对应着if (a == 1),故运行结果为:
c == 3所以C++语言对代码缩进实际上是没有要求的,但是为了方便阅读,在我们书写代码时,要时刻注意if和哪个else对应,需要将它们对齐,这样才能做到逻辑清晰、不易出错.
if else 连写变量的作用域
在程序的某个花括号({})中定义的变量,是不能在此花括号({})外使用的.
也就是说,变量有所谓的生命周期,例如下代码就是非法的:
#includeint main() { int a = 1, b = 1; if (a == b) { int x; } x = 1; return 0; } 非法:指某种说法、代码或者定义不符合规则.
因为变量x只能在if确定的花括号({})内使用,在花括号外部使用是不被允许的.
当然,花括号并不单单依赖于main函数和if语句,也可以写成如下代码:
#includeint main() { int a = 1; { int a = 3; a += 5; printf("%dn", a); } printf("%dn", a); return 0; } 运行结果如下:
5 1即花括号({})本身就起到了生成作用域的作用,且允许变量名发生冲突;当变量名发生冲突时,会优先使用当前作用域内的同名变量,产生的所有 *** 作,都不会对当前作用域外的同名变量产生影响.
花括号提供了多个语句同归于一个作用域的作用,既能让if语句内包含多个语句,也能够产生新的作用域.
输入一个 0 0 0 到 100 100 100 之间的分数,
如果大于等于 85 85 85 ,输出 A;
如果大于等于 70 70 70 并且小于 85 85 85,输出 B;
如果大于等于 60 60 60 并且小于 70 70 70,输出 C;
如果小于 60 60 60 ,输出 D;
#include#include using namespace std; int main() { int grade; cin >> grade; if (grade >=85) cout << 'A' < = 70) cout << 'B' << endl; else // 蕴含着 grade < 70 { if (grade >= 60) cout << 'C' << endl; else //蕴含着 grade < 60 { cout << 'D' << endl; } } } return 0; }
如上是用嵌套语句来实现的代码,但其实代码逻辑本身并没有那么复杂,可以写成如下代码:
//代码 2-3 #include#include using namespace std; int main() { int grade; cin >> grade; if (grade >=85) cout << 'A' < = 70) cout << 'B' << endl; else if (grade >= 60) cout << 'C' << endl; else cout << 'D' << endl; return 0; }
如上代码 2-3可以视为,因为else后面只有一个if语句,所以可以去掉花括号({}),变为如下代码:
#include#include using namespace std; int main() { int grade; cin >> grade; if (grade >=85) cout << 'A' < = 70) cout << 'B' << endl; else // 蕴含着 grade < 70 if (grade >= 60) cout << 'C' << endl; else //蕴含着 grade < 60 cout << 'D' << endl; return 0; } 又由于C语言代码的语句的划分并不是通过缩进和换行实现的,而是通过分号(;)与花括号({})实现的,所以可以去掉else与if之间的换行(但需要保留一个空格' '表示这两个单词是彼此分开的),变为代码 2-3.
练习:
- 简单计算器输入两个数,以及一个运算符+, -, *, /,输出这两个数运算后的结果。当运算符是/,且除数是
0
0
0 时,输出"Divided by zero!"; 当输入的字符不是+, -, *, /时,输出"Invalid operator!".
#include#include using namespace std; int main() { int a, b; char c; cin >> a >> b >> c; if (c == '+') cout << a + b << endl; else if (c == '-') cout << a - b << endl; else if (c == '*') cout << a * b << endl; else if (c == '/') { if (b == 0) cout << "Divided by zero!" << endl; else cout << a / b << endl; } else cout << "Invalid operator!" << endl; return 0; }
- 判断闰年。闰年有两种情况:
(1) 能被 100 100 100 整除时,必须能被 400 400 400 整除;
(2) 不能被 100 100 100 整除时,被 4 4 4 整除即可。
输入一个年份,如果是闰年输出"yes",否则输出"no".
#include条件表达式#include using namespace std; int main() { int year; cin >> year; if (year % 100 == 0) { if (year % 400 == 0) cout << "yes" << endl; else cout << "no" << endl; } else { if (year % 4 == 0) cout << "yes" << endl; else cout << "no" << endl; } return 0; }
人类是一种比较复杂的生物,所以不能通过单一的情况作出某些判断.
例如期末要评选三好学生,三好学生一定要有表率作用,老师不会仅从一个方面来考察同学,老师一定会从多个方面来考察同学,例如:
期末成绩优秀;为人比较受欢迎;有责任心;
因此如果一个同学期末成绩优秀并且为人比较受欢迎并且有责任心,则我们可以给其颁发一个三好学生.
逻辑可以写为:
如果 成绩优秀 并且 受欢迎 并且 有责任心 那么给他颁发三好学生当然,用上面讲过的语句是可以实现该逻辑的,可以写为:
if (成绩优秀) if (受欢迎) if (有责任感) 给他颁发三好学生但实现起来是比较复杂的,并且若逻辑改写为:
如果 成绩优秀 并且 (受欢迎 或者 有责任感) 那么给他颁发三好学生这样的逻辑用上面讲过的语句去实现是较为困难的:
if (成绩优秀) { if (受欢迎) 给他颁发三好学生 else if (有责任感) 给他颁发三好学生 }有没有什么方式可以用一条语句来实现这个逻辑呢?
短路原则
条件表达式会从左到右依次执行每个条件,例如:
当使用a && b时,若a条件不满足,则不论b是否满足,肯定都不会满足整个条件,故在判断a条件不满足后会直接判断其不满足,往后的条件表达式就不会执行.当使用a || b时,若a条件满足,则不论b是否满足,肯定都会满足整个条件,故在判断a条件满足后会直接判断其满足,往后的条件表达式就不会执行.
此外,这三种运算符是可以组合起来的,可以将&&看成乘法( × times ×),将||看成加法( + + +),就可以拼在一起组合起来(但执行顺序不变,即&&和||的优先级是相同的).
例题:输入三个数,输出三个数中的最大值.
#include#include using namespace std; int main() { int a, b, c; cin >> a >> b >> c; if (a >= b && a >= c) cout << a << endl; else if(b >= a && b >= c) cout << b << endl; else cout << c << endl; return 0; }
注意C++语言中判断符号是不能连着写的,例如a >= b >= c是不对的.
因为判断表达式和条件表达式的值是布尔类型的,所以如上语句会先判断a >= b是否成立,若成立则值为 1 1 1,否则值为 0 0 0,随后这个值将会和c进行比较并得到一个布尔类型的值.
所以实际上if语句的括号(())内可以填入判断表达式和条件表达式,只有在它们的值为真(即为 1 1 1)时,if下面花括号({})内的语句才可以执行.
练习:用一条if语句,判断闰年
#include#include using namespace std; int main() { int year; cin >> year; if ((year % 100 == 0 && year % 400 ==0) || (year % 100 != 0 && year %4 == 0)) cout << "yes" < 如上代码可以简化为:
#include#include using namespace std; int main() { int year; cin >> year; if ((year % 4 == 0 && year % 100) || year % 400 == 0) cout << "yes" < 当year不能被 100 100 100 整除时,一定有year % 100 != 0,由于非 0 0 0 即为真的原则,而这里的!=0就可以忽略不写.
本文档基于 AcWing语法基础课 制作
视频链接:1.2 判断语句 - AcWing
文档版本:
var1.0 完成于2022.01.29.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)