我编写了一个表达式解析器,它为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所以可能忽略了一些东西。
答案 0 :(得分:2)
这是Precedence的问题,*
优先级为5,+
为6,|
为12。
因此,当您收到一个警告而不是另一个警告时,您发现编译器不一致。或者编译器有一条规则说if(priorityDifference(X,Y)< 7显示parentesis警告,这是没有意义的。
针对您的版本发布错误报告。
答案 1 :(得分:2)
最终的答案只能来自实施者,但我想原因是有其他语言对这些运营商有不同的偏好,因此其他语言的用户可能会误解表达。例如,some Pascal dialects, &
具有与*
相同的优先级,而|
具有与+
相同的优先级,因此表达式同时涉及+
而且|
之间没有括号可能有不同的解释(标准Pascal没有&
或|
,但and
和or
在标准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产生的警告信息可能更具描述性。