gcc -W括号警告 b=1; !a & b 但不是 !a & 1

hko*_*hko 2 c gcc

考虑以下短程序:

int main() {
    int a = 5, b = 1, c;
    c = !a & b;
    c = !a & 1;

    return c;
}
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么 gcc 给出警告 b = 1; c = !a & b;但不是 for c = !a & 1;

int main() {
    int a = 5, b = 1, c;
    c = !a & b;
    c = !a & 1;

    return c;
}
Run Code Online (Sandbox Code Playgroud)

我的 gcc 版本是 8.3.1(我尝试了另一个版本,但发生了同样的事情)。

我经常对 gcc 的“智能”程度感到惊讶。这个问题看起来很容易解决。那么为什么仍然对第一个发出警告?

dbu*_*ush 5

当您在同一表达式中使用逻辑运算符和按位运算符时,此警告就会起作用,因为您通常需要一个或另一个,但不是两者都需要。

在这种情况下您看不到警告的原因:

c = !a & 1;
Run Code Online (Sandbox Code Playgroud)

是因为1是一个布尔值等等都&&&将在此表达了同样的效果。

如果常量是 1 或 0 以外的任何值,则会触发警告。

  • @hko 显然没有仔细观察流程,而只是观察一行。对于“int”类型的变量,它不会尝试找出值,但它知道您是否给它一个常量。 (2认同)