{ }codelper

学习 › C++

流程控制 · 05

条件语句

根据条件做不同的事:if · else if · else,还有 switch。

条件语句就是把“如果……就……”写成代码。
从上往下逐个检查条件,只执行第一个为真的分支。
下面的例子按分数给出等级,并告诉你它是不是偶数。

#include <iostream> int main() {    int score;    std::cin >> score;    if (score >= 90) {        std::cout << "A\n";    } else if (score >= 80) {        std::cout << "B\n";    } else if (score >= 70) {        std::cout << "C\n";    } else {        std::cout << "F\n";    }    std::cout << (score % 2 == 0 ? "even" : "odd") << '\n';}
stdin
75
stdout
C
odd

要点

  • 条件是从上往下检查的,所以要先写最严格的标准。
    如果先写 score >= 70,连 95 分也会变成 C。
  • 全都为假时执行 else 分支。
    else 可以不写。
  • 连接条件的逻辑运算符:并且 &&、或者 ||、非 !。
    Python 用 and、or、not。
    前面已能确定结果时,后面就不再计算(x != 0 && 10 / x > 1 是安全的)。
  • 把一个值和多种情况比较时,switch 更好读。
    各语言在“会不会贯穿到下一个情况”上不一样。
  • 简短的二选一用三元运算符:条件 ? 为真时 : 为假时(Python 写作 A if 条件 else B)。

各语言的写法

Pythonif 条件: / elif 条件: / else: — 用 : 和缩进代替大括号。
switch 从 3.10 起写作 match x: + case 1 | 2: + case _:
JavaScriptif (条件) { } else if (条件) { } else { } — switch 中 case 没有 break 就会贯穿到下一个 case。
值用 === 比较
TypeScript和 JavaScript 一样。
比较不同类型的值时,编译时就会提示
Javaif (条件) { } else if (条件) { } else { } — switch 需要 break。
Java 14 起的 case 1, 2 -> … 不会贯穿
C#if (条件) { } else if (条件) { } else { } — switch 中每个有内容的 case 都必须有 break(或 return),漏写就是编译错误
C++if (条件) { } else if (条件) { } else { } — switch 只能用于整数(包括字符),没有 break 就会贯穿到下一个 case
C和 C++ 一样。
真和假就是非 0 的数和 0
Craykon如果 (条件) { } 否则 如果 (条件) { } 否则 { } — 选择 (x) { 情况 1, 2: … 默认: … } 只执行匹配的那一个情况,不会贯穿

常见错误

把 == 写成了 =C · C++ · JavaScript · TypeScript

if (x = 5) {
    printf("五");
}

→ 5 被赋给 x,条件永远为真

比较要用 ==。
Java、C#、Python 和 Craykon 会把这个错误报出来。

像 1 < x < 10 这样连着写JavaScript · C · C++ · Craykon

let x = 50;
console.log(1 < x < 10);

→ true — (1 < x) 先变成 true,而 true < 10 为真

拆开写成 1 < x && x < 10。
只有 Python 能像数学那样连着写(TypeScript、Java、C# 会编译错误)。

switch 中漏了 breakC · C++ · Java · JavaScript

switch (n) {
    case 1: puts("一");
    case 2: puts("二");
}

→ n 为 1 时,“一”和“二”都会输出

每个 case 都写 break;。
C# 会报编译错误,Craykon 的 选择 从一开始就不会贯穿。

各语言的差异
在 JavaScript 和 TypeScript 中比较相等要用 ===。
== 会先转换类型再比较,所以 "1" == 1 和 "" == 0 都是 true。
Craykon 的 == 和 === 一样严格:"1" == 1 是 假。

练习题