2009-04-14 27 views
4

letzter Zeit habe ich einige Code gelesen, dienegiert gleich vs. nicht gleich

if (! (a == b)) 

statt

if (a != b) 

an einigen Stellen hat.

Offensichtlich sind diese logisch äquivalent, aber ich frage mich, ob es einen bestimmten Grund gibt, einen über den anderen zu verwenden.

Gibt es bestimmte Umstände, in denen einer vorzuziehen ist, oder ist es nur eine Frage des persönlichen Stils?

+0

Das erste, woran ich denke, wenn ich das sehe, ist entweder etwas wurde aus dem Ausdruck gelöscht, oder der Programmierer, der das geschrieben hat, kam aus einer anderen Sprache und ist neu in diesem. –

+0

@John MacIntyre - Ich habe den Eindruck, dass es der erste Fall war. Das heißt, er hat zuerst nach Gleichheit gesucht und dann entschieden, seinen if-Block mit seinem else-Block zu wechseln. –

Antwort

12

Ich ziehe wirklich

if (a != b) 

einfach, weil Sie zu weniger lesen sollen und Sie verstehen, schneller die Nachricht der Programmierer übertragen wollte.

Denken Sie daran, Programmierer verbringen mehr Zeit Code-Lese als es zu schreiben, so dass die mehr Sie tun können, um Code verständlicher zu machen, desto besser.

6

würde ich

if (! (a == b)) 

vermeiden, da es zwei Operationen beinhaltet, wo ein Betreiber dort

if (a != b) 

, die genau die gleiche Sache tut, ist. Die zweite ist auch lesbarer (wenn auch nur geringfügig).

Das wirklich große Problem, das ich mit

if (! (a == b)) 

haben ist, dass es mich zu stoppen und denken: „Was zum Teufel?“ Guter Code sollte das nicht tun.

9

Meistens ist dies eine Frage des Stils (und meine Vorliebe ist für 'a! = B'), aber es könnte einen tatsächlichen Unterschied in der Operation geben, wenn ein Objekt einer Klasse ist, die keinen Operator hat == oder ein Operator! =.

+0

Sie haben Recht. Je nach Sprache kann es einen Unterschied geben, wie die beiden auswerten (oder ob sie sogar kompilieren). –

+0

Ich denke, das ist eine bessere Antwort als die angenommene ... –

1

Dein Code sollte so einfach wie möglich sein, dh weniger Anweisungen ist besser also das a! = B ist 3 Konstrukte im Gegensatz zu! (a = b) was 4 ist.

+0

Auch konnte ein! = B nie in eine Zuordnung Anweisung vertippt werden: -} –

4

Wie erwähnt, erzwingen Sprachen mit Operatorüberladung häufig kein! = für jedes ==. In diesem Fall ist! (A == b) essentiell, da a! = B undefiniert ist. Weiterhin kann es Sinn machen im Kontext zu verwenden! (A == b). Während die kürzere Form aus den Gründen, die anderswo in dieser Frage angegeben sind, bevorzugt ist, kann die längere Form in bestimmten Problemmengen beschreibender sein.

+0

Alle spezifischen Beispiele wo! (A == b) ist klarer als (a ! = b)? Ich kann mir nichts Besonderes vorstellen. –

-5

Dies ist das DeMorgan-Theorem. (Augustus De Morgan - Mathematikerin)!

Go for if (! A = b)

+0

Sie haben die Frage nicht beantwortet, also die Down-Abstimmung. Mathematik war nie das Problem. –

+0

Ive antwortete: "In der Informatik wählen Sie einfach die besser lesbar oder leistungsfähiger." Ich denke, diese Antwort ist nicht gerade genug. Es tut uns leid – MRFerocius

1

Jeden halbwegs anständige Compiler den gleichen Code löschen (es sei denn, == und = überlastet wurde, wie an anderer Stelle erwähnt) Optimierungsfragen sind also irrelevant.

Ich glaube nicht, dass ich jemals "if (! (A == b))" außerhalb einer größeren Bedingung gesehen habe, wo es klarer ist, DeMorgans Theorem nicht zu verwenden, aber ich könnte es als a sehen Art und Weise zu betonen, dass die beiden Werte wirklich identisch sein sollten und es etwas tief falsches gibt, wenn sie nicht sind. Ein hupendes "OmgICantBelieveThisHappenedException()" in der nächsten Zeile würde jedoch noch deutlicher werden. :-)

Abgesehen von diesen beiden Situationen muss ich dem "use! =" -Camp zustimmen, da es klarer ist, wenn Sie den Code überfliegen. Das '!' kann leicht übersehen werden, vor allem mit einigen Formatierungskonventionen.