现在假设有这样一种情况,我们的软件比较特殊,要求使用者必须成年,并且成绩大于等于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. iOS开发:icon和启动图尺寸(转)

    转至:http://www.cnblogs.com/shaoting/p/4941634.html 歪果仁的总结: Asset iPhone 6s Plus and iPhone 6 Plus (@3 ...

  2. window.open()函数

    http://hi.baidu.com/gagahjt/blog/item/7b76e0dee61b20aecd11661c.html open函数详解: window.open("sUrl ...

  3. linux 源码安装 Nginx

    1.安装前环境准备安装make:# yum -y install gcc automake autoconf libtool make安装g++:# yum install gcc gcc-c++ 2 ...

  4. PCI-Express协议传输层读书笔记

    http://www.doczj.com/doc/35cb19633169a4517723a3d9-9.html

  5. UIView总结

    转自:http://langhua9527.iteye.com/blog/1377741 如果想调用某个类的某个方法可以写成这样,这个方法来自NSObject类 performSelector: pe ...

  6. video标签常用属性及说明

    video标签常用属性(在标签内部使用) video常用API属性及方法(API属性是供JS调用的,不在video标签元素中直接使用)

  7. 李洪强iOS经典面试题36-简单介绍 ARC 以及 ARC 实现的原理

    李洪强iOS经典面试题36-简单介绍 ARC 以及 ARC 实现的原理   问题 简单介绍 ARC 以及 ARC 实现的原理. 考查点 ARC 是苹果在 WWDC 2011 提出来的技术,因此很多新入 ...

  8. jquery 获取字符串中的数字

    str_num = 'abc123' num = parseInt(str_num.replace(/[^0-9]/ig,"")); alert(num);

  9. python 快速获取文件类型

  10. Bootstrap学习笔记(5)--实现Bootstrap导航条可点击和鼠标悬停显示下拉菜单

    实现Bootstrap导航条可点击和鼠标悬停显示下拉菜单 微笑的鱼 2014-01-03 Bootstrap 5,281 次围观 11条评论 使用Bootstrap导航条组件时,如果你的导航条带有下拉 ...