为什么将int与enum比较时,重叠比较表达式的计算结果恒为真?
为什么判断恒为真
这个警告是逻辑运算符误用导致的,||(逻辑或)的规则是只要任意一个子条件为真,整个表达式结果就为真。
你写的判断someProtocolValue != protocol::tls || someProtocolValue != protocol::wss对所有可能的取值来说都永远成立:
- 如果变量值是
tls(对应2):满足「不等于wss」,整个表达式为真 - 如果变量值是
wss(对应4):满足「不等于tls」,整个表达式为真 - 如果变量值是其他整数/枚举值:两个条件都满足,表达式依然为真
所以这个if判断等于没有写过滤条件,里面的代码永远都会执行,编译器才会抛出这个警告。
修复方法
你应该是要实现变量既不是tls也不是wss时才执行内部代码的逻辑,两种正确写法:
- 把逻辑或改成逻辑与
&&:
if(someProtocolValue != protocol::tls && someProtocolValue != protocol::wss) { // Do work }
- 先匹配要排除的场景再整体取反,可读性更高:
if(!(someProtocolValue == protocol::tls || someProtocolValue == protocol::wss)) { // Do work }
内容的提问来源于stack exchange,提问作者jeffbRTC
相关产品推荐
相关产品推荐

