3

在編寫代碼時,很長一段時間我知道& &比||有更高的優先級;然而,使用C++ 11標準編譯它給了我一個警告,我現在應該在單個語句中使用它們時使用括號。C++ 11何時發出有關運算符優先級的警告?

現在我得到了一個警告,指出>>和+也應該有括號。現在我的言論看起來非常難看,五個或更多的括號在他們周圍浮動。

1)是否有資源說明哪些操作符組合現在需要括號?

2)有沒有辦法讓操作員的優先警告靜音,但要保留其他警告?

編譯gcc與標誌-O2 -Wall -g

的警告來的時候,我加入了標誌-std=c++11

樣品表達:

(((string[0] << CHAR_BIT) + string[1] << CHAR_BIT) + string[2] << CHAR_BIT) + string[3]; 
+4

該標準沒有說明必須發佈任何警告(儘管它可能會建議這樣做)。它們由編譯器發出,作爲對你的幫助,因此禁用它們是編譯器特定的 – tambre

+0

哪個編譯器?您應該將其添加到標籤。 – HolyBlackCat

+0

發佈有問題的表達式。一個警告很少發生,沒有原因。 – DeiDei

回答

1

gcc manual

-Wparentheses

警告,如果括號在某些情況下,比如當有在上下文中的任務分配時,真值的預期,省略 或者運算符嵌套的優先級的人經常 混淆。

還警告如果比較出現x < = y < = z;這相當於(x < = y?1:0)< = z,這是與普通數學符號的 不同的解釋。

還對GNU擴展的危險用途發出警告?:省略了中間操作數。當?:運算符中的條件爲 布爾表達式時,省略的值始終爲1.程序員 預期它是在條件表達式 內計算的值。

(我加的重點)

要關閉該行爲,指定-Wno-parenthesesgcc/g++

+0

謝謝 - 這覆蓋了「-std = C++ 11」選項,這正是我的目標。 – Alex

+1

@Alex:不,它不會覆蓋'-std = C++ 11'。它只會導致編譯器發出一些額外的警告,這是標準允許的。 (這個標準需要對某些事情進行診斷,但是對於編譯器要警告的任何東西都允許有額外的警告,我知道C就是這樣定義的;我非常肯定C++也是如此。) –

3

C++ 11何時發出關於運算符優先級的警告?

標準需要診斷消息(注意標準不區分停止編譯的警告和錯誤)的唯一情況是程序違反標準時。除非編譯器的表述優於「無需診斷」。

所有其他警告對於編譯器是可選的,而不是標準要求的。


1)有沒有說哪家運營商的組合,現在需要括號中的資源?

不,因爲括號不是必需的。警告只是編譯器的建議。該計劃格式良好。

的警告來的時候,我加入了標誌-std = C++ 11

對於它的價值,我的海灣合作委員會警告說,無論是標準的說法。


2)有沒有辦法沉默只是運算符優先級的警告,但保留其他的警告?

本身告訴它警告選項啓用它的警告(這裏是從我的GCC的警告):

警告:建議圍繞 '+' 括號內的 '< <' [-Wparentheses]

要禁用,您可以使用相應的選項來禁用它:-Wno-WHATEVER


現在我的報表看起來真的很醜陋,有5個或更多括號浮他們周圍。

我建議代替提取重複結構,和重複使用標準算法:

std::accumulate(string, string + 4, 0, [](auto sum, auto value) { 
    return (sum << CHAR_BIT) + value; 
}); 

少得多的括號:)注意,在C++ 11(之前C++ 14),則可以不使用auto作爲lambda參數的類型。我不知道你使用的是什麼類型。

+0

我得到'operator「<<」has優先級低於「+​​」; 「+」將首先評估爲 [-Wshift-op-括號];我不認爲這個人可以像'[-Wparentheses]'是警告的一部分一樣容易地知道如何禁用。 – Alex

+0

@Alex確實無法使用Wno-shift-op-括號嗎? – user2079303

+0

哇,它的確如此。從來不知道,謝謝!太糟糕了,我已經接受了dlasalle的回答... – Alex