[C/C++]中按位“与”“或”“异或”的优先级比“==”低

C/C++中运算符优先级汇总 编程语言C运算符优先级 优先级1: ( )、[ ]、->、 . 含义:圆括号、下标运算符、指向结构体成员运算符、结构体成员运算符 优先级2:!、~、++、――、-、(类型)、*、&、sizeof (单目运算符,结合方向自右至左) 含义:逻辑非、按位取反、自增、自减、负号、类型转换、指针、地址与、长度运算符 优先级3:*、/、% 含义:乘法、除法、求余运算 阅读详情

项目调试时发现一个小问题,由于优先级没有搞对,导致的Bug。关于运算符优先级的问题以前学习的时候就没有太放在心上,因为一直觉得这个东西背了也没啥用,写程序的时候实在不行多加几个括号不就完事儿了吗。道理是不错的,这次就是少加了括号导致了一个常见的小Bug。记录一下,以后注意。

在C/C++中,if 语句简直是太常用了,if 语句中的条件判断为真的时候执行下面的语句(块),否则就不执行这些语句(块)。

又,C/C++中,宏定义也是个经常用的东西,特别是用来定义一些常量。

所以,经常能见到 if 语句的条件中会这么用:

#define SOME_MACRO 0x01
{
    Data d;
    
    if( d & SOME_MACRO == 0 )
    { do_something(); }
}

上面的例子中,我们的本意是判断 d 的第0位是不是0,如果是0就执行下面的一些操作。

但是由于“==”的优先级比按位与“&”、按位或“|”和按位异或“^”高,导致上面这样写之后程序并不能按我们想象的那样执行。首先编译器会计算SOME_MACRO==0是否为真(结果为false,0),然后计算d&0是否为真。结果一直都是0,所以这个 if 分支语句中的程序是永远不会被执行的。

所以,在写类似的程序的时候,一定要注意运算符的优先级,用括号将前面的按位与括起来。如下:

#define SOME_MACRO 0x01
{
    Data d;
    
    if( (d & SOME_MACRO) == 0 )//d第0位为0
    { do_something(); }
}

多说一句,左移(<<)和右移(>>)的优先级是比“==”高的。

最后,建议在写这些表达式的时候加上够多的括号,不要考验自己对优先级知识的熟练程度,将功能正确地实现才是第一位。

【C/C++】逗号表达式、算术运算符优先级 11 && 逻辑与 表达式&&表达式 左到右 双目运算符。12 || 逻辑或 表达式||表达式 左到右 双目运算符。7 == 等于 表达式==表达式 左到右 双目运算符。9 ^ 按位异或 表达式^表达式 左到右 双目运算符。10 | 按位或 表达式|表达式 左到右 双目运算符。8 & 按位与 表达式&表达式 左到右 双目运算符。6 > 大于 表达式>表达式 左到右 双目运算符。3 / 除 表达式/表达式 左到右 双目运算符。4 + 加 表达式+表达式 左到右 双目运算符。 阅读详情

相关推荐

C/C++运算符优先级

介绍 刷题碰到了好几个这类问题,百度百科的,整理下来。 在一个表达式中可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象;由于表达式有多种运算,不同的运算顺序可能得出不同结果甚至出现错误运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性。 C语言 优先级 运算符 名...

coologic 596

C语言与,或,非,同或,异或,左移,右移及优先级,查表法计算一个十进制数中1的个数

C语言与,或,非,同或,异或,左移,右移及优先级,查表法计算一个十进制数中1的个数

qq_42939980的博客 7572

代谢组学数据分析实战:用R语言从PCA、PLS-DA到OPLS-DA一步步搞定(附代码)

本文详细介绍了使用R语言进行代谢组学数据分析的全流程,从数据预处理到PCA、PLS-DA和OPLS-DA模型构建与验证。通过实际案例和代码示例,帮助研究者掌握关键分析技术,提升数据解读能力,特别适合生命科学领域的研究人员。

weixin_28689507的博客 133

按位与、或、非、异或

按位与、或、非、异或总结

weixin_46899589的博客 2352

基于555定时器的D类功放设计:从PWM原理到无反馈电路实践

D类功放(数字功放)是一种高效率的音频放大技术,其核心原理是脉冲宽度调制(PWM)。它将输入的模拟音频信号转换为一系列高速开关的脉冲,通过控制功率开关管(如MOSFET)的通断,再经低通滤波器还原放大后的音频。相比传统AB类功放,其转换效率通常超过90%,显著降低了热能损耗。这项技术在追求高能效和小型化的现代音频设备中价值凸显,广泛应用于有源音箱、汽车音响和便携式设备。本文聚焦于一种独特的实现方案:以经典的555定时器芯片为核心,构建一个无整体负反馈的D类功放。通过剖析其PWM调制器、FET电压-电流转换级

weixin_30162121的博客 222

DEMATEL-ISM模型的Python实现——方法介绍以及代码复现

本文参考文献与网络资料,对DEMATEL-ISM方法做了介绍何步骤描述,并给出Python代码进行了计算和绘图。

cros1的博客 2万+

常见的十大运算符及其优先级

常见运算符及其优先级

qq_39100354的博客 1万+

Android双目摄像头(RGB+IR)实时预览与人脸活体检测实战指南

本文详细介绍了Android双目摄像头(RGB+IR)实时预览与人脸活体检测的实战指南。通过双摄同步预览、人脸检测与活体判断等技术实现,提升安全认证的准确性和鲁棒性。文章还提供了开发环境搭建、常见问题解决方案及性能优化建议,帮助开发者快速掌握双目摄像头在Android平台的应用。

vulkan6gpu的博客 691

位运算符的用法及C语言运算符优先级解析

位运算:&、|、^、~         其他运算符:>、>>、! 常用的位运算符有&(按位与)、|(按位或)、^(按位异或)、~(按位取反),另外还有在单片机常用的开发运算符有&&(并且)、||(或者)、~(取反)、!(非)、、>>、、>>>、 位运算把所需要运算的信息看作是二进制组成的信息,按位执行相应的功能后得到相应的结果。 常用位运算符有&(按位与)、|(按位或)、^(

zi_yang的博客 9840

ABAP 百科全书的阅读目录(2024版)

909 篇 ABAP 技术文章的目录

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4246

Python爬虫教程:抓取纽约时报文章存档

爬虫技术主要用于从网站上抓取并提取数据。HTTP请求:使用requests库发送HTTP请求以获取网页。网页解析:使用或lxml库解析HTML网页。数据存储:将抓取的数据保存为CSV、JSON等格式,或者存储在数据库中。防反爬虫技术:模拟正常的用户请求,避免被反爬虫机制封锁。多线程与异步爬取:提高抓取效率。通过这篇博客,您已经学习了如何使用Python爬取纽约时报的历史文章存档。本文介绍了如何模拟请求头、抓取网页内容、解析HTML并提取数据,最后存储到CSV文件或数据库中。

2201_76125261的博客 593

c++ 运算符及优先级

左右两个条件都成立时,整体才成立。 左右两个条件中有一个成立,整体就成立。 ?前面是判断语句,当成立时输出:左边值,不成立时输出:右边值。 4、按位或(|) 相同位的两个数字都为0,则为0,若有一个不为0,则为1; 5、按位与(&) 相同位的两个数字都为1,则为1,若有一个不为1,则为0; 与运算用来判断,判断是否包含相应的属性。也可以用来清理其它位。 6、按位取反(~) 单目运算,将一个数字所有二进制0变1,1变0。(无符号时

滴水穿石的博客 1573

目标检测YOLO实战应用案例100讲-跨模态、多级别融合的RGB-D显著目标检测方法研究(续)

在第二章介绍了本研究的跨模态特征融合方法,第二章对于多级别特征的融合, 使用的是与基线模型baseline相同的方法:相邻级别的特征中,高级特征进行上采 样到与低级特征相同的尺度,再将高级特征通过降维得到与低级特征相同的通道数 量,最后对二者进行特征叠加,如此自顶向下的进行多级别的特征融合。本章主要 介绍本研究在特征层面的另一发现,并基于此发现引出的本文的第二个创新点:多 级别特征的融合方法。另外,在网络最深层,本文设计了一个新的模块来获取大的 感受野,对于大尺度目标能够增加更多语义信息,提升检测效果。 骨

qq_36130719的博客 467

c/c++位操作简介--移位、位与、位或、异或

首先,计算机内部是以补码形式表示(参见:http://www.cnblogs.com/tenghoo/archive/2008/06/01/1211663.html)的,而且c移位操作采取补0还是补符号位依赖于具体的机器,在80x86中采用的是:对无符号数采用逻辑移位方式(即补0)实现,对符号数的向左移位采用和无符号数相同的方法,对符号数的向右移位采用补符号位的方式。 i52400,win7,v

enockipp的小'码'头 8892

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型

一、本文介绍 本文记录的是基于MobileNet V4的YOLOv11目标检测轻量化改进方法研究。MobileNet V4通过整合UIB、Mobile MQA以及优化的NAS策略,能够在在不降低性能指标的前提下,降低计算成本。本文配置了原论文中MNv4-Conv-S、MNv4-Conv-M、MNv4-Conv-L、MNv4-Hybrid-M和MNv4-Hybrid-L五种模型,以满足不同的需求。 模型 参数量 计算量 推理速度 YOLOv11m 20.0M 67.6GFLOPs 3.5ms

Limiiiing的博客 4458

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++中的位运算符:与、或、异或详解

在 C++ 中,位运算符用于对整数类型的二进制位进行操作,包括等。它们直接作用于内存中的二进制位,运算效率极高,常用于底层编程(如驱动开发、嵌入式)、数据压缩、加密等场景。

2509_93306611的博客 1814

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C/C++运算优先级

最近复习C++基础知识的时候,发现对这部分还是有些模糊。常用的+ - × ÷,括号等运算符对于它们的优先级还是比较明确的。但是涉及到移位运算,逻辑运算这种,再结合四则运算,就有点分不清了。为此这篇博客就记录一下,后面再稍微结合点例子举例说明一下。这篇博客总结了一下运算优先级表,并举了一些简单和稍微复杂的例子作为辅助。后期在编程中遇到优先级问题,其实最好的方式我觉得是加括号。但是有时做题目,或者看别人的代码,理解时还需要脑子里有这个对照表。

Edwinwzy的博客 3310

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C/C++操作符的优先级和结合性问题浅析

两个相邻操作符的执行顺序由它们的优先级决定。例如: a + b*c,在这个表达式中,乘法和加法操作符是两个相邻的操作符,由于乘法的优先级比加法高,所以乘法运算先于加法运算执行。编译器在这里别无选择,它必须先执行乘法运算。 如果它们的优先级相同,它们的执行顺序由它们的结合性决定。例如:a + b + c,由于 + 操作符的结合性是由左到右(L-R),所以先计算a+b,然后计算(a+b)+c。 除...

Reborn Lee 3466

位运算符(一):C/C++位运算符

    位运算是指按二进制进行的运算。在程序中,常常需要处理二进制位的问题。C/C++语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。    在实际应用中,建议用unsigned整型操作数,因为带符号操作数可能因为不同机器结果不同。

jason的专栏 1万+

C++异或运算符

     c/c++的|、||、&、&&、异或、~、!运算  (2011-09-16 15:19:50) 转载▼ 标签:  运算符   右移   二进制   左移   c语言   it 分类:...

Time Limit Exceeded on test 99 5038

C/C++操作硬件的位运算

C/C++操作硬件的位运算 上节我们讲了逻辑运算符。 本节我们讲位运算。 一般用于处理硬件。把地址0x80040的寄存器的最低四位设置成0110 使用位运算符:&, |,~,^,<<,>>(位与,位或,位非,异或,左移,右移) 什么是位: 一个字节8位,内存一个字节一个字节的排列。 位与 & 0 & 0 0 0 & 1 0 1 & 0 0 1 & 1 1 对应位,都是1结果才是

qq_44989173的博客 561

[转载]位运算之 C 与或非异或

位运算比较易混: 位运算之 C 与或非异或   与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:| 两者都为0为0,否则为1 1|1 = 1,  1|0 = 1,  0|1 = 1, 0|0 = 0 非运算:...

刚刚好的博客 280

位运算之 C 与或非异或

位运算比较易混: 位运算之 C 与或非异或   与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:| 两者都为0为0,否则为1 1|1 = 1,  1|0 = 1,  0|1 = 1, 0|0 = 0 非运算:~ 1取0,0取1 ~1 = 0, ~0 = 1 ~(10001) = 01

HI的专栏 9365
上一篇: Qt中文乱码问题在4.x版本和5.x版本的解决方法
下一篇: [C++]深度探索C++对象模型——关于默认构造函数
dummy_bot
博客等级 码龄10年 35粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值