考虑以下简短程序:
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 = !a & 1;
是因为1是布尔值,所以&
和&&
在此表达式中将具有相同的效果。
如果常量不是1或0的任何值,它将触发警告。