GCC不会通过位屏蔽来警告0或1

时间:2017-11-01 06:49:44

标签: c gcc warnings bitmask

以下程序在GCC上正常运行,没有任何警告。

0

在此计划中如果我写12。 GCC没有发出任何警告。

但是,如果我写其他数字,如 return (!mask & 2) ? 1 : 0; // GCC gives warning

 warning: suggest parentheses around operand of ‘!’ or change ‘&’ to ‘&&’ or ‘!’ to ‘~’ [-Wparentheses]
     return (!mask & 2) ? 1 : 0;

然后GCC发出以下警告。

2

海湾合作委员会警告其他数字如0,这很好,但为什么不警告1git push <remote> :refs/tags/<mytag> # or git push origin :tags/<mytag>

2 个答案:

答案 0 :(得分:3)

 (!mask & 2)

这里你将按位运算符与布尔值运算符混合在一起。这对于01并不重要,因为只处理第一位(布尔运算符将表达式转换为0或1),但是2结果是不同的,如果你把括号与否,因此警告。

(这里的另一个例子证明gcc努力不会不必要地发出警告)

答案 1 :(得分:2)

因为您的代码是有效的C代码。警告只是建议

BTW !mask(逻辑非操作)是布尔值,因此只能是0或1.如果您想要按位运算,请使用~mask。查看C中的list of operators

具有0和1的Jean-François Fabre explains是合法且普通的(它们是常见的位掩码)。

GCC正在发布(使用gcc -Wall -Wextra)一些警告(使用启发式),但它必须在奇怪但有效的代码和不可能的代码的情况下进行平衡。它试图避免发出无用的警告。

如果您愿意,可以扩展GCC以提供其他警告。只需花费数月时间编写自己的GCC plugin代码即可提供这些警告。