精子生于 1995 年,英文 ID jysperm.
C++ 讲稿 5.条件语句
By 精英王子
CC-BY-NC-SA(署名-非商业性使用-以相同方式共享) 3.0
注:解说在图片下方
原始幻灯片(持续更新):https://docs.google.com/presentation/d/1yA9HuxRrAQJNyucXv2EvosYreR5YxfXmeY3MxqhTQbo/edit
解说写在
讲者备注
中
在此之前,我们编写的程序都像是一条直线,一句一句从头执行到位。
这节课我们会介绍条件语句,它可以令你的程序根据不同的输入,选择不同的分支来执行。进而获得不同的结果。
关系运算就是比较两个值的大小,或者两个值是否相等。
值得注意的是等于用两个等号表示,因为一个等号是赋值号,这点很容易被忘记。
关系运算的结果是bool类型,即是(true)/否(false).
需要明确这个概念:关系运算是一种普通的运算,和加减法无异,只不过这种运算通过比较来实现。
看右面最后一句,关系运算符的左右,可以是(字面值) ,也可以是表达式,或者变量,甚至函数的返回值。
逻辑运算是对bool类型的运算,即对是/否的运算,原理与数学中的逻辑联结词、物理中的逻辑电路相通。
通常逻辑运算用来对关系运算的结果进行加工,对关系运算的结果进行取反(最后一句),或者连接(第四句、第五句)。
C++中的逻辑运算符存在一种“短路效应”.
如右面被标红的那句,||的左面已经为true, 无论右面是何值,结果都将是ture, 所以C++在能够确定整个式子的结果的时候,会跳过右半部分的计算。
在&&运算时也存在类似情况,若左面的值为false,那么无论右面为何值,整个式子都是false, C++会跳过右半部分的计算。
这种短路效应在这个例子中无关紧要,当右半部分是一个(有副作用的表达式,如)函数时,短路效应将导致右半部分不会被计算(函数不会被调用).
不做过多解释,参见数学、物理书
这是一个简单的if语句的例子。
if语句的功能是根据一定的条件,决定是否要执行一段代码。
if后面跟着一个括号,括号中是一个bool类型的表达式,这个表达式的值决定了if是否执行接下来的代码。
我们之前介绍过,在C++中,花括号表示一个整体。在这里,这对花括号中的语句,就是当括号中的表达式为真时,if要执行的代码。
花括号中可以有任意行代码、一行、多行、没有,都可以。
当花括号中只有一行代码的时候,花括号可以省略。
按照通常的习惯,为了阅读方便,每个花括号中的代码都会向右缩进(比如4个空格), 在编辑器中按Tab可以缩进。
如果我输入了一个负数5, 表达式a<=0的值将会是true, 将会执行if中的代码,输出一行文字。
而如果我输入了一个正数3, 表达式a<=0的值将会是false, 会跳过if中的代码,不会有文字输出。
if是C++的关键字。
if else语句是对if语句的扩展,在if的语句块后面可以加上一个else, 并再附加一个语句块,这个语句块会在if语句的条件不成立的时候被执行。
同样,如果语句块(花括号)中只有一行,那么花括号是可以省略的,就像幻灯片上面那样。
if else语句中,无论括号中的表达式是真是假,都会有一个语句块被执行。当表达式为真时,if后的语句块被执行,为假时,else后的语句块被执行。
else也是C++中的关键字。
有些人在面对复杂的逻辑流程的时候,喜欢画流程图来帮助理解。
其实流程图可以看作是草稿一样,以比代码更清晰的方式来展现整个程序的逻辑。
而有的人并不喜欢流程图,他们觉得代码比流程图更容易理解。
else if 这看起来是一种新的语法,但其实不是,只不过将多个if else组合到了一起,并省略了花括号。
if会与离自己最近的else结合,形成一个if else语句。同时,整个if else语句,被认为是一个语句,单独包含在花括号中时可以省略花括号。
?:运算符可以认为是if else语句的简写形式,可以在一行内写完。
不要奇怪,它也是一个运算符,和加号减号一样,只不过它需要三个操作数。
但凡你学过一点数学,你应该知道4 + 3 * 2在数学中结果是10, 很高兴地告诉你,在C++里面也一样。
但是为什么是5呢?换成其他运算符又会怎样呢?
决定计算顺序的指标有两个:运算符的优先级,和运算符的结合性。
同时你可以任意添加括号,来改变计算顺序。
C++的运算符分为一元、二元、三元运算符,前面的数字代表运算符有几个操作数。
例如负号,它只需要一个操作数,所以叫一元运算符。
而加号需要两个操作数,所以叫二元运算符。
这个表中仅列出了我们学过的运算符,还有很多运算符我们没学过。
记不住优先级怎么办?加括号!
因为空间有限,我在一行中写了多个语句,这在C++中是允许的。
switch同样提供了分支的功能,它针对一个表达式可能是多个值之一的情况。
如在这里,月份只可能是1-12中的一个数。
switch后是一个括号,里面是要判断的表达式。再之后是一个大括号。
大括号中有若干个case关键字,后面跟着一个值和一个冒号。
当a的值和任意一个case后的值相等时,程序就会跳到此处执行。
(值得注意)默认情况下,程序会一直执行下去,会跨越多个case, 除非你手动用break语句退出switch.
如果要判断的表达式不和任何一个case匹配,就会执行default后的代码。
switch, case ,break, default都是C++的关键字。
如果要在屏幕上打印十次同一个字符串,除了把输出语句复制十次还有其他方法么?