← 返回 C++ 学习记录

C++ JOURNAL / 程序控制

if / else 与分段函数

保留那个多写了分号、把 sqrt(0.5) 变成 0.25 的错误。

按我的学习记录整理 · 示例用于帮助理解
这篇记录里

条件和范围

if 检查条件;else if 在前面的条件不成立时继续检查;else 接住前面都不成立的情况。一条这样的分支链只执行第一个满足条件的分支。

= 是赋值;== 是比较是否相等。要判断 a 和 b 相等,写 if (a == b)。if (a = b) 在一些情况下可以编译,但会改变 a,再把赋值结果当成条件,不是原本的比较。

&& 表示“并且”:x >= 0 && x <= 1 表示 x 同时满足两个条件。

不要写数学式的 0 <= x <= 1。C++ 会先计算 0 <= x 得到真假,再用这个真假对应的 0 或 1 与 1 比较,不能表达这个区间。

我练习过的分段函数

#include <iostream>
#include <cmath>
using namespace std;
int main() {
    double x, y = 0;
    cin >> x;
    if (x < 0) {
        y = -x;
    } else if (x >= 0 && x <= 1) {
        y = sqrt(x);
    } else if (x > 1) {
        y = x * x;
    }
    cout << y << endl;
    return 0;
}

按题目的普通实数输入,负数取相反数,0 到 1(含端点)取平方根,大于 1 求平方。x = 0.5 时,结果约为 0.707107。

那个多出来的 else;

我曾经在 else 后面写了一个分号。x = 0.5 本来应该计算 sqrt(0.5),最后却得到了 0.25。

错误片段:

if (x < 0)
    y = -x;
else if (x >= 0 && x <= 1)
    y = sqrt(x);
else;             // 错误:空语句已经成为 else 的内容
    y = x * x;    // 不属于 else,会接着执行

即使上面已经算出了平方根,最后一行仍然会把 y 覆盖成 x 的平方。缩进只是给人看的,不能替代大括号。改成 else { y = x * x; },才能让它属于 else。

平方根怎么写

sqrt(x) 是求平方根的函数,要包含 <cmath>。在这里的实数计算中,x 应不小于 0;分段条件也保证了这一点。

我还问过“派怎么打”。如果指圆周率 π,它是一个常数,和平方根不是同一件事。初学时可以按题目精度给一个值,例如 double pi = 3.141592653589793;。计算平方根仍然写 sqrt,而不是输入数学里的根号。

返回全部学习记录 ↗