关于c:C进阶15逻辑运算符

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语言进阶课程》。
如有错漏之处,恳请斧正。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理