gcc-括号警告b = 1; !a和b,但不是!a和1

问题描述 投票:2回答:1

考虑以下简短程序:

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

    return c;
}

有人知道为什么gcc对c = !a & b;发出警告但对c = !a & 1;不给出警告吗?

$gcc -Wall test.c
test.c: In function 'main':
test.c:3:9: warning: suggest parentheses around operand of '!' or change '&' to '&&' or '!' to '~' [-Wparentheses]
     c = !a & b;

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

我经常对gcc多么“智能”感到惊讶。这个问题看起来很容易解决。那么,为什么还要对第一个警告呢?

c gcc
1个回答
5
投票

当您在同一表达式中同时具有逻辑运算符和按位运算符时,此警告会起作用,因为您通常希望选择一个或另一个,但不希望同时使用两者。

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

c = !a & 1;

是因为1是布尔值,所以&&&在此表达式中将具有相同的效果。

如果常量不是1或0的任何值,它将触发警告。

© www.soinside.com 2019 - 2024. All rights reserved.