这个C/C++ if()语句是否可以评估为TRUE?

Par*_*nse 5 c c++ if-statement conditional-statements

根据PC-lint,以下声明永远不会是TRUE:

if((variable & 0x02) == 1)
Run Code Online (Sandbox Code Playgroud)

我正在为嵌入式系统使用C编译器,TRUE只要设置了相应的位,就会对其进行评估variable.我想编译器正在进行TRUE/ FALSE比较两侧==而不是比较结果数字.换句话说,每次表达式(varable & 0x02)不为零(即TRUE)时,语句也将是TRUE,因为值1 is also TRUE(不为零).

我不知道C/C++标准是否清楚地定义了编译器在这种情况下应该如何表现.是否有C/C++专家可以根据标准(例如C90, C99,等)所说的回答这个问题?

PS:在上面的语句中,"variable"是一个unsigned char.

NPE*_*NPE 11

PC-lint是对的.假设var是一个整数变量,表达式var & 0x02可以计算为两个值:02.它永远不会等于1,这就是if声明所测试的内容.

为了对此进行扩展,将等于运算符应用于两个整数值.重要的是两个操作数是否评估相同的数字,而不是它们是同时"真实"还是"假".

要测试是否设置了位1,可以使用:

if (variable & 0x02) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

鉴于您的编译器的行为与您所说的一样,它显然是不合规的.但是,它几乎肯定会if (variable & 0x02)正确处理.我的建议是修复代码,这样如果你要更改编译器,它就不会默默地破坏.

最后,如果出现以下情况则情况不同:(1)代码是C++而不是C; (2)variable是一个阶级的实例; (3)该类使有问题的运算符超载.在这种情况下,行为归结为重载运算符实际执行的操作.

  • 由于存在重载运算符,因此在C++中不是这种情况. (4认同)
  • 理想情况下,如果要检查给定掩码中的所有位是否都已设置,则应始终使用"if((variable&CONST)== CONST)"模式. (2认同)

bdo*_*lan 6

在C++中,如果(并且仅当)variable是具有重载operator&且不符合正常按位AND语义的类的实例,则可以求值为真值.

在C中,这种情况总是错误的.§6.5.10定义了按位AND运算符的语义,并且它非常简单并且非常简单:

 4.二进制和运算符的结果是操作数的按位AND(即,当且仅当设置了转换的操作数中的每个相应位时,才设置结果中的每个位).

很明显,结果不能为1,因为在右侧操作数的转换值中没有设置1位(即0x02).

当然,如果在程序过去(或编译时)的某个时刻调用了未定义的行为,那么任何事情都可能发生.但是,除非存在这种可能性,否则您的编译器不符合要求.也就是说,破碎了.不幸的是,这在奇数嵌入式编译器上非常常见.如果你很幸运,你甚至可以报告错误并修复它.