C Day 10

用“或”和“非”,
把危险条件挡在外面

今天学习逻辑或 ||、逻辑非 !,以及 &&|| 的短路判断。课程的新知识量也从今天开始增加。

|| 表示“或者”

|| 连接的左右条件只要至少一个成立,整个条件就成立。成绩小于 0 或大于 100,都属于非法成绩。

day10.c
if (score < 0 || score > 100)
{
    printf("成绩不合法\n");
}

边界测试中,-1 由左侧条件判断为非法,101 由右侧条件判断为非法;050100 都不会进入这个分支。

! 把判断结果取反

! 表示“不是”。!(score >= 60) 表示“不满足大于等于 60”,因此会接住未及格成绩。

day10.c
else if (!(score >= 60))
{
    printf("未及格\n");
}
else
{
    printf("及格\n");
}

对整个复合条件取反时,需要把 ! 放在整对括号前:!(score < 0 || score > 100) 表示成绩没有超出范围,与 score >= 0 && score <= 100 的效果相同。

短路判断让危险表达式不执行

对于 ||,左侧成立后就能确定整体成立,因此不再执行右侧;对于 &&,左侧不成立后就能确定整体不成立,因此也不再执行右侧。

||:左侧成立时短路
&&:左侧不成立时短路

利用这个规则,可以先检查除数是否非零,再决定要不要执行右侧的除法。

day10.c
if (number != 0 && 10 / number > 2)
{
    printf("商大于2\n");
}
else if (number == 0)
{
    printf("除数不能为0\n");
}
else
{
    printf("商不大于2\n");
}

number = 0 时,左侧 number != 0 不成立,右侧 10 / number 不会执行。测试 2 时商大于 2;测试 5 时商恰好等于 2,因此最终提示准确写成“商不大于2”。

今天真正掌握的内容

  • 理解 || 表示至少一边成立
  • 会用 ! 对单个条件或整个复合条件取反
  • 能区分 &&|| 的短路时机
  • 会用短路判断保护可能发生除零的表达式
  • 能检查“等于边界”是否符合输出文字

从今天开始,每天的新知识量约为此前的两倍。下一步将学习 switch 多分支选择和 break