海湾合作委员会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;
海湾合作委员会没有给出任何警告。
但是加法和乘法的优先级都高于按位 OR,那么为什么 int b = 表达式上没有警告呢?
我很累,哈哈,所以可能忽略了一些东西。
最终的答案只能来自实现者,但我想原因是还有其他语言对这些运算符有不同的偏好,因此这些其他语言的用户可能会误解表达式。例如,在一些帕斯卡方言中,&
与*
具有相同的优先级,|
与+
具有相同的优先级,因此涉及+
和|
的表达式之间没有括号可能有不同的解释(标准帕斯卡没有&
或|
,但标准帕斯卡中and
和or
的优先级遵循相同的规则)。我想就像许多语言复制 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产生的警告消息可以更具描述性。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 海湾合作委员会在升压源中的警告
- 平息海湾合作委员会的"only available with -std=c++XX or -std=gnu++XX"警告
- 海湾合作委员会警告"没有声明任何东西
- 抑制QT标头的海湾合作委员会警告
- 海湾合作委员会C++警告:建议使用括号
- 海湾合作委员会 - 功能不起作用(但其他警告正在起作用)
- 海湾合作委员会警告"set but not used "
- 海湾合作委员会警告"dereferencing type-punned pointer will break strict-aliasing rules"
- 什么是海湾合作委员会的Wmaybe单位化警告
- 海湾合作委员会不遵守'pragma GCC diagnostic'来压制警告