C++逻辑运算符完全指南:AND、OR、NOT运算符详解

C++逻辑运算符详解

逻辑运算符基础

关系(比较)运算符可用于测试某个特定条件是真还是假,但它们一次只能测试一个条件。通常我们需要知道多个条件是否同时为真。例如,要检查我们是否中了彩票,我们必须比较我们选的所有多个号码是否都匹配中奖号码。在一个包含6个号码的彩票中,这将涉及6次比较,所有这些比较都必须为真。在其他情况下,我们需要知道多个条件中是否有一个为真。例如,我们可能决定今天不上班,如果我们生病了,或者太累了,或者我们在前面的例子中中了彩票。这将涉及检查3个比较中是否有任何一个为真。

C++ 有 3 个逻辑运算符:

运算符符号示例用法操作
逻辑非 (NOT)!!x如果 x 为假则为真;如果 x 为真则为假
逻辑与 (AND)&&x && y如果 xy 都为真则为真,否则为假
逻辑或 (OR)``

逻辑非运算符

逻辑非的基本用法

您已经在第 4.9 课(布尔值)中遇到过逻辑非一元运算符。我们可以这样总结逻辑非的效果:

逻辑非 (运算符 !)

操作数结果
truefalse
falsetrue

逻辑非的使用示例

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),不需要括号,因为此时优先级不会产生影响。

逻辑或运算符

逻辑或的基本规则

逻辑或 (运算符 ||)

左操作数右操作数结果
falsefalsefalse
falsetruetrue
truefalsetrue
truetruetrue

逻辑或的使用示例

#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;
}

逻辑与运算符

逻辑与的基本规则

逻辑与 (运算符 &&)

左操作数右操作数结果
falsefalsefalse
falsetruefalse
truefalsefalse
truetruetrue

逻辑与的使用示例

#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) // 清晰的写法

德·摩根定律

定律内容

  1. !(x && y) 等价于 !x || !y
  2. !(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)

左操作数右操作数结果
falsefalsefalse
falsetruetrue
truefalsetrue
truetruefalse

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); // 使用替代关键字

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"