根据PC-lint,以下语句永远不会TRUE
:
if((variable & 0x02) == 1)
我正在为嵌入式系统使用 C 编译器,只要设置了 variable
中的相应位,它就会将其评估为 TRUE
。我猜编译器正在对 ==
的两侧进行 TRUE
/FALSE
比较,而不是比较结果数字。换句话说,每当表达式 (varable & 0x02)
不为零(即 TRUE
)时,语句也将为 TRUE
,因为值 1 也是 TRUE
(不是零)。
我不知道 C/C++
标准是否明确定义了编译器在这种情况下的行为方式。有没有 C/C++
专家可以根据标准(例如 C90、C99
等)回答这个问题?
P.S.:在上面的语句中,“variable”是一个unsigned char。
最佳答案
PC-lint 是对的。假设 var
是一个整型变量,表达式 var & 0x02
可以计算出两个值:0
和 2
。它永远不会等于 1
,这是 if
语句正在测试的内容。
为了对此进行扩展,将相等运算符应用于两个整数值。重要的是两个操作数的计算结果是否相同,而不是它们是否同时为“真”或“假”。
要测试第 1 位是否已设置,可以使用:
if (variable & 0x02) {
...
}
鉴于您的编译器按照您所说的方式运行,它显然不符合要求。但是,它几乎肯定会正确处理 if (variable & 0x02)
。我的建议是修复代码,以便在您更改编译器时它不会无声地中断。
最后,如果出现以下情况,则情况有所不同: (1) 代码是 C++ 而不是 C; (2) variable
是一个类的实例; (3) 该类重载了相关运算符。在这种情况下,行为取决于重载运算符实际执行的操作。
关于c++ - 此 C/C++ if() 语句的计算结果是否为 TRUE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8091141/