C语言进阶—— 逻辑运算符分析15

时间:2022-06-01 17:10:00

印象中的逻辑运算符:

  ---学生:老师,在我的印象中,逻辑运算符用在条件判断的时候,真挺简单的,还有必要深究吗?

  ---老师:逻辑运算符确实在条件判断的时候用的比较多,但是并不能说简单。。。

请思考下面的示例:

 #include <stdio.h>

 int main()
{
int i = ;
int j = ;
int k = ; ++i || ++j && ++k; printf("%d\n", i);
printf("%d\n", j);
printf("%d\n", k); return ;
}

我们分析一下第九行的代码,逻辑与&&的优先级更高,应该限制性++j和++k,然后根据短路原则,++i不用执行,但是真的是这样吗?

运行结果和我们分析的完全相反,为什么呢,逻辑与的优先级是更高啊!

程序中的短路:

---  ||  从左向右开始计算:

  •   当遇到为真的条件时停止计算,整个表达式为真
  •   当所有条件为假的时候表达式才为假

--- &&  从左往右开始计算:

  •   当遇到条件为假的时候停止计算,整个表达式为假
  •   当所有条件为真时表达式才为真

咦?短路原则需要遵循从左往右开始计算,那么是不是与我们认可的优先级原则矛盾呢?

其实没有:逻辑表达式中,毫无疑问 && 比 || 具有更高的优先级

  其实上面例子中的第九行代码可以稍微改变一下结构     ++i || ++j && ++k;   >>>>>  (++i) || (++j && ++k);  >>>>>  (true&& ++i) || (++j && ++k);

在 && 和 || 混合运算的时候,整个表达式被看做 || 表达式,编译器从左向右开始计算每一个 && 表达式(遵循了优先级原则),当某个 && 表达式的值为真的时候,停止计算,整个表达式的值为真。

理解完了上面的代码可以尝试着看一下这段代码:

 #include <stdio.h>

 int g = ;

 int f()
{
printf("In f()...\n"); return g++;
} int main()
{
if( g || f() && f() )
{
printf("In if statement: %d\n", g);
} printf("In main(): %d\n", g); return ;
}

具体的分析思路和上面一样!

还有一种逻辑运算符  “!”   它究竟是什么呢?

  C预言中的逻辑非 !只认得0,只知道见了0就返回1.因此当其碰见的值不是0时,其结果为0.

示例:

 #include <stdio.h>

 int main()
{
printf("%d\n", !);
printf("%d\n", !);
printf("%d\n", !);
printf("%d\n", !-); return ;
}

这段代码的运行结果就很好的说明了逻辑非!运算符只认得0。

小结:

  • 程序中的逻辑表达式遵从短路规则
  • 在 && 与 || 和混合运算时:
  •   --真个整个表达式被看做 || 表达式
  •   --从左向右先计算 && 表达式
  •   --最后计算 || 表达式
  • 逻辑非!运算符只认得0
  •   --碰见0返回1,否则统统返回0,也就是说在C语言中只有0才代表假,其余的所有值均代表真。