operatore relazionale espressione ordine
-
01-07-2019 - |
Domanda
Questa è probabilmente una domanda stupida, ma la curiosità ha avuto la meglio su di me.Ho visto il codice che ultimamente sembra di "invertire" l'ordine delle espressioni per operatori relazionali, ad esempio:
if (0 == someVariable)
In contrapposizione a ciò che vedo di solito/scrittura:
if (someVariable == 0)
Per me, il secondo metodo sembra più leggibile e intuitivo, quindi mi chiedo se c'è qualche motivo sto vedendo il primo metodo?Logicamente, entrambe le affermazioni restituiscono lo stesso risultato, quindi è solo una questione di preferenze personali come sono scritti?
Soluzione
Capisco che questa è una preferenza personale.Anche se mettendo la variabile secondo si può garantire che non accidentalmente assegnare la costante per la variabile che concearn c sviluppatori.Questo è probabilmente il motivo per vederlo in c# come gli sviluppatori di cambiare lingua.
Altri suggerimenti
L'ordine non importa, tuttavia, il primo implica che s zero controlli.La convenzione stabilisce l'uso di hte ultimo.
Il motivo principale in C e C++ è che è facile per tipo
if (someVariable = 0) {
...
}
che è sempre un fallimento, e anche imposta someVariable
a 0.
Io personalmente preferisco la variabile-primo stile, perché si legge di più, naturalmente, e solo spero di non dimenticare di utilizzare ==
non =
.
Molti di C e compilatori C++ emetterà un avviso se si assegna una costante all'interno di un if
.Java e C#, per evitare questo problema, che vieta di non-espressioni booleane if
clausole.Python consente di evitare questo problema, rendendo le assegnazioni di un'affermazione, non una espressione.
Il primo metodo esiste un modo per ricordare a te stesso di non fare le assegnazioni in un'istruzione IF, che potrebbe avere disastroso conseguenze in alcuni linguaggi (C/C++).In C# sarà solo ottenere morso da questo se stai impostando i valori booleani.
Potenzialmente fatale codice C:
if (succeeded = TRUE)
{
// I could be in trouble here if 'succeeded' was FALSE
}
In C/C++, qualsiasi variabile è soggetto a questo problema di VAR = COSTANTE quando hai inteso VAR == COSTANTE.Così, è spesso l'abitudine di riordinare l'istruzione IF per ricevere un errore di compilazione se si flub questo:
if (TRUE = succeeded)
{
// This will fail to compile, and I'll fix my mistake
}
Solo In C# booleane sono sensibili a questo, come solo le espressioni booleane sono validi in un'istruzione if.
if (myInteger = 9)
{
// this will fail to compile
}
Così, in C# del mondo non è necessario adottare la COSTANTE == VAR stile, a meno che non sei a tuo agio nel farlo.
In aggiunta a parità mi capita spesso di imbattermi codice come
if (0 > number)
o
if (NULL != pointer)
dove non c'è nemmeno il pericolo di commettere un errore in C/C++!E ' una di quelle situazioni dove le migliori intenzioni per insegnare la tecnica si è trasformata in una pianura cattiva abitudine.
Quest'ultimo è un formato di sinistra-over da C-sintassi, dove, se inavvertitamente lasciato fuori uno di uguale segni, ha un compito, invece di un confronto.
Tuttavia, è possibile, naturalmente, non è possibile assegnare a una letterali numerici, quindi, se hai scritto come secondo esempio, si otterrebbe un errore del compilatore, e non un bug.
In C#, tuttavia, non si può inavvertitamente fare questo, in modo che davvero non importa.