如果条件在C中有趣

Bit*_*lue 2 c c++ boolean-logic boolean

我试图理解一些像6 - 10年前那样快速而肮脏的 C/C++代码.

这个if-expression是什么意思?

int s_adr, e_adr, empf_adr;
// ...

if (success == OK &&
    (s_adr & 0x1f) == empf_adr &&
    (e_adr & 0x20) &&
    (s_adr & 0x20)
    )
Run Code Online (Sandbox Code Playgroud)

(e_adr & 0x20)一样的((e_adr & 0x20) == 1)吗?或者我该如何理解?我想当你非常了解C和C++时,这可能是一个愚蠢的问题.但我没有.

izo*_*ica 9

没有这两个条件不一样.(e_adr & 0x20)与此相同(e_adr & 0x20) != 0(事实上​​,如果此表达式的值不为零,则它只能是0x20).实际上,这检查第6个最低有效位e_adr是否为非零.


Tre*_*nin 5

&是一个位操作,其中&&一个布尔操作.

例如,以下是显而易见的;

if (a && b) ...
Run Code Online (Sandbox Code Playgroud)

但是,以下情况不是:

int a=1;
int b=2;
if (a & b) ...
if (a && b) ...
Run Code Online (Sandbox Code Playgroud)

这两个if检查会给出不同的结果.C中的布尔运算假设false0true除了之外的任何东西0.因此,&&上面代码中的布尔运算将导致true.

&然而,位操作是两个参数的按位AND.二进制1是0001,二进制2是0010.按位AND执行以下操作

    0001
AND 0010
    ----
    0000
Run Code Online (Sandbox Code Playgroud)

每个数字都进行AND运算以产生结果.

|0001和0010的按位OR()将导致0011.