C++逻辑运算符详解
逻辑运算符基础
关系(比较)运算符可用于测试某个特定条件是真还是假,但它们一次只能测试一个条件。通常我们需要知道多个条件是否同时为真。例如,要检查我们是否中了彩票,我们必须比较我们选的所有多个号码是否都匹配中奖号码。在一个包含6个号码的彩票中,这将涉及6次比较,所有这些比较都必须为真。在其他情况下,我们需要知道多个条件中是否有一个为真。例如,我们可能决定今天不上班,如果我们生病了,或者太累了,或者我们在前面的例子中中了彩票。这将涉及检查3个比较中是否有任何一个为真。
C++ 有 3 个逻辑运算符:
运算符 | 符号 | 示例用法 | 操作 |
---|---|---|---|
逻辑非 (NOT) | ! | !x | 如果 x 为假则为真;如果 x 为真则为假 |
逻辑与 (AND) | && | x && y | 如果 x 和 y 都为真则为真,否则为假 |
逻辑或 (OR) | ` | ` |
逻辑非运算符
逻辑非的基本用法
您已经在第 4.9 课(布尔值)中遇到过逻辑非一元运算符。我们可以这样总结逻辑非的效果:
逻辑非 (运算符 !)
操作数 | 结果 |
---|---|
true | false |
false | true |
逻辑非的使用示例
bool tooLarge { x > 100 }; // 如果 x > 100,则 tooLarge 为 true
if (!tooLarge)
// 用 x 做些操作
else
// 打印错误信息
逻辑非的优先级问题
#include <iostream>
int main()
{
int x{ 5 };
int y{ 7 };
if (!x > y) // 错误写法
std::cout << x << " is not greater than " << y << '\n';
else
std::cout << x << " is greater than " << y << '\n';
return 0;
}
正确的逻辑非使用方式
#include <iostream>
int main()
{
int x{ 5 };
int y{ 7 };
if (!(x > y)) // 正确写法:用括号明确操作对象
std::cout << x << " is not greater than " << y << '\n';
else
std::cout << x << " is greater than " << y << '\n';
return 0;
}
最佳实践
- 如果逻辑非旨在操作其他运算符的结果,则其他运算符及其操作数需要用括号括起来。
- 简单的逻辑非用法,例如
if (!value)
,不需要括号,因为此时优先级不会产生影响。
逻辑或运算符
逻辑或的基本规则
逻辑或 (运算符 ||)
左操作数 | 右操作数 | 结果 |
---|---|---|
false | false | false |
false | true | true |
true | false | true |
true | true | true |
逻辑或的使用示例
#include <iostream>
int main()
{
std::cout << "请输入一个数字: ";
int value {};
std::cin >> value;
if (value == 0 || value == 1) // 正确:检查 value 是否等于 0 或 1
std::cout << "您输入了 0 或 1\n";
else
std::cout << "您输入的不是 0 或 1\n";
return 0;
}
逻辑与运算符
逻辑与的基本规则
逻辑与 (运算符 &&)
左操作数 | 右操作数 | 结果 |
---|---|---|
false | false | false |
false | true | false |
true | false | false |
true | true | true |
逻辑与的使用示例
#include <iostream>
int main()
{
std::cout << "请输入一个数字: ";
int value {};
std::cin >> value;
if (value > 10 && value < 20) // 检查 value 是否大于 10 并且小于 20
std::cout << "您输入的值在 10 和 20 之间\n";
else
std::cout << "您输入的值不在 10 和 20 之间\n";
return 0;
}
短路求值机制
短路求值的原理
为了使逻辑与返回 true
,两个操作数都必须计算结果为 true
。如果左操作数计算结果为 false
,逻辑与知道无论右操作数计算结果是 true
还是 false
,它都必须返回 false
。
短路求值的注意事项
if (x == 1 && ++y == 2) // 危险:短路求值可能导致 y 不自增
// 执行某些操作
混合使用逻辑运算符
运算符优先级
当在同一个表达式中混合逻辑与和逻辑或时,最好显式地用括号括住每个运算符及其操作数:
(value1 && value2) || (value3 && value4) // 清晰的写法
德·摩根定律
定律内容
!(x && y)
等价于!x || !y
!(x || y)
等价于!x && !y
真值表验证
| x | y | !x | !y | !(x && y) | !x || !y | | :—- | :—- | :—- | :—- | :——– | :——- | | false | false | true | true | true | true | | false | true | true | false | true | true | | true | false | false | true | true | true | | true | true | false | false | false | false |
逻辑异或运算
XOR运算规则
逻辑异或 (Logical XOR)
左操作数 | 右操作数 | 结果 |
---|---|---|
false | false | false |
false | true | true |
true | false | true |
true | true | false |
C++中实现XOR
if (a != b) ... // a XOR b, 假设 a 和 b 是 bool 类型
替代运算符表示法
关键字替代表
运算符名称 | 关键字替代名称 |
---|---|
&& | and |
` | |
! | not |
使用示例
std::cout << !a && (b || c);
std::cout << not a and (b or c); // 使用替代关键字