当我在Visual Studio 2019中的C++控制台应用程序中使用以下最小代码时,我会收到两个警告,这两个警告完全相反。
int main()
{
unsigned char op1 = 0x1;
unsigned char op2 = 0x3;
unsigned char result1 = op1 | op2;
unsigned char result2 = op1 || op2;
}
unsigned char result1 = op1 | op2;
上的警告是
Int-logical-bitwise-mismatch使用位“|“当逻辑”||可能是故意的unsigned char result2 = op1 || op2;
上的警告是
lnt-logical-bitwise-mismatch使用逻辑“||'当按位'|可能是故意的
这有点奇怪
我的意图是使用位运算符。如何更改unsigned char result1 = op1 | op2;
行,以便Visual Studio 2019警告消失?
警告不是来自编译器;输出是无误差的。它可能来自ReSharper C++模块或Visual Studio代码分析。
(Of当然,我可以忽略这个警告,但是在原始代码中有很多这样的警告,因为有很多无符号的char位操作。
2条答案
按热度按时间gk7wooem1#
lnt-logical-bitwise-mismatch
是一个Visual Studio Linter规则。它告诉你,逻辑运算符应该只与布尔值一起使用:按位运算符应该只用于整数,而不是字符:
请参阅here了解更多详细信息。
如果你不想要这个警告,你可以在 * 选项->文本编辑器-> C/C++ ->代码样式-> Linter* 中配置linter。
我不是说这些规则有意义。我只是在回答为什么你会看到这些曲线以及如何避免它。这些规则的有用性是另一个问题。
8wtpewkr2#
为什么在
unsigned char
上使用位操作符或逻辑操作符?逻辑运算符是在布尔值上完成的,你想要一个true或false值。
按位运算符用于整数或字节。
因此,这两个例子都是错误的,你正确地得到了关于它们的警告,误导的是,在这两种情况下,数据类型才是真实的问题。
如果你对所有4个都使用
uint8_t
,你会看到位运算符的警告消失了,但逻辑运算符的警告没有。对于编译器(和调试器)来说,'uint8_t'和'unsigned char'是相同的,但对于阅读器(和linter)来说,它们不是。如果你使用人们理解的类型,代码会更清楚地向读者传达它的含义。