Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C中的if条件很有趣_C++_C_Boolean_Boolean Logic - Fatal编程技术网

C++ C中的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)=

我试图理解一些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)==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中是不正确的。可能应该更清楚一些。