2010-07-22 7 views
20

Possible Duplicates:
How to check for equals? (0 == i) or (i == 0)
Why does one often see “null != variable” instead of “variable != null” in C#?Perché alcuni programmatori esperti scrivono confronti con il valore prima della variabile?

Ho avuto uno sguardo a un tutorial qua e là, così come un certo codice DirectX e ho notato che molti programmatori esperti C++ scrivere espressioni nel seguente modo:

(<constant> == <variable>) 

piuttosto che ciò che la mia saggezza convenzionale sembra preferire:

(<variable> == <constant>) 

Eg if (NULL == ptr) anziché if (ptr == NULL). Preferisco la seconda alternativa, se non ci sono altri motivi per scegliere la prima, la mia ragione è che la variabile sembra essere la parte "ricevente" dell'espressione.

Ma sospetto che il primo sia utilizzato per evitare di assegnare inavvertitamente il valore della costante alla variabile utilizzando = anziché ==. Sarebbe corretto?

+3

sì, corrette su questo codice oggetto sacro guerra più spesso associati a C++ di codifica. –

+9

@ Mark: ora colpisci tutti quelli che usano l'ordine sbagliato! (Suggerimento: i veri programmatori non sbagliano mai = per == ...!) –

+0

L'unica cosa è che smetterei di pensarci come se la variabile "ricevesse" qualcosa in questo tipo di espressioni. – BobbyShaftoe

risposta

24

Sì, è corretto. È per rilevare l'errore di battitura di = anziché ==.

2

Evita che si scrive var = NULL. La scrittura NULL = var produrrà un errore. Quindi hai ragione :-)

7

sua perché non è possibile assegnare un valore a una costante, quindi se per errore si mette = invece di == il compilatore genera un errore, che vi avverte

28

Quello usato per essere il caso, sì. Naturalmente, oggigiorno quasi tutti i compilatori mettono in guardia sugli incarichi nelle condizioni if(), quindi il vantaggio è solo lì per le persone che sopprimono regolarmente gli avvisi.

+13

E la soppressione degli avvertimenti porterà a problemi molto più grandi di quelli accidentali. –

+3

Quando la maggior parte degli standard di codifica ora dice di fare errori di avvertimento, il codice verrà sempre compilato pulito. Questo è solo un vecchio stile (e su una nota personale trovo leggermente più difficile da leggere in quanto non è un modo naturale di pensare alle cose). –

+0

Mi chiedo se g ++ abbia avvertimenti del genere? Non sopprimo gli avvertimenti e non ne ho mai avuto uno per i compiti in condizionale. –

5

Quella è una giustificazione comune, come è l'argomento che non si vuole spingere la costante off verso l'estrema destra dello schermo con un'espressione prolisso. Quest'ultima argomentazione non mi è mai sembrata particolarmente convincente, e la prima non è realmente valida in questi giorni, dal momento che qualsiasi compilatore che si rispetti emetterà degli avvertimenti (si compila con gli avvertimenti-come-errori, no? :-) .

EDIT: Ho appena incontrato la nuova anteprima di Xcode 4, e basta guardare l'esempio hanno scelto di esemplificare la loro nuova funzione di "Fix-it"!

alt text http://devimages.apple.com/technologies/tools/images/new_autocorrect20100721.jpg

+3

Odio gli avvisi come errori! arrrg! – Gianni

+0

@Gianni: perché esattamente? – ereOn

+0

Rompe il mio codice, troppo spesso, per motivi stupidi/sciocchi. Certo, il codice che compila senza avvisi è desiderabile, ma non necessario. Dovrei essere più bravo a sapere come dovrebbe essere il codice e quali avvertenze posso convivere con il compilatore. Inoltre, a volte mi metto da parte per ricordarmi qualcosa che dovrebbe essere cambiato o rielaborato in futuro. – Gianni

4

per catturare la differenza tra l'assegnazione e il confronto.

Se vuoi dire:

if (ptr == foo) 

ma digitare

if (ptr = foo) 

se sarà ancora codice valido, dal momento che ptr = foo valuterà a un controllo booleano su ptr dopo che è stato impostato il valore di foo. Ovviamente, tu non vuoi questo.

Tuttavia, ritengo che fa male leggibilità notevolmente, e dato che la maggior parte degli IDE e preprocessore prenderà questo comunque, non usare questo stile.

-2

Come sviluppatore java tendo scrivere espressioni simili:

//primitive check 
    if(constant == variable) 

    //Object check 
    if(constant.equals(variable)) 

Ciò è particolarmente importante per l'oggetto perché l'espressione non fa errore se la variabile è nulla. Se l'espressione era nell'altro ordine, una variabile nulla avrebbe un errore. Mantengo la coerenza e faccio lo stesso ordine per i primitivi.

+0

Penso che stesse parlando di C++ se potessi fornire un esempio in quel contesto. –

+0

Wow, scendere votato per aggiungere alcune informazioni extra, ruvide, reali. – Jay

+2

Non stai sottovalutando l'aggiunta di informazioni extra, non sei votato per aggiungere informazioni irrilevanti. Questa domanda non riguarda Java. – GManNickG

7

Questo è stato soprannominato "Condizionale Yoda"!

Vedi qui https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined

Mi piace molto questo termine perché:

if(Light::On == light) 

si legge come:

"If on is the light"

Come detto già, questo è usato per prevenire l'assegnazione errata. Si potrebbe sostenere che questa pratica è arcaica basata su IDE moderni, ma ritengo comunque che sia una buona pratica.

+0

Okay !!!!! Grazie!!!!!! –

1

L'assegnazione di cattura è una delle ragioni principali per cui vengono utilizzate le condizioni Yoda, ma ce ne sono altre: in C++ l'operatore viene richiamato sull'operando LHS. Poiché le costanti sono in genere const (duh) o primitive, ciò limita la possibilità di operazioni non sensoriali. Un esempio è = su un valore letterale primitivo, come il motivo comune indicato (1 = a), ma questo include operator=() const o qualsiasi altro operatore viene utilizzato per i tipi non POD.

1

Con un linguaggio come VB 6.0 che non non ha assegnazione distinte e operatori di confronto,

a = 2

'compilerà, se si intende un viene assegnato 2 o se si sta confrontando un con 2 Se intendevi confrontare, c'è una probabilità che si verifichi un errore di runtime.

'per l'assegnazione se si scrive sempre

a = 2

' E per l'assegnazione se si scrive sempre

2 = a

'Si elimina la fase di compilazione successo e runtime - Scenario di riferimento.

Ma, questo è solo la punta: il suggerimento visivo è disponibile quando si dispone di un'espressione come

a = b 'di confronto o di assegnazione?

C# presenta: - assegnazione diversa (=) & confronto (==) simboli - comparazioni devono essere avvolti in parentesi.

Allora questo diventa un non-problema.

0

perché sanno quello che stanno facendo: P

0

Hai ragione - è di innescare un errore di compilazione, se si digitano "==" come "=", dal momento che un incarico restituirà sempre vero. Anche se questo di solito è facile notare e mettere a punto, di tanto in tanto si trasformerà in un molto difficile da individuare bug, pensare a questo:

#define OK 2 // Or something... 
[...] 
while(status = OK){ 
    // This loop will never end 
    // Even if you change the value of status within it 
    [...] 
} 

Che può essere un brutto bug da trovare, soprattutto se il blocco appartenenza alla dichiarazione incriminata è lunga (immagina di cercare tutti i possibili motivi per cui lo stato è sempre valido).

Se d'altra parte si è utilizzato:

while(OK = status){ 

che getterebbe un errore di compilazione, poiché non è possibile assegnare un valore a una costante.

questa pratica è talvolta indicato come condizioni Yoda, poiché giustappone oggetto e soggetto. Come "se lo stato è OK" vs "se OK è lo stato" e "il cielo è blu" vs "blu è il cielo" - quest'ultimo è qualcosa che Yoda potrebbe dire.

Problemi correlati