• Index

if 语句

Reads: 28

之前教程中已经讲解过if语句,由于if语句非常常用,经过前面的练习题,你应该非常熟练if语句了,现在再详细讲解一下if语句。

浮点的比较

基础示例

对于浮点型的比较,先看个栗子:

#include <iostream> // std::cout std::endl
#include <cmath> // std::abs

int main(void)
{
    std::cout << 4000.126f << std::endl;

    auto value = 8000.05f / 2;
    if (std::abs(value - 4000.025f) < 0.0001f)
    {
        std::cout << value << std::endl;
    }
    return 0;
}

输出结果:

4000.13
4000.02

基础讲解

由于浮点型数据不精确,所以第一个4000.126f有可能输出4000.13。而有时候,由于浮点型不精确,就算用浮点型变量保存数字1,它也有可能保存成为1.000001或者0.999999,这个时候如果用这个浮点型数据1和整数1比较,那么很有可能不相等。

解决这种情况只能使用误差的方法:当两个值差不多的时候可以认为它们相等

函数std::abs()用来求绝对值。以下代码中,变量a和变量b相等:

auto a = std::abs(-1);
auto b = std::abs(1);

上面代码中,如果变量value的值和4000.025f的差值小于0.0001f,它们就是差不多,这时候就可以认为它们相等。

如果你的程序不能容许误差,必须做到完全精确,例如金融交易程序,那么此时可以使用字符串类型保存小数,它的数学运算相对就会很麻烦,此时可以借助第三方库完成;也可以自己写,不过代码量大,而且容易写错。

省略{}括号

if语句里面要执行的内容,只有一条语句,那么,可以省略{}

#include <iostream> // std::cin std::cout std::endl

int main(void)
{
    unsigned int score = 72;
    if (score >= 60)
        std::cout << "及格" << std::endl;
    else
        std::cout << "不及格" << std::endl;
    return 0;
}

这里没有一般建议,只是我个人的建议:建议不要省略{}。因为新手省略{}很容易出错,而且写{}使代码中所有的if格式统一,这样更加规范。

while语句和for语句都可以省略{ }

三目运算符

if语句中,如果只有ifelse,并且根据判断条件只需要返回两个值之一时,那么就可以使用三目运算符条件 ? 条件成立执行这里 : 条件不成立执行这里

基础示例

以下代码输出分数是否及格:

#include <iostream> // std::cin std::cout std::endl

int main(void)
{
    unsigned int score = 72;
    std::cout << (score >= 60 ? "及格" : "不及格") << std::endl;
    return 0;
}

上面代码中,加()让程序先执行()内的代码。

含有初始化操作的 if 语句

有些时候,变量仅在某个if语句中的条件里被使用。为了将局部变量控制在最小的范围内,这时可以使用含有初始化操作的if语句。

基础示例

使用方法如下:

#include <string> // std::u32string
#include <iostream> // std::cout std::endl

int main(void)
{
    std::u32string text = U"小古银的C++教程";
    if (auto i = text.size(); i < 5) // 局部变量可以在这里被初始化
    {
        std::cout << "输入的字符数小于5:" << i << std::endl;
    }
    else
    {
        std::cout << "输入的字符数不小于5:" << i << std::endl;
    }
    return 0;
}

输出结果:

输入的字符数不小于5:9

其中变量i的范围只在if语句中,即只能在ifelse中被使用。

补充知识(了解即可)

含有初始化操作的if语句,该功能从C++17开始加入。

练习

一、输入一个ASCII可见字符,判断字符是不是字符'0''9'的其中一个,如果是则输出你输入的是数字;否则输出你输入的不是数字

二、问题描述:

我国公民的身份证号码特点如下:

  1. 长度为18位;
  2. 第1~17位只能为数字;
  3. 第18位可以是数字或者小写英文字母x。
  4. 身份证号码的第7~14位表示持有人生日的年、月、日信息。

用户输入一个字符串,如果这个字符串是身份证号则输出这是身份证号,否则输出别骗我,身份证号是假的


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.