15.逻辑运算符

15.运算符-逻辑运算符


15.1 知识点

逻辑运算符是什么

逻辑运算符是用来对 bool 类型进行逻辑运算的,主要用于两个表达式之间的逻辑运算。
基本规则
左侧内容 逻辑运算符 右侧内容

逻辑与

符号:&& 并且

基本规则

对两个 bool 值进行逻辑运算,有假则假,同真为真。

bool b1 = true;
bool b2 = false;
bool result;

result = b1 && b2;
cout << result << endl; // false

result = true && true;
cout << result << endl; // true

result = true && false;
cout << result << endl; // false

result = false && false;
cout << result << endl; // false

result = false && true;
cout << result << endl; // false

优先级

逻辑运算符优先级低于关系运算符和算术运算符。

result = 4 > 1 && 1 + 2 < 5;
cout << result << endl; // true && true = true

int i = 3;
result = i <= 5 && i > 1; // 1 < i <= 5
cout << result << endl; // true && true = true

多个逻辑与组合运用

在没有括号的情况下,从左到右依次计算;有括号时,先计算括号内。

result = 4 > 1 && 3 < 2 && true && false;
cout << result << endl;
// false && true
// false && false
// false

特殊用法

逻辑与可以直接与数字计算,非零代表 true,零代表 false

result = -1 && -3;
cout << result << endl; // true

逻辑或

符号:|| 或者

基本规则

对两个 bool 值进行逻辑运算,有真则真,同假为假。

result = true || true;
cout << result << endl; // true

result = true || false;
cout << result << endl; // true

result = false || false;
cout << result << endl; // false

result = true || (false || false) || true;
cout << result << endl; // true

result = 1 + 2 || 3 - 3;
cout << result << endl; // true

其他规则

逻辑或的优先级、多个逻辑或的组合运用及特殊用法规则与逻辑与相同。

逻辑非

符号:!

基本规则

对一个 bool 值进行取反,真变假,假变真。逻辑非的优先级较高。

result = !false;
cout << result << endl; // true

result = !5 > 1;
cout << result << endl; // false (!5 > 1 -> false > 1 -> 0 > 1)

result = !(5 > 1);
cout << result << endl; // false

混合使用优先级问题

规则

  • !(逻辑非) 优先级最高
  • &&(逻辑与) 优先级高于 ||(逻辑或)
  • 逻辑运算符优先级低于算术运算符和关系运算符(逻辑非除外)。
bool gameOver = false;
int hp = 100;
bool isDead = false;
bool isMustOver = true;

result = gameOver || hp < 0 && !isDead || isMustOver;
cout << result << endl; // true
// false || false && true || true
// false || false || true
// false || true
// true

逻辑运算符的短路规则

短路规则

  • 逻辑或:有真则真,左侧为真时,右侧不重要(不会被执行)。
  • 逻辑与:有假则假,左侧为假时,右侧不重要(不会被执行)。
int i2 = 3;

// 逻辑或
result = i2 > 0 || ++i2;
cout << i2 << endl; // 3

// 逻辑与
i2 = 3;
result = i2 < 0 && ++i2;
cout << i2 << endl; // 3

15.2 知识点代码

Lesson15_运算符_逻辑运算符.cpp

#include <iostream>
using namespace std;
int main()
{
    cout << "逻辑运算符\n";

    #pragma region 知识点一 逻辑运算符是什么

    // 是用来对bool类型 进行逻辑运算的
    // 主要用来进行两个表达式的逻辑运算
    // 基本规则:
    // 左侧内容 逻辑运算符 右侧内容

    #pragma endregion

    #pragma region 知识点二 逻辑与

    //符号 && 并且

    //1.基本规则 
    //  对两个bool值进行逻辑运算 有假则假 同真为真
    bool b1 = true;
    bool b2 = false;
    bool result;
    result = b1 && b2;
    cout << result << endl;//false
    result = true && true;
    cout << result << endl;// true
    result = true && false;
    cout << result << endl;// false
    result = false && false;
    cout << result << endl;// false
    result = false && true;
    cout << result << endl;// false

    //2.优先级
    //  逻辑运算符优先级 低于 关系运算符 算术运算符
    result = 4 > 1 && 1 + 2 < 5;
    cout << result << endl;// true && true = true
    int i = 3;
    result = i <= 5 && i > 1;// 1 < i <= 5
    cout << result << endl;// true && true = true

    //3.多个逻辑与 组合运用
    //  在没有括号的情况下 从左到右 依次看即可
    //  有括号 先看括号内
    result = 4 > 1 && 3 < 2 && true && false;
    cout << result << endl;
    // false && true
    // false && false
    // false

    //4.特殊用法,直接和数字计算
    //  非0代表true,0代表false
    result = -1 && -3;
    cout << result << endl;// true

    #pragma endregion

    #pragma region 知识点三 逻辑或

    //符号 || 或者
    // 基本规则 
    // 对两个bool值进行逻辑运算 有真则真 同假为假
    // 优先级规则、多个逻辑或组合运用、特殊用法 规则和逻辑与相同
    result = true || true;
    cout << result << endl;// true
    result = true || false;
    cout << result << endl;// true
    result = false || false;
    cout << result << endl;// false
    result = true || (false || false) || true;
    cout << result << endl;// true
    result = 1 + 2 || 3 - 3;
    cout << result << endl;// true

    #pragma endregion

    #pragma region 知识点四 逻辑非

    //符号 ! 非
    //  基本规则 
    //  对一个bool值进行取反  真变假  假变真
    //  它的优先级较高
    result = !false;
    cout << result << endl;// true
    result = !5 > 1;
    cout << result << endl; //false !5 > 1 => false > 1 =>  0 > 1;
    result = !(5 > 1);
    cout << result << endl; //false

    #pragma endregion

    #pragma region 知识点五 混合使用的优先级

    // 规则  
    // !(逻辑非)优先级最高   
    // &&(逻辑与)优先级高于||(逻辑或)
    // 逻辑运算符优先级 低于 算数运算符 关系运算符(逻辑非除外)
    bool gameOver = false;
    int hp = 100;
    bool isDead = false;
    bool isMustOver = true;
    result = gameOver || hp < 0 && !isDead || isMustOver;
    cout << result << endl;// true
    // false || false && true || true
    // false || false || true
    // fales || true
    // true

    #pragma endregion

    #pragma region 知识点六 逻辑运算符短路规则

    //逻辑或 有真则真 左边只要为真了 右边就不重要(不会被执行)
    int i2 = 3;
    result = i2 > 0 || ++i2;
    cout << i2 << endl;//3

    //逻辑与 有假则假 那左边只要为假了 右边就不重要(不会被执行)
    i2 = 3;
    result = i2 < 0 && ++i2;
    cout << i2 << endl;//3

    #pragma endregion
}

15.3 练习题

求打印结果是什么?

cout << true || true;
cout << false || true;
cout << true && true;
cout << true && false;
cout << !true;

cout << (true || true) << endl;  // true
cout << (false || true) << endl; // true
cout << (true && true) << endl;  // true
cout << (true && false) << endl; // false
cout << !true << endl;           // false

求打印结果是什么?

bool gameOver;
bool isWin;
int health = 100;
gameOver = true;
isWin = false;

cout << (gameOver || isWin && health > 0);

解析:

  • gameOver || isWin && health > 0
    按运算优先级:
    • isWin && health > 0 -> false && true -> false
    • gameOver || false -> true

最终结果:

cout << (gameOver || isWin && health > 0); // true

15.4 练习题代码

Lesson15_练习题.cpp

#include <iostream>
using namespace std;
int main()
{
    std::cout << "逻辑运算符 练习题\n";

    #pragma region 练习题一

    //求打印结果是什么?
    cout << (true || true) << endl;  // true
    cout << (false || true) << endl; // true
    cout << (true && true) << endl; // true
    cout << (true && false) << endl; // false
    cout << !true << endl; // false

    #pragma endregion

    #pragma region 练习题二

    //求打印结果是什么?

    bool gameOver;
    bool isWin;
    int health = 100;
    gameOver = true;
    isWin = false;
    // true || false && true
    // true || false
    // true
    cout << (gameOver || isWin && health > 0);

    #pragma endregion

}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏