C 语言 - 逻辑运算和短路求值
逻辑运算符:
| 运算符 | 含义 | 优先级 |
| ! | 逻辑非 | 高 |
| && | 逻辑与 | 中 |
| || | 逻辑或 | 低 |
举例:
!a:如果 a 为真,!a 为假;如果 a 为 假,!a 为真
a && b:a 和 b 同时为真,结果才为真;a 和 b 有一个为假,结果就为假
a || b:a 和 b 有一个为真或 a 和 b 全为真,结果就为真;a 和 b 全为假,结果才为假
逻辑表达式:
用逻辑运算符将两边的变量、数据或表达式连接起来,称之为逻辑表达式
#include <stdio.h> int main()
{
printf("%d\n", 3 > 1 && 1 < 2);
printf("%d\n", 3 < 1 && 1 < 2);
printf("%d\n", !(1));
printf("%d\n", !0 + 1 < 1 || !(3 + 1));
printf("%d\n", 'a' - 'b' && 'c'); return 0;
}
运行结果

!0 + 1 < 1 || !(3 + 1):!0 等于 1,1 + 1 小于 1,结果为0;3 + 1 等于 4,!(4) 为 0,所以结果为 0
'a' - 'b' && 'c':'a' - 'b' 的值为 -1,不等于 0,为真;'c' 的值也不为 0,所以结果为 1
短路求值:
短路求值又称最小化求值,是一种逻辑运算符的求值策略
#include <stdio.h> int main()
{
int a = 3, b = 3;
(a = 4) && (b = 5);
printf("a 的值为 %d ,b 的值为 %d\n", a, b);
(a = 1) || (b = 5);
printf("a 的值为 %d, b 的值为 %d\n", a, b);
return 0;
}
运行结果

#include <stdio.h> int main()
{
int a = 3, b = 3;
(a = 0) && (b = 5);
printf("a 的值为 %d ,b 的值为 %d\n", a, b);
(a = 1) || (b = 5);
printf("a 的值为 %d, b 的值为 %d\n", a, b);
return 0;
}
运行结果

逻辑与运算进行短路求值时:
先对 && 左边的表达式进行运算,如果左边运算的结果不等于 0 的话,将对 && 右边的表达式进行运算
如果 && 左边运算的结果等于 0 的话,就不对右边的表达式进行运算
逻辑或运算进行短路求值时:
无论 || 左边的表达式的值是否为 0,都会对 || 右边的表达式进行求值
C 语言 - 逻辑运算和短路求值的更多相关文章
- C语言对表达式的求值顺序不是明确规定的
讨论区看到的 WA来自那些递归下降求解的代码. 第一种情况,使用|| 和 &&: 例如s为所给串 int getval() { switch(s[c_s++]) { case 'p': ...
- 一个短路求值引起的一个小bug
今天在写一个判断字符串是否回文时因为短路求值问题导致了一个bug,记录如下: 代码如下 bool isPal(char str[],int len) { int begin=0; int end=le ...
- 一道PHP题引出的“短路求值”
今天群里有个人问了一个问题,代码如下: $a = 3; $b = 2; if ($a = 2 || $b = 5) { ++$a; } echo $a; 说代码段的执行的结果为1,问大家$a的 ...
- Julia - 短路求值
&& 和 || 的布尔运算符被称为短路求值 它们连接一系列布尔表达式,仅计算最少的表达式来确定整个链的布尔值 在表达式 a && b 中,只有 a 为 true 时才计 ...
- C/C++ 语言中的表达式求值
在此,首先向裘老师致敬! 裘宗燕:C/C++ 语言中的表达式求值 经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友 ...
- php实现用短路求值原理求1+2+3+...+n(短路求值是什么)(仔细分析题干)
php实现用短路求值原理求1+2+3+...+n(短路求值是什么)(仔细分析题干) 一.总结 1.仔细分析题干,找出要点:该递归还是得递归啊 2.短路求值原理:&&就是逻辑与,逻辑与有 ...
- js 实用技巧 短路求值
&&运算符 如果操作有false 则返回false 例如 0&&1 // 返回0 true&&false //返回false 0&&a ...
- C/C++ 语言中的表达式求值(原文作者:裘宗燕)
经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...
- C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算
运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateE ...
随机推荐
- 异形Modbus客户端 和 异形modbus服务器之间的通讯 侦听模式的modbus-tcp客户端通讯
前言 本文将使用一个Github公开的组件技术来实现一个异形ModBus TCP的客户端,方便的对异形Modbus tcp的服务器进行读写,这个服务器可以是电脑端C#设计的,也可以是特殊设备实现的,也 ...
- python爬虫入门(3)-环境搭建
下载集成包 链接:http://pan.baidu.com/s/1pKD2zBP 密码:f75b 这里采用python2.7.9 安装步骤:1.安装python2.7(默认安装即可) 2.打开“运 ...
- 数据链路层、ARP/RARP、ICMP、ping和traceroute
互联网基础: 数据链路层:RFC文档:894/1042/1340 为IP模块发送和接受IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答 ...
- socket创建UDP服务端和客户端
UDP服务端代码示例: from socket import * #1.创建数据报套接字 sockfd = socket(AF_INET, SOCK_DGRAM) #2.绑定服务端地 sockfd.b ...
- PDF文档过期时间/自毁设置
不是很完美的方法,可以凑活着用: 切换到Pages预览页,右击页面选页面属性 切换到Action,选Run a Javascript,代码: // PDF JavaScript to make it ...
- threejs 世界坐标与屏幕坐标相互转换
屏幕坐标转世界坐标: let pX = (screenPoint.x / this.scene.renderer.domElement.clientWidth) * 2 - 1; let pY = - ...
- System.IO.Pipelines来对消息进行Buffer合并
System.IO.Pipelines来对消息进行Buffer合并 https://www.cnblogs.com/smark/p/9927455.html .net core使用Pipelines进 ...
- 《DSP using MATLAB》示例Example 7.13
代码: M = 25; alpha = (M-1)/2; n = [0:1:M-1]; hd = (2/pi) * ( (sin( (pi/2)*(n-alpha) ).^2)./(n-alpha) ...
- python动态给对象或者类添加方法
参考:http://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object In Python, there is ...
- ASP.NET性能优化原则
从哪些方面对asp.net进行性能优化,本文作了详细的阐述,希望对大家有所帮助. 一.SqlDataRead和Dataset的选择Sqldataread优点:读取数据非常快.如果对返回的数据不需做大量 ...