it-swarm.com.de

"gleich" oder "nicht gleich" Operatoren in einer if-else-Anweisung

Gibt es beim Schreiben von if-else-Anweisungen in C einen Grund, warum der Operator bevorzugt "gleich" und nicht "gleich" verwendet wird, wenn beide dasselbe Ergebnis erzielen können?

Der folgende Code enthält den Kontext. Wenn das Argument count gleich 2 ist, wird eine Zeichenfolge vom Benutzer abgerufen. Wenn jedoch ein anderer Wert von Argumenten ermittelt wird, wird eine Fehlermeldung angezeigt.

int main(int argc, string argv[])
{
    string msg;

    if (argc == 2) 
    {
        msg = GetString();
    }
    else
    {
        printf("ERROR: Please only enter a single key! \n");
        return 1;
    }

Ich kann jedoch dasselbe Ergebnis wie oben erzielen, indem ich die Bedingung der if-else-Schleife in "nicht gleich" ändert und die zugehörigen Aktionen umdreht. Siehe unten:

int main(int argc, string argv[])
{
    string msg;

    if (argc != 2) 
    {
        printf("ERROR: Please only enter a single key! \n");
        return 1;
    }
    else
    {
        msg = GetString();
    }

Wie auch immer, da beide das gleiche Ergebnis haben, sollte einer der anderen gegenüber bevorzugt verwendet werden? 

17
user7011119

Es gibt einen technischen Grund in C++. Wenn Sie == über != verwenden, müssen Sie nicht so viele Operatoren überladen. 

Dies ist wichtig, wenn Sie sich mit Funktionsobjekten ("Funktoren") beschäftigen. Zum Beispiel, wenn Sie eine Standard-Containerklasse zum Speichern Ihrer eigenen benutzerdefinierten Objekte verwenden und diese automatisch sortiert werden möchten. Damit das Funktionsobjekt (z. B. std :: equal_to) funktioniert, muss Ihre Klasse nur den ==-Operator überladen. Sie müssen == und != nicht beide überladen.

Bei anderen Funktionsobjekten ist es ebenfalls erforderlich, dass Sie nur < und nicht alle von < > == != <= >= überladen.


Im Allgemeinen sind Negationen für das menschliche Gehirn nicht leicht zu verstehen. Besonders wenn Sie doppelte Verneinungen haben. In den meisten Programmiersprachen ist es üblich, zuerst die Gleichheitsprüfung zu schreiben, wenn die Reihenfolge technisch keine Rolle spielt. Meistens macht es den Code leichter lesbar.

Aber wie so oft beim Programmieren und Codieren, gibt es keine schwarzen oder weißen Regeln. Wenn der Grund für die Überprüfung darin besteht, einen Fehler zu finden, hat die lesbarste Art der Fehlerbehandlung Vorrang vor "Menschen finden Negationen schwerer zu lesen".

Betrachten Sie diesen nicht zu gut geschriebenen Code:

if(input == good)
{
  if(format == expected)
  {
    do_stuff();
    return ok;
  }
  else
  {
    return error_format;
  }
}
else
{
  return error_input;
}

Stellen Sie sich vor, wir müssen noch mehr Fehlerbehandlung hinzufügen. Ein ganz allgemeiner Fall: Nehmen wir an, wir schreiben einen Parser oder einen Datenprotokoll-Decoder mit viel Fehlerbehandlung. Die mehreren Ebenen geschachtelter geschweiften Klammern würden den Code bald zu einem kompletten Durcheinander machen. 

Wenn wir von == in! = Wechseln, können wir die Notwendigkeit der Verschachtelung von if-Anweisungen beseitigen.

if(input != good)
{
  return error_input;
}

if(format != expected)
{
  return error_format;
}

// if we got here then all is well
do_stuff();
return ok;

Dies wird deutlich lesbarer und besser skalierbar sein, wenn weitere Fehlerprüfungen hinzugefügt werden müssen. Durch das Ändern auf! = Haben wir den Code lesbarer gemacht.

12
Lundin

Es ist nur ein Problem mit dem Codierungsstil. Ich hasse es, die Hauptlogik zu verschachteln, ich schreibe sie als:

int main(int argc, string argv[])
{
    if (argc != 2) 
    {
        printf("ERROR: Please only enter a single key! \n");
        return 1;
    }

    string msg = GetString();
}

BTW: Das Vorzeichen von main sollte int main(int argc, char *argv[]) sein.

12
songyuanyao

Normalerweise bevorzuge ich "gleich", weil Code für einen Menschen "lesbarer" ist. Es vereinfacht den Code. Es würde mehr als "Nice-Codier-Richtlinie" als "Regel" bezeichnet werden, da es die Laufzeit nicht beeinflusst (es war Teil der Codier-Richtlinien meines vorherigen Unternehmens).

Überprüfen Sie dies:

if ( !isEmpty() )

Ihr Gehirn braucht einige Millisekunden mehr, um zu verstehen, was der Test macht, als wenn Sie schreiben:

if ( isEmpty() )

Auch wenn es keine Auswirkungen auf die Laufzeit hat, bevorzuge ich normalerweise "ist gleich" bis "ist nicht gleich".

Die gleichen Argumente gelten für Variablen und Funktionsnamen. isSet Attribut/Methode gegenüber isNotSet vorziehen. Das Lesen eines Codes wie if ( !isNotSet() ) ist einfacher als wenn if ( isSet() ), auch wenn sie am Ende gleichwertig sind.

Wenn Sie Code verwenden, über den Sie keine Kontrolle haben, und dieser Code bietet einem Mitglied, das negative Fragen beantwortet, Folgendes:

if ( isNotSet() )

ist für Entwickler definitiv leichter zu lesen als:

if ( !isNotSet() )
5
jpo38

Wie andere schon gesagt haben, handelt es sich um eine Stilfrage. Es gibt keinen wirklichen Unterschied. 

Eine Sache, die man im Hinterkopf behalten sollte, ist jedoch zu versuchen, konsequent zu sein. Wenn Sie einen Block mit value1 == 2 prüfen, versuchen Sie, den nächsten Block nicht mit value2 != 4 zu überprüfen. Der einzige schlechte Stil ist inkonsistenter Stil.

1
technokrat

Heutzutage gibt es keinen semantischen Unterschied zwischen den beiden Fällen, da selbst die einfachere Optimierung, die von Compilern angewendet wird, disrupt "beabsichtigter Ausführungsablauf" bedeuten kann.

Vor 30 bis 40 Jahren hätte es vielleicht einen Unterschied zwischen den beiden Optionen geben können, als der Codegenerierungsschritt des C-Compilers dem geschriebenen Code ziemlich folgte.

Der tatsächliche Unterschied liegt heute in der Syntax und der Klarheit des Stils.

Also beim Schreiben

while( *dst++=*src++ );

heutzutage könnte derselbe Maschinencode wie erzeugt werden

for( i=0; src[i] != 0; i++ )
  dst[i] = src[i];
dst[i] = '\0';

Letzteres ist im Allgemeinen viel einfacher zu lesen, wie in gezeigt

if( ! isOK() )
  dontDoIt();
else
  doIt();

und in

if( isOK() )
  doIt()
else
  dontDoIt();

Seien Sie jedoch sicher: "Klarheit" ist kein absoluter Wert: Sie hängt nicht nur von den "Programmierkenntnissen und dem Geschmack" der Leser/Rezensenten ab, sondern auch vom Code selbst.

Fazit: Treffen Sie Ihre Wahl und bleiben Sie für Einheitlichkeit dabei!

0
EnzoR

Dies ist eine Frage zum Programmdesign. Als Programmierer müssen Sie entscheiden, welcher für Ausführung, Wartung, Lesbarkeit und Leistung besser geeignet ist. Darüber hinaus sind dies zwei völlig unterschiedliche Aussagen. Wenn Ihre Funktion NUR aufgerufen werden soll, wenn argc gleich 2 ist, müssen Sie GetString () nicht aufrufen. Immer wenn die Nummer nicht 2 ist. 

0