第二节 · 对数据提问 · 条件语句

在生活中,我们经常需要对周边的事物作出一些判断:

  • 如果我抢到了限时出售的傻 Fu Fu 的 Miku,我会在到货时拍照发到自己的圈子里炫耀一番。

  • 如果明天不下雨且《姜子牙》已经上映,我会去电影院看这个电影,否则我还是继续在家里刷知乎吧。

  • 如果星巴克哪天能免费送咖啡,我会抽空去星巴克的门店坐一坐的。

不论以上的如果有多奇怪,它们都是对未来可能发生的某事作出了预判,并预先制定了行动方案。

计算机也可以这样。相比较于计算器,计算机多出了简单的判断能力,使其实际可做的事情要比计算器多得多。即使是二进制数字间的碰撞,我们也可以凭此做许多事了。

下面,我们将以 C++ 的条件语句,发挥计算机在逻辑判断方面的巨大潜力。


回忆一下,我们之前学习了一些专用于判断的运算符,如大于、小于、或、与。现在,我们尝试使用它们决定某些代码是否执行:

int n;
cin >> n;
if (n < 10) cout << "n 小于 10!" << endl;

我们先从键盘获取一个整数 n,然后判断n是否小于 10.if语句可用于根据一段表达式的执行解雇哦,判断是否要执行其所包裹的语句。它的格式是这样的:

if (<条件>) <满足条件时执行的语句>;

如果想执行多个语句,也可以用一对花括号跟在小括号后面,就像这样:

if (<条件>)
{
    <语句1>;
    <语句2>;
    ...
}

小括号的条件其实就是诸如 k * x + b < ya == 12 * 15 这类表达式,唯一的限制是表达式执行完后得是一个布尔值,或可以转换为布尔值。例如,整数 0 会被隐式转换为 true,其它整数会被转换为 false

上述两种形式均可使用。前一种单语句的形式必须在末尾加分号,后一种用花括号包裹的形式则不需要这么做。


“如果”这个词也许够用了,但它仅仅是正面的假设。很多时候,我们不光要“如果”,还需要“否则”,以表达在某种假设下的相反形式的处理措施。

这时候,我们可以在 if 段落后使用 else

我们在先前的例子中加入了对 else 的使用,使程序能同时处理条件成立与不成立的两种情况。else 的语法与if类似,不过不需要条件:

它同样也支持以花括号包裹的语句块,以执行多个语句:

else 不能单独使用,它必须紧跟一处if语句,否则将因没有能依附的条件而报错。如果只想处理某个条件不成立的情况,我们可以变通地为if地条件取反来解决问题:


很多时候,我们的问题并不能仅靠一个如果解决。要么是同一个条件可能有多种情况,要么是判断某个条件之前需要另一个条件作为前提。

我们先来看一个条件有多种情况的例子:

这是一个简单的分数评价示例,它将 elseif 写在一起使用,以连续地判断数字的范围。

else 后紧跟 if 的写法很简单:

它既像 else 一样,其前必须有一个紧邻的if;也像if一样,拥有一个新的判断条件。并且,由于它可以连续书写,所以我们可以以此方便地表达对各种特定情况的处理逻辑。


另一种特别的形式是嵌套的if

考 85 分与考 100 分差别还是蛮大的,为了照顾考满分的人才的感受,我们可以对 85 分及以上的分数再作细分。在刚才补充的程序中,外层的 if 内部还包含了一批 if。这相当于先判断分数是否不小于 85 分,如果能满足这个条件,再具体执行下一层的 if 判断。

if 可以嵌套任意层数的 if,只要能拿出具体的条件就能写出来:

不过写太多层 if 会让程序难以阅读。这时,我们还可以通过使用与运算符(&&)写出同样的逻辑:

另外,值得注意的是,要小心嵌套的 ifelse 语句对 if 语句的选取。else 会优先选取最近的一个if,而如果所在层找不到能用的 if,编译器将到上一层语句块寻找先前的 if,直到找到为止。另外,花括号可以改变 else 语句的匹配行为。举个例子:

就程序的可读性而言,如果遇到了多路 if 嵌套的情况,请尽量使用花括号明确各个 if 执行哪些代码,以避免 else 语句跟错了 if


ifelse 支撑着 C++ 程序的基本逻辑运转,是 C++ 程序中最重要、最不可或缺的一部分。在未来的学习与实践中,我们将经常使用它们,帮助我们书写富有逻辑性的程序。

Last updated