☀️光天化日学C语言☀️(11)- 逻辑运算符 | 我是一个有逻辑的人

英雄哪里出来 发表于 2021/07/10 11:42:53 2021/07/10
【摘要】 我是一个有逻辑的人

一、前言

  本文作者是从 2007 年开始学 C语言 的,不久又接触了C++,基本就是 C/C++ 技术栈写了 14 年的样子,不算精通,但也算差强人意。著有《夜深人静写算法》系列,且承诺会持续更新,直到所有算法都学完。主要专攻 高中 OI 、大学 ACM、 职场 LeetCode 的全领域算法。由于文章中采用 C/C++ 的语法,于是就有不少读者朋友反馈语言层面就被劝退了,更何况是算法。
  于是,2021 年 06 月 12 日,《光天化日学C语言》 应运而生。这个系列文章主要服务于高中生、大学生以及职场上想入坑C语言的志同道合之人,希望能给祖国引入更多编程方面的人才,并且让自己的青春不留遗憾!
  这一章的主要内容是逻辑运算符。

二、人物简介

  • 第一位登场的就是今后会一直教我们C语言的老师 —— 光天。
  • 第二位登场的则是今后会和大家一起学习C语言的没什么资质的小白程序猿 —— 化日。

三、逻辑运算符

1、概览

  • 逻辑运算符是用来做逻辑运算的,也就是我们数学中常说的 “与或非”。
  • C语言中的逻辑运算符主要有三个,如下:

2、表示方式

  • C语言中的逻辑运算符和数学中的含义类似,但是表示方法截然不同,对应关系如下:
逻辑运算符释义 操作数个数 C语言表示 数学表示
二元操作符 && \land
二元操作符 || \lor
一元操作符 ! ¬ \lnot
  • 二元操作符的操作数是跟在符号两边的,而一元操作符的操作数则是跟在符号右边的。
  • 逻辑运算符的操作数可以是变量、数值 或 表达式。例如:

1)变量

  • a && b
  • a || b
  • !a

2)数值

  • a && 520
  • 1314 || 520
  • !0

3)表达式

  • a + b && c + d
  • a + b || c + d
  • !(a + b)

四、逻辑运算符的应用

1、运算结果


[^_^]:
* 在C语言中,我们一般将值为零的变量、数值 或表达式称为 “假”,非零值称为 “真”。所以逻辑运算的结果也只有 “真” 和 “假” 两种状态。

1)与运算(&&)

对于与运算,参与运算的操作数都为 “真” 时,结果才为 “真”,否则为 “假”。

#include <stdio.h>
int main() {
    printf("%d\n", 0 && 0);  // 0
    printf("%d\n", 5 && 0);  // 0
    printf("%d\n", 0 && 5);  // 0
    printf("%d\n", 5 && 9);  // 1
    return 0;
}
  • 注释中的内容,就是实际输出的内容。
  • 我们发现,无论操作数原本是什么,程序只关心它是 “零” 还是 “非零”。然后根据&&运算符自身的运算规则进行运算。

2)或运算(||)

对于或运算,参与运算的操作数都为“假”时,结果才为“假”,否则为“真”。

#include <stdio.h>
int main() {
    printf("%d\n", 0 || 0);  // 0
    printf("%d\n", 5 || 0);  // 1
    printf("%d\n", 0 || 5);  // 1
    printf("%d\n", 5 || 9);  // 1
    return 0;
}
  • 注释中的内容,就是实际输出的内容。
  • 我们同样发现,无论操作数原本是什么,程序只关心它是 “零” 还是 “非零”。然后根据||运算符自身的运算规则进行运算。

3)非运算(!)

对于非运算,操作数为 “真”,运算结果为 “假”;操作数为 “假”,运算结果为 “真”;

#include <stdio.h>
int main() {
    printf("%d\n", !0);  // 1
    printf("%d\n", !5);  // 0
    return 0;
}
  • 注释中的内容,就是实际输出的内容。
  • 八个字概括:非真即假,非假即真。

2、运算符嵌套

  • 和 关系运算符 一样,逻辑运算符也是可以支持嵌套的,即运算结果可以继续作为逻辑运算符的操作数,例如如下代码:
#include <stdio.h>
int main() {
    int a = !( (5 > 4) && (7 - 8) && (0 - 1) );
    printf("%d\n", a);
    return 0;
}
  • (5 > 4)(7 - 8)这两个表达式进行与运算,等价于:1 && 1,结果为1
  • 1(0 - 1)继续进行与运算,等价于1 && 1,结果为1
  • 1进行非运算,得到结果为 0
  • 所以这段代码最后输出的结果为:
0

3、运算符优先级

  • 接下来,我们看下三个运算符混合运用的情况,对于如下代码:
#include <stdio.h>
int main() {
    int a = !( 1 || 1 && 0 );
    printf("%d\n", a);
    return 0;
}

  • 这个问题的答案是:
0


[^_^]:
* 是不是和你想象的有些不一样呢?
* 对哦,我得到的结果明明是 1 啊。

  • 我们再来看个例子,区别只是在1 || 1的两边加上一个括号。
#include <stdio.h>
int main() {
    int a = !( (1 || 1) && 0 );
    printf("%d\n", a);
    return 0;
}
  • 现在输出的答案变成了:
1
  • 这是为什么呢?
  • 因为&&的优先级是比||要高的,所以在没有任何括号的情况下,&&会优先计算,简而言之,对于刚才的( 1 || 1 && 0 ),我们把它等价成( 1 || (1 && 0) ),这样是不是就好理解了。
  • 用类似的方法,我们可以得到 !的优先级是最高的,所以这三个符号的优先级排序如下:
  •   <   & &   <   ! || \ < \ \&\& \ < \ !

  • 当然,后面的章节,我们会对 算术运算符、关系运算符、逻辑运算符 等等所有的运算符的优先级 和 结合性 进行一个梳理,尽情期待 ~~

通过这一章,我们学会了:
  1)与运算:有假必假;
  2)或运算:有真必真;
  3)非运算:非真即假,非假即真;

  • 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!

课后习题


📢博客主页:https://blog.csdn.net/WhereIsHeroFrom
📢欢迎各位 👍点赞 ⭐收藏 📝评论,如有错误请留言指正,非常感谢!
📢本文由 英雄哪里出来 原创,转载请注明出处,首发于 🙉 CSDN 🙉
作者的专栏:
  👉C语言基础专栏《光天化日学C语言》
  👉C语言基础配套试题详解《C试题100例》
  👉算法进阶专栏《夜深人静写算法》

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。