有趣的是,如果条件为C
Funny if condition in C
我正在努力理解一些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中的布尔运算假定false
是0
,而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语句中,该语句与您的代码片段有关。:)
相关文章:
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 如果条件,当我想第二个参数时
- 如果验证容器的大小并在同一条件语句下访问元素,这是很好的做法吗?
- 如果语句错误地读取字符串,则始终在第一个条件返回
- 如果条件取决于模板类型并且在编译时已知,是否可以保证C++编译器不会生成分支?
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- 如果条件 C++,如何跳过下一行
- 如果条件,为什么它没有进入内部?
- 如果检查和内联条件之间是否存在编译器差异
- 如果前一个测试条件成功,则禁用测试条件
- 如果满足嵌套条件,则计算结果未显示结果C
- 如果条件太长,包括 for 循环
- 如果条件检查,多个向量大小相等
- 如果有条件使用String.length()的条件,为什么不一致地评估这一点
- 我可以将循环用作如果其他条件语句
- 如果constexpr(条件)为编译时条件
- const_cast 与布尔值:如果条件被忽略
- 如果语句计算结果为 false,即使条件为真
- 如果任何条件是错误的,如何从for循环中返回false