2013-06-05 40 views
25

我的理解是括號沒有任何區別,那麼是否有任何理由(除了「提高」代碼清晰度)Clang警告這是默認值?我不想添加括號,因爲我不喜歡爲代碼添加代碼。爲什麼Clang警告:''&''在'||'內?

src/websocket.c:420:43: warning: '&&' within '||' [-Wlogical-op-parentheses] 
     if (rv == 0 && N != 0 || rv == -1 && errno == ECONNRESET) { 
           ~~ ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~ 
src/websocket.c:420:43: note: place parentheses around the '&&' expression to 
     silence this warning 
     if (rv == 0 && N != 0 || rv == -1 && errno == ECONNRESET) { 
           ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~ 
+24

如何爲*清晰度*添加代碼?這裏的括號可以幫助那些不記得關於'&&'和'||'優先級的規則的人(這些規則並不常見)。 – cHao

+3

我全部都是爲了增加清晰度而添加代碼的。然而就我個人而言,在這種情況下,我發現不必要的括號的額外視覺噪音降低了清晰度。當我看到額外的括號時,我立即掃描整行尋找它們的原因,當我找不到時,我不得不思考一段時間,如果我讀錯了,或者如果代碼只是試圖「幫助」我瞭解運營商的優先級,我已經知道了。這段代碼*絕對不適合沒有經驗的編程人員,大部分人閱讀它都會達到我的水平,因此我認爲它們會有相同的感覺。 – mxcl

+2

雖然關於清晰度的觀點是有效的,但按照語言規則警告完美法定代碼似乎很奇怪。 –

回答

25

自然的傾向是從左向右讀,它很容易忘記運算符優先級。這就是說,這只是一個警告,如果你知道你在做什麼,並且你自己的風格允許,你可以隨意壓制它。

+13

對於那些想要抑制它的人,在編譯系統的CFLAGS中附加:'-Wno-logical-op-parentheses'。 – mxcl

20

我在猜測,因爲它有點不清楚,除非讀者非常擅長C's operator precedence rules

你的表情是這樣的:

if (A && B || C && D) 

,自&&||優先級數字,它意味着

if ((A && B) || (C && D)) 

我的猜測是你的意思,但閱讀時,它不是很清楚。

+27

恕我直言,任何人研究基本邏輯至少應該記住,在數學中,並具有比OR更高的優先級。我認爲編譯器在這裏非常偏執。 (即,這與if(a = 0)'絕對不是一回事。) – 2013-09-28 09:19:54

+12

完全同意 - 這是我見過的最沒用的警告。爲什麼它允許寫入1 + 2 * 3並且不建議將其更改爲1+(2 * 3)? –

+6

可能是因爲在現實世界中,大多數編碼者都很確定'1 + 2 * 3'究竟做了什麼,而大多數編碼者不確定'a && b ||' c && d'將會完成。 – Drax