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 没有 &
或 |
,但 and
和 or
在标准 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 产生的警告消息可以更具描述性。
我编写了一个表达式解析器,它为 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 没有 &
或 |
,但 and
和 or
在标准 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 产生的警告消息可以更具描述性。