为什么程序会错过"if"运算符?
Why does program miss 'if' operator?
问题是程序执行错误,因为它显然错过了某些函数中的条件语句。
下面是一些示例:
void f(uint32_t eventsFlags) // eventFlags == 0x1
{
// statement 1
...
// statement N
if (SOME_VAL_1 | eventsFlags) // SOME_VAL_1 == 0x1 (true)
{
// statement N+1
...
// statement M
}
if (SOME_VAL_2 | eventsFlags) // SOME_VAL_2 == 0x40 (false)
{
// statement M+1
...
// statement K
}
}
当我调试它时,"语句 N+1"紧跟在"语句 N"之后,缺少它们之间的条件检查。同样的事情发生在"语句 M"和"语句 M+1"以及它们之间的条件检查上。这就是执行从 M+1 到 K 的语句的原因,但它们不能执行。
编辑:诅咒我,因为我没有注意到有|
而不是&
因为它确实&
,直到我不专心地在某个时候更改了代码。
0x40
将被计算为 true,任何不为零的整数也是如此。由于0x40 | x
对于任何x
始终将至少一个位设置为 1,因此它永远不会变为 0,因此此表达式将始终计算为true
。0x1
也是如此。
您可能想使用&
来检查标志是否包含特定值:
if (SOME_VAL_1 & eventsFlags) {...}
if (SOME_VAL_2 & eventsFlags) {...}
您正在检查的条件始终为真。eventsFlags
没有值使其为 false,因为SOME_VAL_1
始终不为零。
如果a
和b
是整数,则仅当a
和b
均为零时,(a | b)
才为假。
相关文章:
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- -> if (C++) 中的运算符
- 三元运算符和 if constexpr
- 为什么程序会错过"if"运算符?
- 是否可以在C++中使用三元运算符在 if 语句中选择比较运算符?
- c++ 如何计算赋值运算符(if 语句)
- 带有逻辑 OR 运算符的 if 条件的缩写?
- 为什么使用 and 运算符比较 if 语句中的 2 个对象会抛出错误,而使用 2 if 语句则不会
- 令牌之前缺少二进制运算符 "#" 当 #define 在 #if 内时出错
- 为什么 if 语句对于运算符重载函数计算 false
- 使用 if (? 运算符) 语句传递带有指针的数组
- 我们可以在if语句中使用三元运算符
- 算子!() 和运算符 --() 在 if 条件下
- 如何修复"运算符不匹配=="比较if语句中的字符串时
- 如何像if语句一样使用三元运算符
- 用if-statement移动构造函数,但使用三元运算符复制构造函数
- 条件运算符vs if then else
- 在C++中使用位运算符还是if语句更快
- 比较运算符的类似数学的链接 - 如 "if ( (5<j<=1) )"
- 为什么 codevision avr 忽略"if"运算符中的某些语句?