C++学习第七弹:判断
有时候,我们希望程序会根据条件的不同执行不同的操作,此时就要请出我们的判断语句了,C++中常用的判断语句有 if 语句和 switch 语句,下面将会分别介绍。
判断语句:
if 语句和 if…else 语句:
C++ 中 if 语句的语法:
1 | if(boolean_expression) |
如果布尔表达式为 true,则 if 语句内的代码块将被执行。如果布尔表达式为 false,则 if 语句结束后的第一组代码(闭括号后)将被执行。
ok,也是很浅显易懂,但是如果我们想让布尔表达式为假时执行另一个语句怎么办呢?答案就是使用 else。
C++ 中 if…else 语句的语法:
1 | if(boolean_expression) |
C++ 中 if…else if 语句的语法:
1 | if(boolean_expression 1) |
但是,当使用 if…else if…else 语句时,以下几点需要注意:
- 一个 if 后可跟零个或一个 else,else 必须在所有 else if 之后。 - 一个
if 后可跟零个或多个 else if,else if 必须在 else 之前。 - 一旦某个 else
if 匹配成功,其他的 else if 或 else 将不会被测试。
同时,if 语句和 if…else 语句也可以进行嵌套,不过多赘述。
switch 语句:
当我们需要判断很多条件时,除了连续的 if…else if…else
语句之外,还可以使用 switch 语句,他有以下几个好处:
- 执行效率更高 - 代码结构更清晰 -
类型安全限制
一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。
以下是C++ 中 switch 语句的语法:
1 | switch(expression){ |
switch 语句必须遵循下面的规则: - switch 语句中的 expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。 - 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。 - case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量或字面量。 - 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。 - 当遇到 break 语句时,switch 终止(直接跳出switch),控制流将跳转到 switch 语句后的下一行。 - 不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。 - 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。
在使用过程中,最好遵循以下的建议: 1.
必加break:除非刻意实现fall-through(贯穿)逻辑(需注释说明)
2.
善用default:处理未预见值(即使你认为不会出现)
3.
枚举替代魔数:case Color::Red 比 case 1 更安全,同时注意浮点数和字符串类型是不可行的。
4. 性能敏感场景:优先选择
switch(如解析器、状态机) 5.
复杂条件表达式:仍用
if-else(如 if (x>0 && y<0))
同样地,switch也支持嵌套。~~但是我个人觉得这样做会非常难读… ~~
? : 运算符:
条件运算符 ? :,可以用来替代 if…else 语句。它的一般形式如下:
1 | Exp1 ? Exp2 : Exp3; |
其中,Exp1、Exp2 和 Exp3 是表达式。 ? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个 ? 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个 ? 表达式的值。
在某些情况下使用 ?: 运算符确实会简化代码,但是这玩意的可读性挺差的,看情况使用。
小结:学习了C++中判断语句的用法。
