返回 课程

信奥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 主题|小节
课 7, 主题|小节 4
进行中

7.3 混合运算的优先级魔法

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

[图片:运算优先级层次图,用不同层次展示各类运算符的优先级]

“小朋友们,”我在黑板上写道,”当关系运算遇到其他运算时,谁先计算呢?”

7.3.1 基本优先级规则

[图片:算术运算和关系运算混合时的计算顺序示意图]

// 1. 算术运算优先级高于关系运算
int a = 5, b = 3;
printf("%dn", a + 1 > b);     // 等价于 (a + 1) > b
printf("%dn", a > b + 1);     // 等价于 a > (b + 1)

// 2. 关系运算从左到右进行
printf("%dn", a + 2 > b + 1); // 先计算a+2和b+1,再比较

// 3. 使用括号改变优先级
printf("%dn", (a > b) + 1);   // 关系运算结果参与算术运算

7.3.2 复杂混合运算

[图片:复杂表达式的运算顺序分解图]

int x = 10, y = 5, z = 3;

// 算术运算和关系运算混合
printf("%dn", x + y > z * 2);     // 先计算x+y和z*2,再比较
printf("%dn", x - y <= z + 2);    // 先计算x-y和z+2,再比较

// 使用括号让运算更清晰
printf("%dn", (x + y) > (z * 2)); // 同上,但更易读
printf("%dn", (x - y) <= (z + 2)); // 同上,但更易读

// 多个运算组合
printf("%dn", x + y * 2 > z + 1); // 注意乘法优先级最高

7.3.3 特殊情况处理

int m = 8, n = 4;

// 1. 负数的比较
printf("%dn", -m > -n);     // 输出:0(-8不大于-4)

// 2. 零的比较
printf("%dn", m > 0);       // 正数和0比较
printf("%dn", -n < 0);      // 负数和0比较

// 3. 表达式结果的比较
printf("%dn", m / 2 == n);  // 除法运算后比较
printf("%dn", m % 3 != 0);  // 求余运算后比较

练习题:

  1. 选择题:如果x=10, y=5,表达式 x + 1 > y * 2 的计算顺序是?
    A. (x + 1) > (y * 2)
    B. x + (1 > y) * 2
    C. (x + 1 > y) * 2
    D. x + 1 > y + y

正确答案:A
解析:先进行算术运算x+1和y*2,再进行关系运算比较大小。

  1. 判断题:在表达式 a + b > c * d 中,乘法运算的优先级最高。

正确答案:√
解析:算术运算符中,乘除运算优先级高于加减运算,而所有算术运算优先级都高于关系运算。