海湾合作委员会C++警告:建议使用括号

GCC C++ warning: suggest parentheses

本文关键字:警告 委员会 C++      更新时间:2023-10-16

我写了一个表达式解析器,它吐出了一堆关于x86、x64和ARM的汇编指令。

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

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

我注意到使用 GCC 5.1.0

int a = 100 + 100 | 10;

GCC 在 |

int b = 100 * 100 | 10;

海湾合作委员会没有给出任何警告。

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

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

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

这是优先级问题,*优先级为 5,+优先级为 6,|为 12。

因此,当您收到来自一个而不是另一个的警告时,您发现了编译器不一致。或者编译器有一个规则,说如果(priorityDifference(X,Y) <7 显示括号警告,这毫无意义。

针对您的版本发布错误报告。

看完 celtschk 的评论后,我尝试了 C++ 和自由帕斯卡的一些表达

方式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

免费帕斯卡

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

因此,其他语言中的按位运算符似乎可能与C++中的优先级不同,如果在语言之间进行翻译,这会引起头痛。 也许GCC产生的警告消息可以更具描述性。