if 条件判断


为了应付程序可能遇到的各种状况,C++ 提供了if条件判断陈述,它的语法如下:

if(条件式)
    语句一;
else
    语句二;

当条件式成立时,执行语句一,要不然就执行语句二;如果条件式不成立时并不想作任何事,else可以省略。

if后若有两个以上的语句,称为复合语句(compound statement),此时必须使用{}将复合语句包括起来,例如:

if(条件式) {
    语句一;
    语句二;
}
else {
    语句三;
    语句四;
}

下面来写个简单的程序,判断使用者的输入是奇数还是偶数:

#include <iostream>
using namespace std;

int main() { 
    int input = 0; 

    cout << "输入整数:"; 
    cin >> input; 

    int remain = input % 2; 
    if(remain == 1) 
        cout << input << " 为奇数" << endl; 
    else 
        cout << input << " 为偶数" << endl; 

    return 0;
}

执行结果:

输入整数:10
10 为偶数

这个程序很简单,使用余数运算来计算除以 2 后的余数,偶数的余数会是 0,而奇数会是 1,由此判断输入为奇数还是偶数;事实上,这个程序也可以这么写:

#include <iostream>
using namespace std;

int main() { 
    int input = 0; 

    cout << "输入整数:"; 
    cin >> input; 

    if(input % 2) {
        cout << input << " 为奇数" << endl; 
    }
    else { 
        cout << input << " 为偶数" << endl; 
    }

    return 0;
}

在 C++ 中 0 在条件式中相当于false,而非 0 值都被视为true,因此可以直接将余数运算的结果当作条件式来使用,另外,现在程序设计鼓励,就算只有一行语句,也要编写{},原因稍后就会谈到。

if中可以再设定执行的条件。例如:

if(条件式一) {
    语句一;

    if(条件式二) {
        语句二;
    }

    语句三;
}

这只个简单的例子,其中语句二要执行,必须同时满足条件式一与二才行;再来看个例子:

if(条件式一) {
    语句一;
    // 其它语句
}
else
    if(条件式二) {
        语句二;
    }

如果条件式一不满足,就会执行else的陈述,而在这边进行条件式二的测试,如果满足就执行条件式二,由于 C++ 是个自由格式语言,可以适当的排列这个程序:

if(条件式一) {
    语句一;
    // 其它语句
}
else if(条件式二) {
    语句二;
}

基于这个方式,可以如下设定多个条件:

if(条件式一) {
    陈述一;
}
else if(条件式二) {
    语句二;
} 
else if(条件式三) {
    语句三;
}
else {
    语句四;
}

语句四会在条件式一、二、三都不成立时执行;下面这个程序是个简单的例子,处理学生的成绩等级问题:

#include <iostream>
using namespace std;

int main() { 
    int score = 0; 

    cout << "输入分数:"; 
    cin >> score; 

    if(score >= 90) {
        cout << "得 A" << endl; 
    }
    else if(score >= 80 && score < 90) {
        cout << "得 B" << endl; 
    }
    else if(score >= 70 && score < 80) {
        cout << "得 C" << endl; 
    }
    else if(score >= 60 && score < 70) {
        cout << "得 D" << endl; 
    }
    else {
        cout << "得 E(不及格)" << endl; 
    }

    return 0;
}

执行结果:

输入分数:60
得 D

在这边要注意的是,ifelse是就最近的一组来配对,例如下面这个程序依缩排来看,你觉得有无问题存在?

if(条件式一)
    if(条件式二)
        语句一;
else
    语句二;

很多人都会以为条件式一的if会与else配对,但事实上是条件式二的ifelse配对,加上括号的话就可以一目了然了:

if(条件式一) {
    if(条件式二)
        语句一;
    else
    语句二;
}

如果想避免这种错误,在程序中多使用括号是必要的,多写一些总是比少写一些来得保险一点。

Apple 曾经提交一个 iOS 上的安全更新,原因是在某个函数中有两个连续的缩排:

...       
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
        goto fail;
        goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
        goto fail;
...

因为缩排在同一层,阅读代码时开发者也就没注意到,又没有用{}定义区块,结果就是goto fail无论如何都会被执行到的错误。

对于底下的写法:

int size = foo.getSize();
if(size == 10) {
    //...
}

size如果只用于if判断或其区块,在 C++ 17 时可以写为(目前我用的 g++ 必须加上-std=c++17才可以通过编译):

if(int size = foo.getSize(); size == 10) {
    //...
}




展开阅读全文