C++ C中的if条件很有趣
我试图理解一些C/C++代码,它们是6-10年前快速而肮脏地编写的 这个if表达式是什么意思C++ C中的if条件很有趣,c++,c,boolean,boolean-logic,C++,C,Boolean,Boolean Logic,我试图理解一些C/C++代码,它们是6-10年前快速而肮脏地编写的 这个if表达式是什么意思 int s_adr, e_adr, empf_adr; // ... if (success == OK && (s_adr & 0x1f) == empf_adr && (e_adr & 0x20) && (s_adr & 0x20) ) (e_adr&0x20)是否与(e_adr&0x20)=
int s_adr, e_adr, empf_adr;
// ...
if (success == OK &&
(s_adr & 0x1f) == empf_adr &&
(e_adr & 0x20) &&
(s_adr & 0x20)
)
(e_adr&0x20)
是否与(e_adr&0x20)==1)
相同?或者我该怎么理解呢?我想这可能是一个愚蠢的问题,当你知道C和C++很好。但是我没有。不,这两个条件不一样<代码>(e_adr&0x20)与(e_adr&0x20)!=0
(事实上,如果此表达式的值不是零,则只能是0x20
)。这将有效地检查e_adr
的第6个最低有效位是否为非零
e_adr & 0x20
相当于
( e_adr & 0x20 ) == 0x20
也就是说,该表达式检查e_adr中是否设置了位5(我从0开始计算LSB中的位)
我的意思是,此表达式用于与代码剪切相关的if语句。:)(e_adr&0x20)表示您正在检查e_adr右侧的第6位是否设置为1。这当然不等于1。例如,假设e_adr为0x4430,(e_adr&0x20)变为0x0020(在解释为true或1的if条件下)。但是,如果e_adr为0x4440,(e_adr&0x20)变为0x0000(在被解释为false或0的if条件下)。该
&
是位运算,其中as&
是布尔运算
例如,以下是显而易见的
if (a && b) ...
然而,以下情况并非如此:
int a=1;
int b=2;
if (a & b) ...
if (a && b) ...
这两个if检查给出不同的结果。C中的布尔运算假定false
为0
,true
为0
以外的任何值。因此,上述代码中的布尔运算和&
将导致true
然而,位操作&
,对两个参数进行位AND运算。二进制中的1是0001,二进制中的2是0010。按位AND执行以下操作
0001
AND 0010
----
0000
将每个数字与进行AND运算以得出结果
0001和0010的位(或代码< < /代码>)将导致0011。< /P>这不是C++代码。在
(e_adr&0x20)
和(s_adr&0x20)
之间至少缺少一个运算符。更像(e_adr&0x20)相当于((e_adr&0x20)!=0),这实际上是基本的C。真==非-zero@wolfgang抱歉,我删除了注释并删除了&
:)在优化方面,我可能有点邪恶:(e\u adr&s\u adr&0x20)
e\u adr&0x20==0x20
是错误的。它是(e_adr&0x20)!=实际上是0
。@Frank Bollack你确定吗?:)我的意思是使用if语句中的表达式um。。。就逻辑条件检查而言,这是正确的(即,您可以用什么替换(e_addr&0x20)以获得相同的结果),但是((e_adr&0x20)!=0)是真正检查的内容的更准确表示。真的吗?有什么区别?@jsantander我刚刚检查:((0x20&0x20)==0x20)
为真,而(0x20&0x20==0x20)
为假0x20==0x20
首先计算。可能OP没有意识到像&这样的位运算,并将其与逻辑运算&混淆。我认为0=false,1=true
。现在我看到0=false,(!=0)=true
。很高兴知道,谢谢@在某些语言中使用mini me,这是正确的。然而,在C中,它不是。大多数人忽视的小事@mini-me:它实际上有点复杂,因为转换不是对称的0 false
是对称的,但是(!=0)->true
和true->1
。布尔转换有损:)@Trenin什么不正确?在C语言中,逻辑运算符将所有非零值都视为真,不是吗?@TannerSwett你说得对-在C语言中,非零表示真。我是说OPs最初的语句(0=false,1=true
)在C中是不正确的。可能应该更清楚一些。