在谈&&和||两个运算符的短路运算之前,先看一段程序:

 #include <stdio.h>

 int main()   

 {  

 int para1 = , para2 = , para3 = , para4 = ;  

 int r1 = , r2 =;  

 (r1 = para2 < para1) && (r2 = para3 > para4);  

 printf("r1 = %d, r2 = %d\n", r1, r2); 

 r1 = ;  

 r2 = ;  

 (r1 = para2 > para1) || (r2 = para4 < para3);  

 printf("r1 = %d, r2 = %d\n", r1, r2);  

 return ;  

 }  

上面程序运行后,r1和r2分别是多少?

有不少同学认为第一个printf函数应该会输出: 
r1 = 0, r2 = 0
因为para2 < para1为假,所以r1为0,para3 > para4也为假,所以r2也为0.

第二个printf函数应该会输出:
r1 = 1, r2 = 0
因为 para2 > para1为真,所以r1为1,para4 < para3为假,所以r2为0.

实际运行结果如下:

实际运行结果与大家想的不一样,原因在于&&和||运算符有一个“短路”的概念。
先来看:(r1 = para2 < para1) && (r2 = para3 > para4);
para2 < para1为假,所以r1为0,这个很好理解。此时&&左边就是0,那么不管&&右边是0还是1,也就是不管&&右边是假还是真,整个&&表达式就已经是假了,程序再去运行&&右边的表达式就没有意义了,所以程序不会去运行 (r2 = para3 > para4),也就是r2的值还是为1。当然,如果&&左边是1的话,那么程序还会继续执运行(r2 = para3 > para4)的,此时r2的值就为0了;

再来看: (r1 = para2 > para1) || (r2 = para4 < para3);
para2 > para1为真,所以r1为1,这个很好理解。此时||左边就是1,那么不管||右边是0还是1,也就是不管||右边是假还是真,整个||表达式就已经是真了,程序再去运行||右边的表达式就没有意义了,所以程序不会去运行 (r2 = para4 < para3),也就是r2的值还是为1;当然,如果||左边是0的话,那么程序还会继续执运行(r2 = para4 < para3)的,此时r2的值就为0了。

另外:在js中有

1 var test = undefined || 1; 2 console.log('test ='+test);

打印的结果为 test=1,即在 '||'中会获得‘真’

&&与||的短路运算的更多相关文章

  1. 短路运算|字符串操作函数|内存mem操作函数

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  2. Java语言基础---逻辑运算(长路短路运算)

    长路短路运算的区别 长路与运算&:是指在两边都是整数时,是逐位与运算,在两边是关系运算时,是逻辑运算. 短路与运算&&:是指从左至右,遇到false,则停止后面的运算. 长路或 ...

  3. && 和 || 逻辑运算符的短路运算

    &&和||的短路运算,是指如果在进行前面的表达式的运算过程,通过判断已经明确的知道整个表达式的结果,那么就不会进行后面表达式的运算判断. 表达式1 || 表达式2 || 表达式3... ...

  4. Day003 巧妙验证短路运算

    &&的短路运算 条件1&&条件2...&&条件n,程序会先判断条件1,如果条件1为false,则不判断后面的条件,直接返回false 怎么判断程序到底有 ...

  5. JS逻辑运算符&&与||的短路运算

    最近看到一个360面试题,题目如下: 下面代码的输出值是? alert(1&&2); 正确的结果是 2. 1.后来仔细研究了一下JS逻辑运算的相关内容,在MDN上面找到相应描述: 下面 ...

  6. js 逻辑的短路运算

    && 与运算 同时为true,才为true: 表达式1为false,不用看表达式2: || 或运算 有一个为true,就为true: 表达式1为true,不用看表达式2: && ...

  7. Javascript短路运算||和&&

    1.只要“||”前面为false,无论“||”后面是true还是false,结果都返回“||”后面的值. 2.只要“||”前面为true,无论“||”后面是true还是false,结果都返回“||”前 ...

  8. java短路问题

    java短路问题 短路运算符就是我们常用的"&&"."||",一般称为"条件操作". class Logic{ public ...

  9. php中的或运算

    1.今天碰到一个php或运算的面试题,很有趣,和大家分享一下.开始不明白什么原因. <?php $a = 0; $b = 0; if($a=3)>0 || ($b=3)>0) { $ ...

随机推荐

  1. dd装机

    如何在 Linux 系统中使用 dd 命令而不会损毁你的磁盘 使用 Linux 中的 dd 工具安全.可靠地制作一个驱动器.分区和文件系统的完整镜像. _这篇文章节选自 Manning 出版社出版的图 ...

  2. kafka 经典教程

    一.基本概念 介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计. 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: Kaf ...

  3. python(ValueError: invalid literal for int() with base 10: 'abc' ‘1.0‘’’)强制类型转换

    int()函数只能转化数字组成的字符串,看例子: >>> a=' >>> int(a) 123 >>> b='abc' >>> ...

  4. [Java][Web]利用 referer 防盗链

    String referer = request.getHeader("referer"); if(referer == null || !referer.startsWith(& ...

  5. linux下echo命令详解

    linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法 例如: echo $JAVA_HOME /export/se ...

  6. FTP服务器的搭建与配置

    主要来源:http://www.cnblogs.com/helonghl/articles/5533857.html 1.安装FTP服务器: yum install vsftpd -y 2.启动FTP ...

  7. django No migrations to apply 问题解决

    最近在用django写项目,有的时候字段不够用,需要models增加字段,但是想回滚或者修改或者修改了属性等,例如忘了添加meta table于是操作了migrations 导致makemigrati ...

  8. nodeJS的了解

    JavaScript不仅仅只能运行在浏览器中.任何有JS运行环境(runtime)的地方就可以运行JavaScript. Node.js对Google V8进行了封装. 有了Node.js,JavaS ...

  9. ceph journal更换位置

    只在这里做简单的演示 ceotos7 环境 3个mon节点 3个osd节点 环境搭建我这里不再叙述 我们查看一下分区情况: [root@ceph_1 ~]# lsblkNAME        MAJ: ...

  10. html中的一些常用的样式标签

    html中的一些常用的样式标签 <p>这里是文本,<mark>高亮</mark></p> <strong>加粗,加重语气</stron ...