GCC C ++警告:建议括号

时间:2016-12-17 08:03:44

标签: c++ gcc operator-keyword operator-precedence

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

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

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

我注意到GCC 5.1.0

    int a = 100 + 100 | 10;

GCC在|

附近给出建议的括号警告

    int b = 100 * 100 | 10;

海湾合作委员会没有发出警告。

但加法和乘法的优先级都高于按位OR,所以为什么int b = expression没有警告?

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

3 个答案:

答案 0 :(得分:2)

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

因此,当您收到一个警告而不是另一个警告时,您发现编译器不一致。或者编译器有一条规则说if(priorityDifference(X,Y)< 7显示parentesis警告,这是没有意义的。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

在阅读了celtschk的评论后,我尝试了一些C ++中的表达式和free pascal

C ++

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

免费Pascal

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

免费Pascal

    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产生的警告信息可能更具描述性。