2013-06-05 19 views
25

Anladığım kadarıyla bu yüzden herhangi bir neden yoktur, parantez hiçbir fark olduğu (dışındaki kod netlik “aşın”) Clang varsayılan olarak bu uyarıyor? Kodun eklenmesi için kod eklemeyi sevmediğim için parantez eklememeyi tercih ediyorum.Clang neden '||' `içinde uyarıyor: '' && '?

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

Nasıl * Açıklık * uğruna kod eklemeye ne dersiniz? Buradaki parantezler, '&&' ve '||' nin (genellikle bu kadar sık ​​olmayanlar) önceliği ile ilgili kuralları hatırlamayan insanlara yardımcı olur. – cHao

+3

Netliği artırmak için kod eklemek için hepim. Ancak kişisel olarak, gereksiz parantezlerin ek görsel gürültüsünün bu durumda netliği azalttığını buluyorum. Fazladan parantez gördüğünüzde hemen ben hiçbiri bulduğunda, söz konusu kod sadece için “yardım” Bana çalışıyorsa ben yanlış veya okursanız Sonra bir süre düşünmek zorunda onlar için bir neden arıyor bütün çizgi tarama zaten bildiğim operatör önceliğini anlamak. Bu kod * kesinlikle * deneyimsiz kodlayıcılar için değil, onu okuyan insanların çoğu benim seviyemde olacak ve bu yüzden aynı şeyleri kabul edeceğim. netlik ile ilgili nokta geçerli bir biri olmasına karşın – mxcl

+2

, bu dilin kurallarına göre bir derece yasal kodu için uyarmak garip görünüyor. –

cevap

25

Doğal eğilim soldan sağa okumaktır ve operatörün önceliğini unutmak kolaydır. Dedi ki, bu sadece bir uyarıdır, ve ne yaptığınızı ve kendi stilinize izin verdiğini biliyorsanız, onu bastırmaktan çekinmeyin. Okuyucu C's operator precedence rules çok iyi olmadıkça, sadece biraz belirsiz çünkü

+13

Bunu bastırmak isteyenler için, derleme sisteminizin CFLAGS'sine: -We-mantıksal-op-parantezleri ekleyin. – mxcl

20

ben tahmin ediyorum.

Kişisel ifadesi şu şekildedir:

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

ve &&|| daha yüksek precendence sahip olduğundan, bu

sanırım
if ((A && B) || (C && D)) 

ne demek olduğunu anlamına gelir, ama okurken çok net değil .

+27

IMHO, temel mantığı en azından biraz inceleyen herkesin, matematikte VEYA'dan daha yüksek önceliğe sahip olduğunu hatırlamalıdır. Derleyicinin burada oldukça paranoyak olduğunu düşünüyorum. (I. e., Bu kesinlikle, '(a = 0)' ise aynı durum değildir.) –

+12

Tamamen aynı fikirdeyim - bu şimdiye kadar gördüğüm en yararsız uyarıdır. Neden 1 + 2 * 3 yazmasına izin veriyor ve bunu 1+ (2 * 3) olarak değiştirmeyi önermiyor? –

+6

Muhtemelen gerçek dünyada çoğu kodlayıcı tam olarak ne 1 + 2 * 3'ün tam olarak ne kadar emin olduğundan, çoğu ne olduğundan emin değiller. c && d' tam olarak yapacak. – Drax