现在假设有这样一种情况,我们的软件比较特殊,要求使用者必须成年,并且成绩大于等于60,该怎么办呢?

或许你会想到使用嵌套的 if 语句,类似下面这样的代码:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int age;
  5. float score;
  6. printf("请输入你的年龄和成绩:");
  7. scanf("%d %f", &age, &score);
  8. if(age >= 18){
  9. if(score >= 60){
  10. printf("你满足条件,欢迎使用该软件\n");
  11. }else{
  12. printf("抱歉,你的成绩不及格,不能使用该软件\n");
  13. }
  14. }else{
  15. printf("抱歉,你还未成年,不能使用该软件!\n");
  16. }
  17. return 0;
  18. }

这种方法虽然能够行得通,但不够简洁和专业,我们可以将其压缩为一条 if else 语句:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int age;
  5. float score;
  6. printf("请输入你的年龄和成绩:");
  7. scanf("%d %f", &age, &score);
  8. if(age>=18 && score>=60){
  9. printf("你满足条件,欢迎使用该软件\n");
  10. }else{
  11. printf("抱歉,你还未成年,或者成绩不及格,不能使用该软件!\n");
  12. }
  13. return 0;
  14. }

&&是一个新的运算符,称为逻辑运算符,表示age>=18score>=60两个条件必须同时成立才能执行 if 后面的代码,否则就执行 else 后面的代码。

在高中数学中,我们就学过逻辑运算,例如p为真命题,q为假命题,那么“p且q”为假,“p或q”为真,“非q”为真。在C语言中,也有类似的逻辑运算:

运算符 说明 结合性 举例
&& 与运算,双目,对应数学中的“且” 左结合 1&&0、(9>3)&&(b>a)
|| 或运算,双目,对应数学中的“或” 左结合 1||0、(9>3)||(b>a)
! 非运算,单目,对应数学中的“非” 右结合 !a、!(2<5)

逻辑运算的结果

在编程中,我们一般将零值称为“假”,将非零值称为“真”。逻辑运算的结果也只有“真”和“假”,“真”对应的值为 1,“假”对应的值为 0。

1) 与运算(&&)

参与运算的两个表达式都为真时,结果才为真,否则为假。例如:

5&&0

5为真,0为假,相与的结果为假,也就是 0。

(5>0) && (4>2)

5>0 的结果是1,为真,4>2结果是1,也为真,所以相与的结果为真,也就是1。

2) 或运算(||)

参与运算的两个表达式只要有一个为真,结果就为真;两个表达式都为假时结果才为假。例如:

10 || 0

10为真,0为假,相或的结果为真,也就是 1。

(5>0) || (5>8)

5>0 的结果是1,为真,5>8 的结果是0,为假,所以相或的结果为真,也就是1。

3) 非运算(!)

参与运算的表达式为真时,结果为假;参与运算的表达式为假时,结果为真。例如:

!0

0 为假,非运算的结果为真,也就是 1。

!(5>0)

5>0 的结果是1,为真,非运算的结果为假,也就是 0。

输出逻辑运算的结果:

  1. #include <stdio.h>
  2. int main(){
  3. int a = 0, b = 10, c = -6;
  4. int result_1 = a&&b, result_2 = c||0;
  5. printf("%d, %d\n", result_1, !c);
  6. printf("%d, %d\n", 9&&0, result_2);
  7. printf("%d, %d\n", b||100, 0&&0);
  8. return 0;
  9. }

运行结果:
0, 0
0, 1
1, 0

优先级

逻辑运算符和其它运算符优先级从低到高依次为:

赋值运算符(=) < &&和|| < 关系运算符 < 算术运算符 < 非(!)

&& 和 || 低于关系运算符,! 高于算术运算符。
 
按照运算符的优先顺序可以得出:

  • a>b && c>d  等价于  (a>b)&&(c>d)
  • !b==c||d<a  等价于  ((!b)==c)||(d<a)
  • a+b>c&&x+y<b  等价于  ((a+b)>c)&&((x+y)<b)

另外,逻辑表达式也可以嵌套使用,例如a>b && b || 9>ca || c>d &&  !p

逻辑运算符举例:

  1. #include <stdio.h>
  2. int main(){
  3. char c='k';
  4. int i=1,j=2,k=3;
  5. float x=3e+5,y=0.85;
  6. printf( "%d,%d\n", !x*!y, !!!x );
  7. printf( "%d,%d\n", x||i&&j-3, i<j&&x<y );
  8. printf( "%d,%d\n", i==5&&c&&(j=8), x+y||i+j+k );
  9. return 0;
  10. }

运行结果:
0,0
1,0
0,1

本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x|| i && j-3式,先计算j-3的值为非0,再求i && j-3的逻辑值为1,故x||i&&j-3的逻辑值为 1。对i<j&&x<y式,由于i<j的值为1,而x<y为0故表达式的值为1,0相与,最后为0,对i==5&&c&&(j=8)式,由于i==5为假,即值为0,该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+ y||i+j+k由于x+y的值为非0,故整个或表达式的值为1。

C语言逻辑运算符的更多相关文章

  1. malloc函数详解 C语言逻辑运算符

    今天写线性表的实现,又遇到了很多的难题,C语言的指针真的没学扎实.很多基础都忘了. 一是 :malloc 函数的使用. 二是:C语言逻辑运算符. 一.原型:extern void *malloc(un ...

  2. 逻辑运算符及其优先级,C语言逻辑运算符及其优先级详解

    C 语言提供了以下三种逻辑运算符. 一元:!(逻辑非). 二元:&&(逻辑与).||(逻辑或). 以上三种逻辑运算符中,逻辑非 ! 的优先级最高,逻辑与 && 次之,逻 ...

  3. (C语言逻辑运算符!)&&两种定义字符串的方法&&局部变量、全局变量&&内部函数、外部函数。(新手基础知识备忘录)

    (一)      四个逻辑运算符:!(逻辑非) ||(或) &&(与) ^ (异或) 位运算:&(与) |(位或) (二)        如何定义字符串: 1,字符串常量   ...

  4. Object Pascal 运算符

          Object Pascal 的运算符 运算符是程序代码中对各种类型的数据进行计算的符号,通常分为算数运算符.逻辑运算符.比较运算符和按位运算符. 1.算术运算符Object Pascal ...

  5. Markdown公式(二)

    参考资料https://gavin_nicholas.coding.me/archives/ 1. 如何输入括号和分隔符 () . [] 和 | 表示自己, {} 表示 {} .当要显示大号的括号或分 ...

  6. JSP2 特性

    JSP2 新特性 1.直接配置 JSP 属性 2.表达式语言 3.简化的自定义标签 API 4.Tag 文件语法 如果要使用 JSP2 语法,web.xml 文件必须使用 Servlet2.4 以上版 ...

  7. c语言基础表达式, 关系运算符, 逻辑运算符, 位运算符, 数据的取值范围, 分支结构(if...else, switch...case)

    1.表达式: 表达式的判断是有无结果(值), 最简单的表达式是一个常量或变量, 如:12, a, 3 + 1, a + b, a + 5 都是表达式 2.BOOL(布尔)数据类型: c语言中除了基本数 ...

  8. 【学习笔记】【C语言】逻辑运算符

    有时候,我们需要在多个条件同时成立的时候才能执行某段代码,比如:用户只有同时输入了QQ和密码,才能执行登录代码,如果只输入了QQ或者只输入了密码,就不能执行登录代码.这种情况下,我们就要借助于C语言提 ...

  9. C语言基础学习运算符-逻辑运算符

    逻辑运算符 逻辑运算符是根据表达式的值来返回真值或是假值.C语言中的逻辑运算符就三种,如下表所示: 列如: 更多学习内容,就在码芽网http://www.mayacoder.com/lesson/in ...

随机推荐

  1. PySpark的DataFrame处理方法

    转:https://blog.csdn.net/weimingyu945/article/details/77981884 感谢! ---------------------------------- ...

  2. Chrome 浏览器端口的坑:ERR_UNSAFE_PORT

    nodejs 启动了一个6000端口的服务 本来是打算测试用的,结果一直报以下错误 但我使用 curl 来请求该接口地址是正常的.这就很纳闷了. 经过一番折腾无果之后,百度才知道.这个6000端口是非 ...

  3. atitit.词法分析的实现token attilax总结

    atitit.词法分析的实现token attilax总结 1. 词法分析(英语:lexical analysis)跟token 1 1.1. 扫描器 2 2. 单词流必须识别为保留字,标识符(变量) ...

  4. Linux Kernel源码浏览

    https://www.kernel.org/http://lxr.linux.no/

  5. redis储存中文,客服端读取出现乱码

    [root@cache03 ~]# redis-cli -h 192.168.1.112 -p 6379 192.168.1.112:6379> set chen 陈林 OK 192.168.1 ...

  6. redis 做为缓存服务器 注项!

    作为缓存服务器,如果不加以限制内存的话,就很有可能出现将整台服务器内存都耗光的情况,可以在redis的配置文件里面设置: # maxmemory <bytes> #限定最多使用1.5GB内 ...

  7. 深入浅出MFC--第一章

    Windows程序的生与死 当使用者按下系统菜单中的Close命令项,系统送出WM_CLOSE.通常程序的窗口函数不拦截次消息,于是DefWindowProc函数处理它.DefWindowProc收到 ...

  8. C++重载IO操作符

    操作符的重载有一定的规则,而IO操作符必须重载为普通函数,且应该声明为类的友元函数.我试了,非友元也可以,但是必须提供访问成员变量的函数,所以,出于效率的考虑还是应该定义为友元. 规则如下: 1.  ...

  9. TortoiseGit状态图标不能显示

    一开始网上搜到的办法基本都一样,都试过了,没有效果: 办法一: 注册表中找到 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ ...

  10. win7下如何显示缅文和使用缅文输入法?

    windows 7 操作系统默认不支持缅文,所以缅文在win7上不能显示,当然也没有提供缅文输入法. 一.显示缅文 windows系统下显示缅文字母只需要安装缅文字体就可以了.目前常见的缅文字体就是Z ...