返回 课程

信奥AC之路-1级

0% 完成
0/0 步骤
  1. 第1课 开发环境与基础输出
    5 主题|小节
  2. 第2课 算术运算符
    7 主题|小节
  3. 第3课 printf与运算输出
    7 主题|小节
  4. 第4课 数的进制与拆位
    6 主题|小节
  5. 第5课 变量与基础运算
    17 主题|小节
  6. 第6课 常量与取整运算
    8 主题|小节
  7. 第7课 关系运算
    8 主题|小节
  8. 第8课 逻辑运算
    9 主题|小节
  9. 第9课 输入与计算进阶
    10 主题|小节
  10. 第10课 if语句及双分支语句
    8 主题|小节
  11. 第11课 if语句及双分支进阶
    11 主题|小节
  12. 第12课 三目运算
    9 主题|小节
  13. 第13课 多分支、多if和switch语句
    11 主题|小节
  14. 第14课 循环(基本输出)
    7 主题|小节
  15. 第15课 循环(While+If)
    8 主题|小节
  16. 第16课 循环(计数、求和、求乘积)
    10 主题|小节
  17. 第17课 循环进阶(While+)
    8 主题|小节
  18. 第18课 do-while及while其他用法
    8 主题|小节
  19. 第19课 For循环基础
    9 主题|小节
  20. 第20课 For循环进阶
    8 主题|小节
课 8, 主题|小节 2
进行中

8.1 布尔值和逻辑运算基础

2025年9月22日
课 进展
0% 完成

“小朋友们,”我笑着问道,”假设我问你们:’今天是晴天吗?’你们会怎么回答?”

“会说是或不是!”小明大声回答。

“没错!在编程中,我们用数字1表示’是’(真/true),用0表示’不是’(假/false)。这就是布尔值的概念!”

[图片:展示布尔值的概念图,包括真值和假值的例子]

8.1.1 布尔值的规则

// 在C++中,任何非0的值都代表真
printf("%dn", 5);     // 输出:5(非0,代表真)
printf("%dn", -3);    // 输出:-3(非0,代表真)
printf("%dn", 0);     // 输出:0(0,代表假)

// 当用在逻辑运算中时,真值会被当作1处理
printf("%dn", 5 && 3);    // 输出:1(两个真值的与运算)

练习题:

  1. 选择题:在逻辑运算中,下面哪个值代表”假”?
    A. 1
    B. -1
    C. 0
    D. 100

正确答案:C
解析:在C++中,只有0代表假,其他所有非0值(包括负数)都代表真。

  1. 判断题:数字42在逻辑运算中被视为”真”值。

正确答案:√
解析:任何非0的数值在逻辑运算中都被视为真值。

8.1.2 与运算(&&)详解

“小明”,我指着黑板说,”假设你要参加一个比赛,需要同时满足’身高超过120厘米’和’年龄大于8岁’这两个条件,这就需要用到’与运算’了!”

// 与运算的完整真值表
printf("===与运算真值表===n");
printf("0 && 0 = %dn", 0 && 0);    // 输出:0(假 且 假 = 假)
printf("0 && 1 = %dn", 0 && 1);    // 输出:0(假 且 真 = 假)
printf("1 && 0 = %dn", 1 && 0);    // 输出:0(真 且 假 = 假)
printf("1 && 1 = %dn", 1 && 1);    // 输出:1(真 且 真 = 真)

// 使用非0值进行与运算
printf("n===非0值的与运算===n");
printf("5 && 3 = %dn", 5 && 3);    // 输出:1(真 且 真 = 真)
printf("5 && 0 = %dn", 5 && 0);    // 输出:0(真 且 假 = 假)
printf("-1 && 2 = %dn", -1 && 2);  // 输出:1(真 且 真 = 真)

[图片:用维恩图直观展示与运算的规律]

练习题:

  1. 选择题:以下哪个与运算的结果为1?
    A. 0 && 5
    B. 5 && 0
    C. 3 && 4
    D. 0 && 0

正确答案:C
解析:与运算要求两个操作数都为真(非0),3和4都是非0值,所以结果为1。

  1. 判断题:表达式”100 && 200″的结果是200。

正确答案:×
解析:逻辑运算的结果只有0和1,即使操作数是其他非0值,结果也只会是1。

8.1.3 或运算(||)详解

“现在,”我继续说,”如果参加比赛只需要满足’是学校足球队成员’或者’是学校篮球队成员’这两个条件中的任意一个,这就是’或运算’!”

// 或运算的完整真值表
printf("===或运算真值表===n");
printf("0 || 0 = %dn", 0 || 0);    // 输出:0(假 或 假 = 假)
printf("0 || 1 = %dn", 0 || 1);    // 输出:1(假 或 真 = 真)
printf("1 || 0 = %dn", 1 || 0);    // 输出:1(真 或 假 = 真)
printf("1 || 1 = %dn", 1 || 1);    // 输出:1(真 或 真 = 真)

// 使用非0值进行或运算
printf("n===非0值的或运算===n");
printf("5 || 3 = %dn", 5 || 3);    // 输出:1(真 或 真 = 真)
printf("5 || 0 = %dn", 5 || 0);    // 输出:1(真 或 假 = 真)
printf("0 || -1 = %dn", 0 || -1);  // 输出:1(假 或 真 = 真)

[图片:用维恩图直观展示或运算的规律]

练习题:

  1. 选择题:下列或运算中,结果为0的是:
    A. 5 || 0
    B. 0 || 5
    C. 0 || 0
    D. -1 || 1

正确答案:C
解析:或运算中,只有当两个操作数都为0(假)时,结果才为0。

  1. 判断题:在”||”运算中,如果第一个操作数为真,就不会再检查第二个操作数。

正确答案:√
解析:这是”短路求值”的特性,如果第一个操作数已经能确定结果,就不会计算第二个操作数。

8.1.4 非运算(!)详解

小丽举手问道:”小C老师,如果我想表达’不是’的意思怎么办呢?”

“好问题!”我说,”这就需要用到’非运算’了!”

// 基本非运算示例
printf("===基本非运算===n");
printf("!0 = %dn", !0);       // 输出:1(非假=真)
printf("!1 = %dn", !1);       // 输出:0(非真=假)
printf("!5 = %dn", !5);       // 输出:0(非真=假)
printf("!-1 = %dn", !-1);     // 输出:0(非真=假)

// 复合非运算示例
printf("n===复合非运算===n");
printf("!!0 = %dn", !!0);     // 输出:0(非非假=假)
printf("!!1 = %dn", !!1);     // 输出:1(非非真=真)
printf("!!!0 = %dn", !!!0);   // 输出:1(非非非假=真)

[图片:展示非运算的效果,类似于开关的切换]

练习题:

  1. 选择题:表达式”!!5″的结果是:
    A. 5
    B. -5
    C. 1
    D. 0

正确答案:C
解析:第一个!将5(真)变为0(假),第二个!将0(假)变为1(真)。

  1. 判断题:对任何数值x,!!x的结果都等于将x转换为布尔值。

正确答案:√
解析:两次非运算会将任何值规范化为布尔值1或0。

8.1.5 变量的逻辑运算

int a = 5, b = 0, c = -3;  // 定义三个变量

// 基本逻辑运算
printf("===变量的基本逻辑运算===n");
printf("a && b = %dn", a && b);    // 输出:0(5为真,0为假,真且假=假)
printf("a && c = %dn", a && c);    // 输出:1(5为真,-3为真,真且真=真)
printf("b || c = %dn", b || c);    // 输出:1(0为假,-3为真,假或真=真)
printf("!a = %dn", !a);            // 输出:0(非真=假)
printf("!b = %dn", !b);            // 输出:1(非假=真)

// 组合逻辑运算
printf("n===变量的组合逻辑运算===n");
printf("a && !b = %dn", a && !b);       // 输出:1(真且真=真)
printf("!a || b = %dn", !a || b);       // 输出:0(假或假=假)
printf("!(a && b) = %dn", !(a && b));   // 输出:1(非(真且假)=真)

// 带关系运算的逻辑运算
printf("n===变量的关系与逻辑运算组合===n");
printf("a > b && c < 0 = %dn", a > b && c < 0);    // 输出:1
printf("a > b || b > c = %dn", a > b || b > c);    // 输出:1
printf("!(a < b) = %dn", !(a < b));                // 输出:1

练习题:

  1. 选择题:已知int型变量a=3, b=0, c=5,则表达式!(a && b) || c的值为:
    A. 0
    B. 1
    C. 3
    D. 5

正确答案:B
解析:

  1. a && b = 0(因为b为0)

  2. !(a && b) = !0 = 1

  3. 1 || c = 1(因为第一个操作数已经为真)

  4. 选择题:已知int型变量x=2, y=0, z=-1,则表达式x && !y && z的值为:
    A. -1
    B. 0
    C. 1
    D. 2

正确答案:C
解析:

  1. !y = !0 = 1

  2. x && 1 && z = 1(因为x,z都是非0值)

  3. 逻辑运算的结果只能是0或1

  4. 判断题:如果变量a的值为-5,则!a的值为5。

正确答案:×
解析:!运算符是逻辑非运算,结果只能是0或1。当a为-5时,由于是非0值,所以逻辑值为真,!a的结果为0。

  1. 判断题:对于任意整型变量a和b,表达式!(a && b)与(!a || !b)的结果总是相同。

正确答案:√
解析:这是德摩根定律的体现。对于任意的逻辑值,”非(a且b)”等价于”(非a)或(非b)”。