2009-10-26 17 views
11

Czy istnieje różnica w kolejności operatora porównania?Jaka jest różnica między jeśli (CONST == zmienna) lub jeśli (zmienna == CONST)?

#define CONST_VALUE 5 

int variable; 

... 

if (variable == CONST_VALUE) // Method 1 
... 

OR 

if (CONST_VALUE == variable) // Method 2 
... 

Czy jest to po prostu kwestia preferencji, czy też istnieje nieodparty powód określonego porównania?

+0

patrz http://stackoverflow.com/questions/283205/what-was-to-most-dangerous-programming-mistake-you-have-made-in-c/283212#283212 –

+0

Istotne: [https://en.wikipedia.org/wiki/Yoda_conditions](https://en.wikipedia.org/wiki/Yoda_conditions) – Boann

Odpowiedz

31

Powodem, dla którego niektórzy używają metody 2, jest błąd kompilatora, jeśli użytkownik błędnie wypisze a = zamiast znaku ==.

Jednak będziesz miał ludzi (takich jak ja), którzy nadal będą używać metody 1, ponieważ uznają ją za bardziej czytelną, a jeśli wystąpi błąd, zostanie ona wykryta podczas testowania (lub, w niektórych przypadkach, analizy statycznej kod).

+11

Powiedz mi, czy kiedykolwiek zdarzyło Ci się kiedykolwiek popełnić ten błąd w dowolnym miejscu, w którym zapisanie go w ten sposób złapało go? Piszę to "metoda 1", ponieważ jest bardziej czytelna i jestem prawie pewna, że ​​nigdy * nie * napisałem = zamiast == w ciągu 25 lat pisania języków w językach C i C. –

+5

Zdarzyło mi się to w przeszłości. Uważaj się za szczęściarza. –

+3

@Paul Tomblin: Co najmniej trzy razy z biegiem lat naprawiłem długotrwałe błędy związane z posiadaniem zadania w instrukcji if (lub while), w której dokonano porównania. To powiedziawszy, powinienem również zwrócić uwagę, że niektóre kompilatory (w szczególności gcc) mogą/będą ostrzegać, jeśli zawierają * tylko * zadanie (bez porównania), chyba że zawarte są w dodatkowym zestawie nawiasów. Stawianie najpierw cosantowi gwarantuje pracę ze wszystkimi kompilatorami. –

10

Jedyna różnica polega na tym, że (CONST_VALUE == zmienna) uniemożliwia kompilację wspólnej literówki (CONST_VALUE = variable).

Porównując, jeśli (zmienna = CONST_VALUE) spowoduje, że kompilator pomyśli o przypisaniu CONST_VALUE do "zmiennej".

Zamieszanie =/== jest dość powszechnym źródłem błędów w C, dlatego ludzie starają się obejść ten problem z konwencjami kodowania.

Oczywiście to nie uratuje, jeśli porównujesz dwie zmienne.

I pytanie wydaje się być kopią How to check for equals? (0 == i) or (i == 0)

A oto kilka informacji: http://cwe.mitre.org/data/definitions/481.html

3

Jak inni wspomniano, CONST_VALUE == zmienna unika się = typo.

I jeszcze zrobić "zmienna == CONST_VALUE", ponieważ myślę, że jest to bardziej czytelne i kiedy widzę coś takiego:

if(false == somevariable) 

mój bloodpressure idzie w górę.

+3

Używam 'if (CONST_VALUE == variable) ', ale jeśli widzę' if (false == somevariable) ', moje ciśnienie krwi również cierpi. (To dlatego, że powinno to być 'if (! Anyvariable)' oczywiście.) – sbi

+1

+1 dla ciśnienia krwi – GManNickG

2

Pierwszy wariant

if (variable == CONST_VALUE) 

jest lepszy, ponieważ jest bardziej czytelny. Jest to zgodne z konwencją (używaną również w matematyce), że najważniejsza jest wartość, która zmienia się najbardziej.

Drugi wariant

if (CONST_VALUE == variable) 

jest używany przez niektórych ludzi, aby zapobiec bład równości sprawdzanie z cesją

if (CONST_VALUE = variable) 

Są lepsze sposoby, aby to osiągnąć, na przykład włączanie i pilnowanie ostrzeżeń kompilatora.

1

Inni już wskazali przyczynę. =/== dezorientacja. Wolę pierwszą wersję, ponieważ dokładniej podąża za procesem myślenia.Niektóre kompilator złagodzić zamieszanie = i == dając ostrzeżenie, gdy napotka coś podobnego

if(a=b) 

w tym przypadku, jeśli naprawdę chciał zrobić przyznawanie jesteś zmuszony napisać

if((a=b)) 

Które chciałbym zapisać jako

if((a=b) != 0) 

, aby uniknąć nieporozumień.

To powiedziawszy, mieliśmy w naszym przypadku kodu 1, w którym mieliśmy zamieszanie =/== i pisanie go w drugą stronę nie pomogłoby, ponieważ było to porównanie między warami.

+0

W GCC tą opcją jest -Wparentheses – Adisak

Powiązane problemy