2016-12-17 67 views
0

我寫了一個表達式解析器,它爲x86,x64和ARM吐出了一堆彙編指令。GCC C++警告:建議括號

爲了測試它,我編寫了一個小應用程序,它生成隨機表達式,用GCC編譯它們並將結果與​​我的代碼進行比較,到目前爲止效果非常好。

現在我想讓我的解析器產生類似於GCC的警告。

我注意到,與GCC 5.1.0

int a = 100 + 100 | 10; 

GCC給出一個建議的括號警告|

int b = 100 * 100 | 10; 

GCC沒有給出警告。

但是加法和乘法比按位OR具有更高的優先級,所以爲什麼在int b = expression上沒有警告?

我非常疲勞大聲笑,所以可能忽略了一些東西。

+4

就我個人而言,我只是爲了明確發生了什麼而使用括號 –

+0

請參閱https://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Warning-Options.html#index-Wparentheses- 201 –

+0

就個人而言,我不會使用任何括號,並且我肯定會認爲它是編譯器建議添加冗餘語法的完全無關緊要。 – EJP

回答

1

最終的答案只能來自哪裏但我猜測原因是有其他語言對這些操作符有不同的偏好,因此這些其他語言的用戶可能會誤解表達式。例如在some Pascal dialects,&*|具有相同的優先級優先級爲+,因此一個涉及+|的表達式中間的括號可能有不同的解釋(標準Pascal沒有&|,但標準Pascal中andor的優先順序遵循相同的規則)。我想,就像許多語言複製C運算符的優先順序一樣,其他人複製Pascal的優先順序。

2

這是Precedence事,*優先級5,+是6和|爲12

所以,當你從一個得到一個警告而不是從其他的你已經找到了編譯器不一致。或編譯器有一個規定說,如果(priorityDifference(X,Y)< 7顯示parentesis警告,這是沒有意義的。

發佈針對您的版本的bug報告。

+1

我不認爲是一個錯誤。這包括在https://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Warning-Options.html#index-Wparentheses-201 -Wparentheses(包含在-Wall) –

+0

@CaptainGiraffe,是覆蓋它,但在這裏的具體區別爲什麼人們應該更多(或更少)被'*'弄糊塗而不是'+'? – Surt

+1

不,這不是一個錯誤!因爲優先權很重要。這混合了算術和位運算符! 對兩個整數或整型表達式的結果應用按位或並不罕見。用按位或運算的結果做數學真的很奇怪。 – geipel

0

讀通過celtschk的評論後,我試圖在C++中的幾個表情和免費帕斯卡

C++

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

的Free Pascal

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

的Free Pascal

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