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 ...
随机推荐
- Shell 命令行,实现对若干网站状态批量查询是否正常的脚本
Shell 命令行,实现对若干网站状态批量查询是否正常的脚本 如果你有比较多的网站,这些网站的运行状态是否正常则是一件需要关心的事情.但是逐一打开检查那简直是一件太糟心的事情了.所以,我想写一个 sh ...
- Android程序员学WEB前端(2)-HTML(2)-锚点链接列表表单-Sublime
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76522417觉得博文有用,请点赞,请评论,请关注,谢谢!~锚点 链接 列表 表单 &l ...
- 我也说说Emacs吧(2) - Emacs其实就是函数的组合
Emacs本质上是函数的组合 从帮助上看emacs有何不同 Vim和Sublime Text等编辑器,本质上是一个编辑器. 比如我们看看vim的帮助,是这个风格的,比如我要看i命令的帮助: <i ...
- java IO 学习(一)
io的类有好多个,总结一下,给他们列出来,下一行缩进为子类: File 文件或目录类 InputStream 字节输入流 FileInputStream 用于读取文件的原始字节流,变成字节输入流 By ...
- Uncaught TypeError: Cannot read property 'ownerDocument' of null
/********************************************************************* * Uncaught TypeError: Cannot ...
- 【剑指offer】判断一个序列是否是二叉搜索树的后序遍历,C++实现
原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出N ...
- BZOJ1002 FJOI2007 轮状病毒 【基尔霍夫矩阵+高精度】
BZOJ1002 FJOI2007 轮状病毒 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原 ...
- Google的跨平台开发高质量原生 UI 的移动 SDK---Flutter免费且开源
Flutter开发 https://www.cnblogs.com/zengfp/p/9927860.html Flutter 是 Google 用以帮助开发者在 iOS 和 Android 两个平台 ...
- 如何向map和reduce脚本传递参数,加载文件和目录
本文主要讲解三个问题: 1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数. 2 使用Streaming编写MapReduce程序(C/C++ ...
- C#飞行棋游戏
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...