逻辑运算符与按位运算符。两者都错了?

woe*_*n42 30 c++ bitwise-operators logical-operators visual-studio

当我在 Visual\xc2\xa0Studio\xc2\xa02019 的 C++ 控制台应用程序中使用以下最少代码时,我收到两个完全相反的警告。

\n
int main()\n{\n    unsigned char op1 = 0x1;\n    unsigned char op2 = 0x3;\n    unsigned char result1 = op1 | op2;\n    unsigned char result2 = op1 || op2;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

警告unsigned char result1 = op1 | op2;

\n
\n

lnt-逻辑按位不匹配 当可能需要逻辑“||”时使用按位“|”。

\n
\n

警告unsigned char result2 = op1 || op2;

\n
\n

lnt-逻辑按位不匹配 当可能需要按位“||”时使用逻辑“||”。

\n
\n

这有点好奇。

\n

我的目的是使用按位运算符。我如何更改该行unsigned char result1 = op1 | op2;,以便 Visual\xc2\xa0Studio\xc2\xa02019 警告消失?

\n

该警告不是来自编译器;而是来自编译器。输出没有错误。\n可能它来自ReSharper C++ 模块或 Visual\xc2\xa0Studio 代码分析。

\n

(当然我可以忽略这个警告,但是在原始代码中有很多警告,因为有很多 unsigned char 按位运算。)

\n

jab*_*baa 37

lnt-logical-bitwise-mismatch是 Visual Studio linter 规则。它告诉您逻辑运算符只能与布尔值一起使用:

bool op1 = true;
bool op2 = false;
bool result2 = op1 || op2;
Run Code Online (Sandbox Code Playgroud)

位运算符只能与整数一起使用,不能与字符一起使用:

unsigned int op1 = 0x1;
unsigned int op2 = 0x3;
unsigned int result2 = op1 | op2;
Run Code Online (Sandbox Code Playgroud)

请参阅此处了解更多详细信息。

如果您不希望出现此警告,可以在Options -> Text Editor -> C/C++ -> Code Style -> Linter中配置 linter

我并不是说这些规则有意义。我只是回答为什么会出现波形曲线以及如何避免它。这些规则的有用性是另一个问题。

  • 如果使用 `uint8_t` 而不是 `unsigned char` 有帮助吗?由于它是一个 linter 规则,因此它可能关心同一基元类型使用哪个名称。`uint8_t` 的语义是它是一个整型,尽管据我所知,在实践中它总是 `unsigned char`(如果存在的话),因此具有其经常不受欢迎的 may_alias 行为,并且是像 ` std::cout << my_u8;` (13认同)
  • @HolyBlackCat 这句话以_“它告诉你......”开头_在_“`lnt-逻辑位不匹配`是一个Visual Studio linter规则。”_这不是我的意见。这是事实。我不是来讨论这些规则是否有意义。我想描述一下波浪线何时出现以及如何禁用它们。 (4认同)
  • @0___________ 来自发布的链接:_“仅对布尔值使用逻辑运算符。”_ 如果您不需要,请禁用 linter 警告。这只是一个 linter 规则和一个建议。 (2认同)