GCC C++ 警告:建议使用括号

GCC C++ warning: suggest parentheses

我编写了一个表达式解析器,它为 x86、x64 和 ARM 生成一堆汇编指令。

为了测试它,我编写了一个生成随机表达式的小应用程序,用 GCC 编译它们并将结果与​​我的代码进行比较,到目前为止一切顺利。

现在我想让我的解析器产生类似于 GCC 的警告。

我注意到 GCC 5.1.0

    int a = 100 + 100 | 10;

GCC 在 |

周围给出建议的括号警告

但是

    int b = 100 * 100 | 10;

GCC 不给出警告。

但是加法和乘法的优先级都高于按位或,所以为什么在 int b = 表达式上没有警告?

我很累哈哈所以可能忽略了一些东西。

这是Precedence的事情,*优先级5,+优先级6,|优先级12。

因此,当您收到一个警告而不是另一个警告时,您发现编译器不一致。或者编译器有一条规则说 if (priorityDifference(X,Y) < 7 display parentesis warning, which makes no sense.

Post 针对您的版本的错误报告。

最终的答案只能来自实现者,但我想原因是有其他语言对这些运算符有不同的偏好,因此这些其他语言的用户可能会误解表达。例如在 some Pascal dialects, 中,&* 具有相同的优先级,而 |+ 具有相同的优先级,因此包含两个 + 的表达式和 | 之间没有括号可能有不同的解释(标准 Pascal 没有 &|,但 andor 在标准 Pascal 中的优先级遵循相同的规则)。我想就像许多语言复制 C 运算符优先级一样,其他语言复制 Pascal 运算符优先级。

看完celtschk的评论后,我尝试了一些C++和free pascal的表达式

C++

    a = 100 + 100 & 100; // = 64
    a = (100 + 100) & 100; // = 64

免费帕斯卡

    a := 100 + 100 and 100; // = 200
    a := (100 + 100) and 100; // = 64

免费帕斯卡

    a := (100 + 100) and 222; // = 200
    a := 100 + 100 and 222; // = 168

// C++

    a = 100 * 100 & 222; // = 16

// 免费 Pascal

    a := 100 * 100 and 222; // = 16

所以看起来其他语言中的位运算符可能没有与 C++ 中相同的优先级,如果在语言之间进行转换,这会导致头痛。也许 GCC 产生的警告消息可以更具描述性。