5

【C进阶】15、逻辑运算符

 2 years ago
source link: https://segmentfault.com/a/1190000040775890
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Summary

1)&&表达式从左向右计算,当遇到条件为假时,整个表达式为假,后面的表达式都不再执行,是为短路规则

2) ||表达式从左向右计算,当遇到条件为真时,整个表达式为真,后面的表达式都不再执行,是为短路规则

3)逻辑表达式中&&比||的优先级更高,表现为:当&&和||在同一个表达式中出现时,整个表达式被看作一个||表达式。先计算&&表达式,最后计算整个的||表达式,某个表达式为真的时候,整个||表达式就短路了。

4)C语言中的逻辑非"!"只认识0(假),其他的任何值都是非0(真)
"!"常用于if语句中判断表达式是否为假;也可用于将一个整数变为1,如!!100;

逻辑运算符的隐蔽知识点

1、&& 和 || 中的短路规则

  • || 从左向右开始计算:当遇到条件为真时停止计算,整个表达式为真;所有条件都为假时表达式才为假

    int LogicFunc(int i)
    {
      printf("LogicFunc(int i) : %d\n", i);
      return i;
    }
    
    int main()
    {
    
      if(LogicFunc(1) || LogicFunc(0))
      {
          printf("Logic expression is true");
      }
      else
      {
          printf("Logic expression is false");
    
      }
    }
    输出:
    LogicFunc(int i) : 1
    Logic expression is true
    
    原因:逻辑||表达式的短路规则,第1个表达式LogicFunc(1)返回1,为true,第二个表达式由于短路规则并未执行
  • && 从左向右开始计算:当遇到条件为假时停止计算,整个表达式为假;所有条件都为真时表达式才为真

    int LogicFunc(int i)
    {
      printf("LogicFunc(int i) : %d\n", i);
      return i;
    }
    
    int main()
    {
    
      if(LogicFunc(0) && LogicFunc(1))
      {
          printf("Logic expression is true");
      }
      else
      {
          printf("Logic expression is false");
    
      }
    }
    输出:
    LogicFunc(int i) : 0
    Logic expression is false
    
    原因:逻辑&&表达式的短路规则,第1个表达式LogicFunc(0)返回0,false,第二个表达式由于短路规则并未执行

2、&& 和 || 混合运算时的规则

逻辑表达式中&&比||的优先级更高,表现为:当&&和||在同一个表达式中出现时,整个表达式被看作一个||表达式。先计算&&,最后计算||。

  • // 以下代码的输出是?
      int i = 0;
      int j = 0;
      int k = 0;
    
      int t = ++i || ++j && ++k;
    
      printf("t = %d\n", t);
      printf("i = %d\n", i);
      printf("j = %d\n", j);
      printf("k = %d\n", k);
  • 输出:
    t = 1
    i = 1
    j = 0
    k = 0
    
    分析:
    ++i || ++j && ++k;  ==> 等价于一个逻辑或表达式 (1 && ++i) || (++j && ++k);
    左边的逻辑与表示,1为真,继续计算++i,i自增1,然后取值,所以左侧表达式也为真
    这时候遇到了逻辑或表达式的短路规则:左侧表达式已经为真,右侧的表达式不再计算。
    因此,j和k仍然为0

3、"!"究竟是神马

C语言中的逻辑非运算符只认得0,碰见0就返回1;否则就返回0;

    printf("%d\n", !0);        // 1
    printf("%d\n", !-1);       // 0
    printf("%d\n", !100);      // 0
    printf("%d\n", !!100);     // 1

本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请指正。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK