if语句简介
本节阅读量:
考虑这样一个例子:你要去市场,你的室友告诉你,”如果草莓打折,就买一些”。这是一个条件语句,意味着只有当条件(”草莓在打折”)为真时,你才会执行相应的操作(”买一些”)。
这样的条件在编程中很常见,因为它使我们能够在程序中实现条件行为。C++中最简单的条件语句称为if语句。if语句允许我们仅在某个条件为真时执行一行(或多行)代码。
最简单的if语句采用以下形式:
为了可读性,这通常写为:
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”。
下面是该程序的另一次运行结果:
在这种情况下,x==0 的求值结果为false。后续的语句被跳过,程序直接结束,不会打印任何其他内容。
警告
If语句仅能有条件地执行单个语句。我们将在后续课程中讨论如何有条件地执行多个语句——If语句和块。
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)返回给调用方。