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,而不是输入数学里的根号。