c++ - 此 C/C++ if() 语句的计算结果是否为 TRUE?

标签 c++ c if-statement conditional-statements

根据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 可以计算出两个值:02。它永远不会等于 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/

相关文章:

if-statement - bool 值的 `if let` 和 `if` 之间是否存在任何性能差异?

c++ - C++ 中的基本多线程(执行顺序)

c - 如何在c中正确实现strcpy?

c++ - gtest 是否支持文件比较?

c - 指针的作用类似于局部变量,并且不会在函数中保留其修改

c - Shellcode 未运行

mysql - IF 语句问题 : MySQL

java - 如何使用 Java Optional 转换复杂的 if 条件

c++ - 适用于 Windows 的 Eclipse - 使用 libPNG

c++ - 使用 Eigen 库的函数返回矩阵