C语言逻辑运算符和||,一篇文章带你读懂逻辑表达式!

article/2025/10/29 11:48:07

目录

逻辑运算符有哪些?

         逻辑运算符的短路特性

逻辑运算符在表达式求值中的问题

逻辑运算符&&、||混合的不同情况


逻辑运算符有哪些?

C 语言提供了以下三种逻辑运算符。

一元:!(逻辑非)。

二元:&&(逻辑与)、||(逻辑或)。


以上三种逻辑运算符中,逻辑非 ! 的优先级最高,逻辑与 && 次之,逻辑或  ||  优先级最低。即算术、逻辑、赋值运算符的优先级顺序为:

逻辑非 !   >   算术   >   逻辑与 &&    >    逻辑或 ||    >    赋值=

逻辑表达式的值为逻辑值,即布尔型(bool),该类型为 C99 新增的,一些编译器可能还不支持该类型。
逻辑值分为逻辑真值和逻辑假值。一般情况下,在判断时,仅有零值被判断为逻辑假值(false),一切非零值均可被判断为逻辑真值(true);在存储和表示时,通常,使用 1 表示逻辑真值,0表示逻辑假值。
逻辑与 && 运算符的运算规则:只有两个操作数均为逻辑真时,结果才为真。其余情况,结果均为假。
逻辑或 || 运算符的运算规则:只有两个操作数均为逻辑假时,结果才为假。其余情况,结果均为真。

 例如,设有定义语句

int a=3,b=5;

则有:

!a:由于 a 非零,为真,!a 为假,其值为 0。

a||b:由于 a 和 b 均非零,均为真,故逻辑或的结果为真,其值为 1。

a&&b:由于 a 和 b 均非零,均为真,故逻辑与的结果为真,其值为 1。

!a||b&&2:由于逻辑非 ! 优先级最高,首先与 a 结合,而 && 优先级高于 ||,相当于(!a)||(b&&2), 即 0||1 为真,其值为 1。

此外,&&和||还有“短路”的特性

逻辑运算符的短路特性

逻辑与 &&、逻辑或 || 均有“短路”特性:

逻辑与&&“短路”:当逻辑与&&的左操作数为逻辑假时,就足以判断该逻辑运算的结果为假了,故右操作数就不再被执行。

逻辑或||“短路”:当逻辑或||的左操作数为逻辑真时,就足以判断该逻辑运算的结果为真了,故右操作数就不再被执行。

例如:

int a=1,b=2,c;

c=a||++b;

printf("a=%d,b=%d,c=%d\n",a,b,c);

由于 a 为非零值,即为真,而当逻辑或 || 的左操作数为真时,就足以判断该逻辑操作的结果为真。故发生“短路”,即右操作数 ++b 不被执行。输出结果为:a=1,b=2,c=1。

注:我们在看|| &&的问题时  应该将问题看为 ■||■   ■&&■ 的问题

其中,■可以是a、b、x、y这样的一个变量也可以是1、2、’a’这样的整型常量,还可以是整体的一个表达式语句 例如(a+b)、++a,将表达式看成整体■ 更方便且更准确我们去区分“短路问题”


逻辑运算符在表达式求值中的问题

这是简单的逻辑短路,我们再看看复杂一点的问题

 

公布答案:

从结果我们可以看出,只有x的值发生了变化

疑问: &&的优先级不是高于||吗 为什么不是先计算&&,所以按道理y和z的值都改变才对不是吗?

我们再看  将++y&&++z 用括号括起来

 ()的优先级够高吧,并且将整体括了起来,可是结果表明 括号里面完全没有计算啊?

由此看出 优先级 在逻辑表达式中并没有起到优先的作用

 即 在含有逻辑表达式的表达式求值中运算符的优先级并不影响逻辑运算符求值顺序

                          其实,优先级只是改变了结合顺序,但并不改变运算顺序

引入谭浩强的“短路法则”

c把先计算哪部分的决定权留个设计者,但&&和||是例外,c语言保证&&和||的求值顺序是从左到右,一旦发现某个元素让表达式无效立即停止运算(短路法则)。”

在上述问题中

表达式相当于:++x || (++y&&++z)
&&优先级确实是高,所以,(++y&&++z)做为一个整体
而||的规则就是,左侧为true,右侧不执行。 所以,即便是++x || (),右面是括号,优先级最高,也是先执行||左侧的。   等同于   ■||■  的问题


 有点感觉了吧!趁热打铁,再看一个复杂的例子

分析以下程序,输出其运行结果。

int main(void)
{int a=0,b=2,c;c=!a||++b&&a--;printf("a=%d,b=%d,c=%d\n",a,b,c);return 0;
}

代码分析:
混合表达式 c=!a||++b&&a-- 中含有的运算符有逻辑非 !、逻辑或 ||、逻辑与 &&、算术前缀 ++、算术后缀 --、赋值号 = 等6个运算符。逻辑运算符、算术运算符、赋值运算符的优先级的关系为:

 逻辑非!     >       算术     >      逻辑与&&    >     逻辑或 ||       >      赋值 =

由于该表达式中赋值运算符优先级最低,故最后赋值。
根据优先级的高低,表达式 !a||++b&&a-- 等价于 (!a)||((++b)&&(a--)),而逻辑或 || 的左操作数 !a 为真,此时足以判断该表达式的值为真。故发生“短路”,即 || 的整个右操作数 ((++b)&&(a--)) 不再被执行。

运行结果为:
a=0,b=2,c=1

所以该问题实际上还是短路法则的问题,运算符优先级不影响。


到此,相信你已经对&& ||的运算问题已经有了很深刻的理解

逻辑运算符&&、||混合的不同情况

以下是对该类问题的不同类型区分结果

 情况一:

#include<stdio.h>
int main()
{int a=1,b=2,c=3,ans;ans=a++&&++b&&++c;printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

 注意 a虽然是后++ 但执行完也改变了哦!

情况二:

#include<stdio.h>
int main()
{int a=1,b=2,c=3,ans;ans=++a&&++b||++c;printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

 ans=++a&&++b||++c; 相当于   ans=(++a&&++b)||++c;

所以c的值不变

 情况三:

#include<stdio.h>
int main()
{int a=1,b=2,c=3,ans;ans=++a&&(++b||++c);printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

 

 &&后半部分得到++b的值就可以了 所以c还是不变

情况四:

#include<stdio.h>
int main()
{int a=0,b=2,c=3,ans;ans=a&&(++b||++c);printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

和之前的问题一样,()并不改变&&运算顺序

所以得到a=0后就停止运算了

情况五:

#include<stdio.h>
int main()
{int a=0,b=2,c=3,ans;ans=a||(++b&&++c);printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

 

 和之前不一样哦,这里a=0了,所以会判断&&

ans=a||++b&&++c;  不加括号的结果也一样哦

但是注意 结合顺序并不是  ans=(a||++b)&&++c;

 

!!这里虽然结果一样,但只是巧合!!

比如

#include<stdio.h>
int main()
{int a=1,b=2,c=3,ans;ans=++a||++b&&c++;printf("ans=%d,a=%d,b=%d,c=%d\n",ans,a,b,c);return 0;
}

 

 应该看作 ans=++a||(++b&&c++);   所以 a的值改变 b c都不会改变

但是如果看做 ans=(++a||++b)&&c++;   则a、c改变 b的值不会改变 

牢记 优先级只是改变了结合顺序,但并不改变运算顺序

内容都是自己原创,属实不易,未经允许请勿擅自转载哦!

祝你学习进步,生活愉快~


http://chatgpt.dhexx.cn/article/2b8jRBOM.shtml

相关文章

勒让德符号判断二次剩余-C语言

近日备考学习二次剩余理论&#xff0c;其中了解到勒让德符号这个相比欧拉定理更加方便判断一个正整数在一个模数下是否为二次剩余&#xff1b; 基于勒让德符号理论的学习&#xff0c;本文旨在通过程序来实现基于勒让德符号的二次剩余判断方法&#xff1b; 本文着重点在于运算…

二次剩余入门

昨天训练的时候遇到一道题怎么也不会做&#xff0c;在网上搜了题解之后第一次听说了二次剩余&#xff0c;看了一天各种dalao的博客&#xff0c;在这里总结一下自己所理解的二次剩余及其用法。 1&#xff0c;什么是二次剩余&#xff1f; 2&#xff0c;二次剩余有什么用&#xff…

平方剩余(二次剩余)

平方剩余&#xff1a; 设p是奇素数(即大于2的素数)&#xff0c;如果二次同余式 有解&#xff0c;则a称为模p的平方剩余&#xff0c;否则a称为模p的平方非剩余(二次非剩余)(之所以规定p是大于2的素数&#xff0c;是因为p 2时解上面的二次同余式非常容易。 求出p 5&#xff…

二次剩余--欧拉准则

在 数论中&#xff0c; 二次剩余的 欧拉判别法&#xff08;又称 欧拉准则&#xff09;是用来判定给定的 整数是否是一个 质数的 二次剩余。 目录 1 叙述2 举例 2.1 例子一&#xff1a;对于给定数&#xff0c;寻找其为二次剩余的模数2.2 例子二&#xff1a;对指定的质数p…

二次剩余问题x的求解及代码实现(python)

一、问题引入 二次剩余是数论基本概念之一。它是初等数论中非常重要的结果&#xff0c;不仅可用来判断二次同余式是否有解&#xff0c;还有很多用途。C.F.高斯称它为算术中的宝石&#xff0c;他一人先后给出多个证明。 [1] 研究二次剩余的理论称为二次剩余理论。二次剩余理论…

二次剩余(学习笔记)

就是用来求解 x 2 ≡ n &VeryThinSpace; m o d &VeryThinSpace; p x^2\equiv n \bmod p x2≡nmodp的一个方法 对 p p p进行分类讨论&#xff1a; p 2 p2 p2 &#xff0c;则 x n xn xn p p p为奇素数 勒让德符号&#xff1a; ( a p ) { 1 a 在 模 p 意 义 下 是 二…

(转载)二次剩余(知识总结+板子整理)

思路来源 https://blog.csdn.net/kele52he/article/details/78897187&#xff08;二次剩余&#xff09; https://blog.csdn.net/stevensonson/article/details/85845334&#xff08;二次剩余&#xff09; https://blog.csdn.net/skywalkert/article/details/52591343?locat…

二次同余方程(二次剩余)

文章目录 一、介绍1.定义2.定理 二、判别1.勒让德符号&#xff08;Legendre Symbol&#xff09;2.欧拉判别准则&#xff08;Eulers criterion&#xff09;(1)内容(2)证明(3)注意 三、 x 2 ≡ n ( m o d x^2≡n(mod x2≡n(mod p ) p) p)——奇波拉算法&#xff08;Cipollas alg…

二次剩余 数论 勒让德

在数论中&#xff0c;特别在同余理论里&#xff0c;一个整数对另一个整数的二次剩余&#xff08;英语&#xff1a;Quadratic residue&#xff09;指的平方除以得到的余数。 当存在某个&#xff0c;式子成立时&#xff0c;称“是模的二次剩余” 当对任意&#xff0c;不成立时&…

二次剩余

title: 二次剩余 date: 2019-08-27 00:10:46 tags: 数论 一、定义&#xff08;Quadratic_residue&#xff09; 一个整数X对另一个整数p的二次剩余 d 注意这边的取模是 X 2 X^2 X2 和 d 都要对p取模噢 eg. 3 2 ≡ 2 ( m o d 7 ) 3^2≡2 (mod\ 7) 32≡2(mod 7),我们称 2是7的…

win10增加美式键盘

仅为做记录 我的系统为win10专业版 1809 首先进入语言首选项 选择添加语言 选择英语&#xff08;美国&#xff09; 之后选择拼写、键入和键盘设置 在输入的最下面选择高级键盘设置 选择语言栏选项 更改按键顺序选项中可以修改切换语言的快捷键 本质上是切换语言种类而不是输…

删除Win10英语国际键盘的方法

按下winR打开运行&#xff0c;键入regedit点击确定打开注册表 在注册表中依次展开&#xff1a;HKEY_CURRENT_USER\Keyboard Layout\Preload 改成下面的样子&#xff1a; 这个表示默认输入法是英语-美式键盘&#xff0c;接下来是中文-美式键盘。 注1&#xff1a;可以右键创…

win10添加美式键盘_戴尔笔记本win10降win7教程

现在大多数人电脑操作系统都是win10&#xff0c;但是很多人由于各种原因&#xff0c;比如部分软件限制&#xff0c;还是不得不继续使用win7操作系统&#xff0c;有些朋友自己安装win7的时候会发现各种问题&#xff0c;始终安装不上&#xff0c;接下来我整理下win10降win7的办法…

超详细window10添加美式键盘

转自https://blog.csdn.net/qq_41139830/article/details/80500841 打开控制面板->添加语言 然后点击图中的添加语言 选择英语 选择英语(美国) 然后回到下图这个界面&#xff0c;就会发现多出了美式键盘 &#xff08;如果美式键盘在上面&#xff0c;就要将其下移&#xff0…

win10切换输入法快捷键_软件快捷键失灵,可能是你没有安装美式键盘

工程类用到的软件&#xff0c;比如Altium designer、keil、ccs、Quartus ii等基本都是老外开发的&#xff0c;他们的工作的键盘模式都是美式键盘&#xff0c;快捷键也相应的是美式键盘下的快捷键&#xff0c;这就导致我们自己在使用这些软件时&#xff0c;要注意选择键盘类型&a…

Win10怎么设置默认输入法为美式英文键盘

默认的输入法就是进入系统后一打字就是你想要的那一种输入法。WIN10的默认输入法是微软拼音输入法&#xff0c;它是一个中文的输入法&#xff0c;用起来不是很方便。 相对来说&#xff0c;大部分人都是习惯输入法默认的状态是英文的。这样可以在输入网址&#xff0c;或是在码字…

win10添加美式键盘_在win10中使用多种键盘布局,你知道如何操作吗

Windows10操作系统允许用户使用多种键盘布局&#xff0c;用户可以在初始设置过程中添加一个或多个键盘布局(也称为“开箱即用”体验(OOBE))。但是&#xff0c;如果你配置了错误的布局&#xff0c;或者以后需要键入不同的语言&#xff0c;则可以随时添加和更改键盘配置。 一般情…

Win10添加美式键盘

为什么80%的码农都做不了架构师&#xff1f;>>> WIN8也可以这实现&#xff01; ###在“中文”内添加美式键盘需要修改注册表。 打开CMD&#xff0c;输入 regedit 打开注册表编辑器&#xff1b; 转到 HKEY_CURRENT_USER/Keyboard Layout/Substitutes&#xff0c; 新…

win10添加美式键盘_WIN10系统必做的6个优化,优化完电脑性能飙升。

现在越来越多的人开始用WIN10系统了&#xff0c;而对于习惯了使用WIN7系统的用户来说&#xff0c;刚刚开始接触WIN10系统&#xff0c;确实会有点不适应&#xff0c;特别是使用过程中一会儿弹出一个对话框&#xff0c;一会儿一个什么通知的&#xff0c;不厌其烦&#xff0c;接下…

win10添加美式键盘_Win10自带的这6款软件,90%的人都不知道,但个个都好用到爆!...

什么&#xff0c;微软还出过我不知道的软件&#xff1f; 你别不信&#xff0c;这篇文章三顿就要给大家分享6个微软官方出品的软件神器&#xff0c;而且全都无需安装无需下载&#xff0c;它们就藏在你的操作系统里&#xff0c;一起来看看吧&#xff01; 微软拼音输入法 一说到输…