• 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
    ", i);
    12     printf("%d
    ", j);
    13     printf("%d
    ", 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()...
    ");
     8 
     9     return g++;
    10 }
    11 
    12 int main()
    13 {
    14     if( g || f() && f() )
    15     {
    16         printf("In if statement: %d
    ", g);
    17     }
    18     
    19     printf("In main(): %d
    ", g);
    20     
    21     return 0;
    22 }

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

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

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

    示例:

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

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

    小结:

    • 程序中的逻辑表达式遵从短路规则
    • 在 && 与 || 和混合运算时:
    •   --真个整个表达式被看做 || 表达式
    •   --从左向右先计算 && 表达式
    •   --最后计算 || 表达式
    • 逻辑非!运算符只认得0
    •   --碰见0返回1,否则统统返回0,也就是说在C语言中只有0才代表假,其余的所有值均代表真。
  • 相关阅读:
    小谈HTML中的META标签
    如何安装ASPAJAXExtSetup.msi
    <asp:Content> MasterPage技术
    Asp.Net数据控件引用AspNetPager.dll分页
    2011年的最后一天,怎么地也应该写篇博客
    asp.net利用存储过程和div+css实现分页(类似于博客园首页分页)
    Asp.Net 利用TimeSpan类实现时间差计算 并返回所需字符串(类似于SNS)
    最简单的asp.net ajax post,适用于初学者.
    分享AjaxPro或者Ajax实现机制
    Windows 7操作系统 IIS 7 配置asp.net网站伪静态配置问题
  • 原文地址:https://www.cnblogs.com/luojianyi/p/9411268.html
Copyright © 2020-2023  润新知