章节目录

if语句简介

本节阅读量:

考虑这样一个例子:你要去市场,你的室友告诉你,”如果草莓打折,就买一些”。这是一个条件语句,意味着只有当条件(”草莓在打折”)为真时,你才会执行相应的操作(”买一些”)。

这样的条件在编程中很常见,因为它使我们能够在程序中实现条件行为。C++中最简单的条件语句称为if语句。if语句允许我们仅在某个条件为真时执行一行(或多行)代码。

最简单的if语句采用以下形式:

1
if (条件表达式) true_对应的语句;

为了可读性,这通常写为:

1
2
if (条件表达式)
    true_对应的语句;

条件(也称为条件表达式)是求值为布尔值的表达式。

如果if语句的条件求值为布尔值true,则执行 true_对应的语句。如果条件求值为布尔值false,则跳过 true_对应的语句。


使用if语句的示例程序

给定以下程序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <iostream>

int main()
{
    std::cout << "Enter an integer: ";
    int x {};
    std::cin >> x;

    if (x == 0)
        std::cout << "The value is zero\n";

    return 0;
}

下面是该程序一次运行的输出:

1
2
Enter an integer: 0
The value is zero

首先,用户输入一个整数。然后对条件 x == 0 进行求值。相等运算符(==)用于测试两个值是否相等。运算符== 在操作数相等时返回true,不相等时返回false。由于x的值为0,而 0 == 0 为true,因此该表达式的求值结果为true。

由于条件求值结果为true,因此执行后续语句,打印出”The value is zero”。

下面是该程序的另一次运行结果:

1
Enter an integer: 5

在这种情况下,x==0 的求值结果为false。后续的语句被跳过,程序直接结束,不会打印任何其他内容。


if-else

考虑上面的例子,如果我们还想告诉用户他们输入的数字不是零,该怎么办?

我们可以这样写:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <iostream>

int main()
{
    std::cout << "Enter an integer: ";
    int x {};
    std::cin >> x;

    if (x == 0)
        std::cout << "The value is zero\n";
    if (x != 0)
        std::cout << "The value is non-zero\n";

    return 0;
}

或者这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <iostream>

int main()
{
    std::cout << "Enter an integer: ";
    int x {};
    std::cin >> x;

    bool zero { (x == 0) };
    if (zero)
        std::cout << "The value is zero\n";
    if (!zero)
        std::cout << "The value is non-zero\n";

    return 0;
}

这两个程序都比实际需要的更复杂。我们可以使用if语句的另一种形式,即 if-else。其形式如下:

1
2
3
4
if (条件表达式)
    true_对应的语句;
else
    false_对应的语句;

如果条件求值为布尔true,则执行 true_对应的语句。否则执行 false_对应的语句。

让我们修改上面的程序,使用if-else。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <iostream>

int main()
{
    std::cout << "Enter an integer: ";
    int x {};
    std::cin >> x;

    if (x == 0)
        std::cout << "The value is zero\n";
    else
        std::cout << "The value is non-zero\n";

    return 0;
}

现在,我们的程序将产生以下输出:

1
2
Enter an integer: 0
The value is zero
1
2
Enter an integer: 5
The value is non-zero

串联if语句

有时候,我们需要依次检查多个条件是否为真。我们可以通过将if语句(或if-else)串联到前一个if-else之后来实现,如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <iostream>

int main()
{
    std::cout << "Enter an integer: ";
    int x {};
    std::cin >> x;

    if (x > 0)
        std::cout << "The value is positive\n";
    else if (x < 0)
        std::cout << "The value is negative\n";
    else 
        std::cout << "The value is zero\n";

    return 0;
}

小于运算符(<)用于测试一个值是否小于另一个值。类似地,大于运算符(>)用于测试一个值是否大于另一个值。这些运算符都返回布尔值。

下面是该程序多次运行的输出:

1
2
Enter an integer: 4
The value is positive
1
2
Enter an integer: -3
The value is negative
1
2
Enter an integer: 0
The value is zero

请注意,可以根据需要检查的条件数量多次串联if语句。


布尔返回值和if语句

在上一课中,我们编写了一个使用返回布尔值的函数的程序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>

// x与y相等返回true, 不然返回false
bool isEqual(int x, int y)
{
    return (x == y); // 操作符== , x 等于y,返回true,否则返回false
}

int main()
{
    std::cout << "Enter an integer: ";
    int x{};
    std::cin >> x;

    std::cout << "Enter another integer: ";
    int y{};
    std::cin >> y;

    std::cout << std::boolalpha; // 以  true , false 格式打印bool
    
    std::cout << x << " and " << y << " are equal? ";
    std::cout << isEqual(x, y) << '\n'; // isEqual返回true或false

    return 0;
}

让我们使用if语句来改进此程序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
// x与y相等返回true, 不然返回false
bool isEqual(int x, int y)
{
    return (x == y); // 操作符== , x 等于y,返回true,否则返回false
}
 
int main()
{
    std::cout << "Enter an integer: ";
    int x {};
    std::cin >> x;
 
    std::cout << "Enter another integer: ";
    int y {};
    std::cin >> y;
    
    if (isEqual(x, y))
        std::cout << x << " and " << y << " are equal\n";
    else
        std::cout << x << " and " << y << " are not equal\n";

    return 0;
}

该程序两次运行的结果如下:

1
2
3
Enter an integer: 5
Enter another integer: 5
5 and 5 are equal
1
2
3
Enter an integer: 6
Enter another integer: 4
6 and 4 are not equal

在这种情况下,我们的条件表达式是对函数isEqual的调用,并获取其返回的布尔值。


非布尔条件

在上面的所有示例中,我们的条件要么是布尔值(true或false)、布尔变量,要么是返回布尔值的函数。那么,如果条件是一个求值结果不是布尔值的表达式,会发生什么呢?

在这种情况下,条件表达式会被转换为布尔值:非零值被转换为 true,零值被转换为 false。

因此,如果我们这样做:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <iostream>

int main()
{
    if (4) // 无任何意义,用来作为示例...
        std::cout << "hi\n";
    else
        std::cout << "bye\n";

    return 0;
}

这将打印“hi”,因为4是一个非零值,它被转换为布尔true。


If语句和提前返回

不是函数中最后一个语句的return语句会导致函数提前返回。这样的语句会使函数在执行到return时立即返回给调用方(在函数正常执行完毕之前就返回了,因此称为”提前”返回)。

无条件的提前返回没有用处:

1
2
3
4
5
6
7
8
void print()
{
    std::cout << "A";

    return; // 函数在这里返回

    std::cout << "B"; // 这行不会执行到
}

std::cout « “B”; 将永远不会被执行,我们可以将其删除,这样return语句就变成了函数的最后一条语句。

然而,当与if语句结合使用时,提前返回提供了一种使函数有条件地返回的方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <iostream>

// 返回函数 x的绝对值
int abs(int x) 
{
    if (x < 0)
        return -x; // 提前返回 (当 x < 0)

    return x;
}

int main()
{
    std::cout << abs(4) << '\n'; // 打印 4
    std::cout << abs(-3) << '\n'; // 打印 3

    return 0;
}

当调用 abs(4) 时,x的值为4。if (x < 0) 为false,提前返回语句不会执行。函数继续执行到末尾,将x(值为4)返回给调用者。

当调用 abs(-3) 时,x的值为-3。if (x < 0) 为true,执行提前返回语句。此时,函数将-x(值3)返回给调用方。


4.8 布尔值(Boolean)

上一节

4.10 字符

下一节