Visual Studio 逻辑运算符与位运算符,两者都错了吗?

zrfyljdw  于 8个月前  发布在  其他
关注(0)|答案(2)|浏览(134)

当我在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位操作。

gk7wooem

gk7wooem1#

lnt-logical-bitwise-mismatch是一个Visual Studio Linter规则。它告诉你,逻辑运算符应该只与布尔值一起使用:

bool op1 = true;
bool op2 = false;
bool result2 = op1 || op2;

按位运算符应该只用于整数,而不是字符:

unsigned int op1 = 0x1;
unsigned int op2 = 0x3;
unsigned int result2 = op1 | op2;

请参阅here了解更多详细信息。
如果你不想要这个警告,你可以在 * 选项->文本编辑器-> C/C++ ->代码样式-> Linter* 中配置linter。
我不是说这些规则有意义。我只是在回答为什么你会看到这些曲线以及如何避免它。这些规则的有用性是另一个问题。

8wtpewkr

8wtpewkr2#

为什么在unsigned char上使用位操作符或逻辑操作符?
逻辑运算符是在布尔值上完成的,你想要一个true或false值。
按位运算符用于整数或字节。
因此,这两个例子都是错误的,你正确地得到了关于它们的警告,误导的是,在这两种情况下,数据类型才是真实的问题。
如果你对所有4个都使用uint8_t,你会看到位运算符的警告消失了,但逻辑运算符的警告没有。
对于编译器(和调试器)来说,'uint8_t'和'unsigned char'是相同的,但对于阅读器(和linter)来说,它们不是。如果你使用人们理解的类型,代码会更清楚地向读者传达它的含义。

int main()
{
   uint8_t  op1 = 0x0;
   uint8_t  op2 = 0x3;
   uint8_t  result1 = op1 | op2;
   bool result2 = op1 || op2;
}

相关问题