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

印象中的逻辑运算符:

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

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

 

请思考下面的示例:

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int i = 0;
 6     int j = 0;
 7     int k = 0;
 8     
 9     ++i || ++j && ++k;
10 
11     printf("%d\n", i);
12     printf("%d\n", j);
13     printf("%d\n", k);
14     
15     return 0;
16 }

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

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

程序中的短路:

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

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

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

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

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

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

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

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

 

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

 1 #include <stdio.h>
 2 
 3 int g = 0;
 4 
 5 int f()
 6 {
 7     printf("In f()...\n");
 8 
 9     return g++;
10 }
11 
12 int main()
13 {
14     if( g || f() && f() )
15     {
16         printf("In if statement: %d\n", g);
17     }
18     
19     printf("In main(): %d\n", g);
20     
21     return 0;
22 }

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

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

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

示例:

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     printf("%d\n", !0);
 6     printf("%d\n", !1);
 7     printf("%d\n", !100);
 8     printf("%d\n", !-1000);
 9     
10     return 0;
11 }

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

 

小结:

  • 程序中的逻辑表达式遵从短路规则
  • 在 && 与 || 和混合运算时:
  •   --真个整个表达式被看做 || 表达式
  •   --从左向右先计算 && 表达式
  •   --最后计算 || 表达式
  • 逻辑非!运算符只认得0
  •   --碰见0返回1,否则统统返回0,也就是说在C语言中只有0才代表假,其余的所有值均代表真。
posted @ 2018-08-03 07:34  清浅...忆回  阅读(252)  评论(0编辑  收藏  举报