布尔值(Boolean)
本节阅读量:
在现实生活中,问题通常可以用“是”或“否”来回答。“苹果是水果吗?”是的。“你喜欢芦笋吗?”不喜欢。
现在考虑一个类似的陈述,可以用”真”或”假”来回答:”苹果是水果”。这显然为真。或者”我喜欢芦笋”呢?绝对为假。
这类语句只有两种可能的结果:yes/true或no/false。这种情况非常常见,以至于许多编程语言都包含了一种专门的类型来处理它们。该类型称为布尔类型(注意:布尔(Boolean)在英语中首字母大写,因为它以发明者乔治·布尔的名字命名)。
布尔变量
布尔变量是只能有两个可能值的变量:true和false。
要声明布尔变量,我们使用关键字bool。
要初始化布尔变量或将true或false值赋给布尔变量,我们使用关键字true和false。
1
2
3
4
|
bool b1 { true };
bool b2 { false };
b1 = false;
bool b3 {}; // 默认初始化成 false
|
正如一元减号运算符(-)可以用于使整数为负一样,逻辑NOT运算符(!)可以用于将布尔值从true翻转为false,或从false翻转为true:
1
2
|
bool b1 { !true }; // b1 初始化成 false
bool b2 { !false }; // b2 初始化成 true
|
布尔值实际上并不是以”true”或”false”这样的文字形式存储在布尔变量中的。相反,它们以整数形式存储:true对应整数1,false对应整数0。类似地,对布尔值求值时,结果实际上也不是”true”或”false”,而是整数0(false)或1(true)。因为布尔值实际存储的是整数,所以它被归类为整型。
打印布尔值
打印布尔值时,std::cout用0表示false,用1表示true:
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <iostream>
int main()
{
std::cout << true << '\n'; // true 求值结果是 1
std::cout << !true << '\n'; // !true 求值结果是 0
bool b{false};
std::cout << b << '\n'; // b 是 false, 求值结果是 0
std::cout << !b << '\n'; // !b 是 true, 求值结果是 1
return 0;
}
|
输出:
如果希望std::cout打印“true”或“false”,而不是0或1,则可以使用std::boolalpha。下面是一个示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <iostream>
int main()
{
std::cout << true << '\n';
std::cout << false << '\n';
std::cout << std::boolalpha; // 以 true , false 格式打印bool
std::cout << true << '\n';
std::cout << false << '\n';
return 0;
}
|
将打印:
可以使用std::noboolalpha关闭。
整数到布尔转换
不能使用列表初始化将整数赋给布尔值:
1
2
3
4
5
6
7
8
9
|
#include <iostream>
int main()
{
bool b{ 4 }; // 错误: 发生数据范围舍入
std::cout << b << '\n';
return 0;
}
|
然而,在其他允许整数转换为布尔值的场景中,整数0转换为false,任何其他整数转换为true。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <iostream>
int main()
{
std::cout << std::boolalpha; // 以 true , false 格式打印bool
bool b1 = 4 ; // 拷贝初始化允许隐式的将 int 转成 bool
std::cout << b1 << '\n';
bool b2 = 0 ; // 拷贝初始化允许隐式的将 int 转成 bool
std::cout << b2 << '\n';
return 0;
}
|
这将打印:
注:bool b1 = 4; 可能会产生警告。如果是这样,则必须禁用"将警告视为错误"的规则才能编译通过。
输入布尔值
通过std::cin输入布尔值有时会让新手程序员感到困惑。
考虑以下程序:
1
2
3
4
5
6
7
8
9
10
11
|
#include <iostream>
int main()
{
bool b{}; // 列表初始化默认为 false
std::cout << "Enter a boolean value: ";
std::cin >> b;
std::cout << "You entered: " << b << '\n';
return 0;
}
|
1
2
|
Enter a Boolean value: true
You entered: 0
|
等等,发生了什么?
原来,std::cin只接受两种布尔输入:0和1(而不是true或false)。任何其他输入都会导致std::cin静默失败。在这种情况下,由于我们输入了true,std::cin静默地读取失败了。失败的输入还会将变量清零,因此b被赋值为false。所以当std::cout打印b的值时,输出的是0。
要允许std::cin接受”false”和”true”作为输入,必须启用std::boolalpha选项:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <iostream>
int main()
{
bool b{};
std::cout << "Enter a boolean value: ";
// 允许用户输入 'true' or 'false' 作为bool变量的值
// 大小写敏感, True or TRUE 都不行
std::cin >> std::boolalpha;
std::cin >> b;
std::cout << "You entered: " << b << '\n';
return 0;
}
|
然而,当启用std::boolalpha时,”0”和”1”将不再被解释为布尔输入(它们都会被解析为”false”,就像任何非”true”的输入一样)。
警告
启用std::boolalpha后将仅接受小写的”false”或”true”作为输入,不接受大写字母。
布尔返回值
布尔值通常用作判断某些条件是否为真的函数的返回值。此类函数通常以is(例如isEqual)或has(例如hasCommonDivisor)开头命名。
考虑下面的例子:
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;
}
|
下面是该程序两次运行的输出:
1
2
3
|
Enter an integer: 5
Enter another integer: 5
5 and 5 are equal? true
|
1
2
3
|
Enter an integer: 6
Enter another integer: 4
6 and 4 are equal? false
|
这是如何工作的呢?首先读取x和y的整数值。然后计算表达式”isEqual(x,y)”。在第一次运行中,这会调用isEqual(5,5)。在该函数内部,计算5==5,得到true。true返回给调用者,并由std::cout打印输出。在第二次运行中,isEqual(6,4)返回false。