有趣的是,如果条件为C

Funny if condition in C

本文关键字:条件 如果      更新时间:2023-10-16

我正在努力理解一些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)。这有效地检查CCD_ 6的第6最低有效位是否为非零。

&是一个位运算,其中作为&&是一个布尔运算。

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

if (a && b) ...

然而,以下情况并非如此:

int a=1;
int b=2;
if (a & b) ...
if (a && b) ...

这两个if检查给出不同的结果。C中的布尔运算假定false0,而true是除0之外的任何值。因此,上述代码中的布尔运算&&将产生true

然而,位运算&对这两个参数进行逐位AND运算。二进制中的1是0001,二进制中的2是0010。按位AND执行以下

    0001
AND 0010
    ----
    0000

每个数字都进行"与"运算以得到结果。

0001和0010的逐位OR(|)将产生0011。

(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条件下)。

e_adr & 0x20

相当于

( e_adr & 0x20 ) == 0x20

也就是说,这个表达式检查在e_adr中是否设置了位5(我从LSB开始计数从0开始的位)

我的意思是,这个表达式用于if语句中,该语句与您的代码片段有关。:)