Was ist der Zweck eines ‘if (0)’-Blocks im if-else-Block?

Lesezeit: 7 Minuten

Benutzeravatar von Zzaponka
Zzaponka

Meine Frage bezieht sich auf die Zeile, die ich im Betreff erwähnt habe und die ich an vielen Stellen im Produktionscode sehen kann.

Der Gesamtcode sieht so aus:

if (0) {
    // Empty braces
} else if (some_fn_call()) {
    // actual code
} else if (some_other_fn_call()) {
    // another actual code
    ...
} else {
    // default case
}

Die anderen Zweige sind für meine Frage irrelevant. Ich frage mich, was das Setzen bedeutet if (0) hier ist. Die geschweiften Klammern sind leer, also denke ich nicht, dass es einen Codeblock kommentieren soll. Zwingt es den Compiler, einige Optimierungen vorzunehmen, oder sind seine Absichten anders?

Ich habe versucht, diesen expliziten Fall hier auf SO und im Internet zu suchen, aber ohne Erfolg. Es gibt ähnliche Fragen zu JavaScript, aber nicht zu C. Es gibt eine andere Frage, Was passiert, wenn eine Null in einer „if“-Bedingung zugewiesen wird?, aber sie behandelt die Nullzuweisung an eine Variable, nicht die Verwendung von „if (0)“ selbst .

  • Diese Aussage scheint irrelevant. Generieren Sie Assemblercode mit und ohne diese Anweisung und Sie werden sehen, was unter der Haube vor sich geht.

    – Hacken

    16. November 2018 um 9:38 Uhr

  • Es ist möglich, dass dies ein automatisch generierter Code ist.

    – verrückt

    16. November 2018 um 12:19 Uhr

Dies kann nützlich sein, wenn es welche gibt #if Aussagen, äh

   if (0)
   {
       // Empty block
   }
#if TEST1_ENABLED
   else if (test1())
   {
      action1();
   }
#endif
#if TEST2_ENABLED
   else if (test2())
   {
      action2();
   }
#endif

usw.

In diesem Fall können alle (und alle) Tests sein #ifheraus, und der Code wird korrekt kompiliert. Fast alle Compiler entfernen die if (0) {} Teil. Ein einfacher Autogenerator könnte solchen Code generieren, da er etwas einfacher zu codieren ist – er muss den ersten aktivierten Block nicht separat berücksichtigen.

  • In vielen Fällen ein if/else if Kette wird nicht so sehr als Entscheidungsbaum verwendet, sondern eher als Konstrukt “handeln bei der ersten übereinstimmenden Bedingung”, bei dem die Bedingung mit der höchsten Priorität nicht besonders “besonders” ist. Während ich nicht gesehen hatte if(0) verwendet, um allen realen Zweigen eine konsistente Syntax zu ermöglichen, gefällt mir die konsistente Syntax, die sie ermöglicht.

    – Superkatze

    14. November 2018 um 20:31 Uhr

  • Es ist in diesem Fall nicht einmal sinnvoll, weil Sie den gleichen Effekt auch ohne erzielen können: Teilen Sie einfach die else if Linie in zwei und setzen Sie den Präprozessorschutz dazwischen.

    – Konrad Rudolf

    15. November 2018 um 9:49 Uhr

  • @KonradRudolph Ich folge nicht; wie würdest du es schreiben?

    – JiK

    15. November 2018 um 17:19 Uhr

  • @JiK Ich würde das entfernen if (0) verzweigen und den Rest so umformatieren, dass else ist auf einer eigenen Linie, umgeben von einer Wache entlang der Linien von #if TEST1_ENABLED && TEST2_ENABLED.

    – Konrad Rudolf

    15. November 2018 um 17:54 Uhr


  • @KonradRudolph das ist in Ordnung, wenn Sie die Anzahl der Wachen verdoppeln und die Anzahl der erwähnten Wachbedingungen verdreifachen möchten, nehme ich an.

    – Hobbs

    15. November 2018 um 22:38 Uhr

Benutzeravatar von PSkocik
PSkocik

Ich benutze das manchmal aus Symmetriegründen, damit ich das andere bewegen kann else if{ frei mit meinem Editor herumspielen, ohne mich um das erste kümmern zu müssen if.

Semantisch die

if (0) {
    // Empty braces
} else 

Teil tut nichts und Sie können sich darauf verlassen, dass Optimierer es löschen.

  • Persönliche Meinung: Dies mag zwar der Grund sein, warum es so geschrieben ist, aber ich denke, es ist eine schlechte Begründung. Code wird häufiger gelesen als geschrieben, und dieser unnötige Code erhöht nur den Parsing-Overhead für den Leser.

    – Benutzer694733

    14. November 2018 um 11:15 Uhr


  • @ user694733: Man könnte argumentieren, dass das üblich ist if else Präfix für alle wichtigen Codepfade ordnet die Bedingungen gut an und erleichtert das Scannen. (Das ist jedoch subjektiv und würde stark davon abhängen, was wirklich in den Bedingungen und Codeblöcken enthalten ist.)

    – M Öhm

    14. November 2018 um 11:25 Uhr

  • Ich denke nicht if (0) {..} führt jedes Parsability/Readability-Problem ein. Es sollte jedem klar sein, der sich ein bisschen mit C auskennt. Das ist kein Problem. Das Problem ist die Folgefrage nach dem Lesen: “Wofür zum Teufel ist das denn?” Es sei denn, es dient Debugging-/temporären Zwecken (d. h. die Absicht besteht darin, dies zu “aktivieren”. if später blockieren), würde ich befürworten entfernen insgesamt. Grundsätzlich würde das “Lesen” eines solchen Codes wahrscheinlich ohne triftigen Grund eine unnötige “Pause” für den Leser verursachen. Und das ist ein guter Grund, es zu entfernen.

    – PP

    14. November 2018 um 13:53 Uhr

  • Scheint definitiv die Lesbarkeit zu beeinträchtigen. Es war so schlimm, dass es diesen Programmierer zu SO geschickt hat, um zu fragen, wozu es gut sei. Kein gutes Zeichen.

    – Vektorjohn

    14. November 2018 um 21:58 Uhr

  • Selbst mit diesem Muster weiß ich nicht, ob Sie sich bewegen können else if rund um den Editor ohne Sorge”, da sich die Bedingungen in diesem Fall möglicherweise nicht gegenseitig ausschließen bestellen Angelegenheiten. Ich persönlich würde nur verwenden ifund durchführen vorzeitige RückkehrExtrahieren der Logikkette in eine separate Funktion, falls erforderlich.

    – John Wu

    15. November 2018 um 3:44 Uhr


Ich habe ein ähnliches Muster gesehen, das in generiertem Code verwendet wird. Zum Beispiel habe ich in SQL Bibliotheken gesehen, die Folgendes ausgeben where Klausel.

where 1 = 1

Dies macht es vermutlich einfacher, andere Kriterien einfach hinzuzufügen, da alle zusätzlichen Kriterien vorangestellt werden können and statt einer zusätzlichen Prüfung, ob es das erste Kriterium ist oder nicht.

  • Das 1=1 ist auch “nützlich”, weil man das immer hinzufügen kann where vorne, bedingungslos. Andernfalls müssten Sie prüfen, ob es leer ist, und in diesem Fall vermeiden, die zu generieren where Klausel.

    – Bakuriu

    14. November 2018 um 21:08 Uhr

  • Darüber hinaus werden die meisten Datenbanken automatisch “entfernen”. 1=1 von dem WHEREhat also keinen Einfluss auf die Leistung.

    – Nik

    14. November 2018 um 21:55 Uhr

  • Dies ist in einer Bibliothek akzeptabel, die automatisch SQL-Abfragen generiert, die höchstwahrscheinlich selbst vom DevOps-Team nie gesehen werden. Es ist nicht “akzeptabel” in High-Level-Code, der mehrmals geschrieben und gelesen werden muss.

    – phagio

    15. November 2018 um 12:32 Uhr


  • Dies ist ein wirklich praktischer Ansatz, wenn Sie eine Art von erstellen dynamisches SQL mit unbekannter Anzahl von Endbedingungen.

    – Kapitän

    16. November 2018 um 12:22 Uhr

  • @freakish Ich habe tatsächlich das Gegenteil geschrieben: Eine schlecht lesbare Syntax ist in generiertem Code akzeptabel, da sie höchstwahrscheinlich nie gelesen wird, nicht in funktionalem Code auf hoher Ebene, der von Entwicklern gepflegt wird.

    – phagio

    16. November 2018 um 13:41 Uhr

Wie geschrieben, die if (0) {} Klausel kompiliert sich zu nichts.

Ich vermute, die Funktion der Klausel ganz oben auf dieser Leiter besteht darin, einen einfachen Ort bereitzustellen, an dem alle anderen Funktionen auf einmal (zu Debugging- oder Vergleichszwecken) vorübergehend deaktiviert werden können, indem die geändert wird 0 zu einem 1 oder true.

Eine noch nicht erwähnte Möglichkeit: die if (0) { Die Linie könnte eine geeignete Stelle für einen Haltepunkt darstellen.

Das Debuggen wird häufig mit nicht optimiertem Code durchgeführt, sodass der Always-False-Test vorhanden ist und Haltepunkte darauf gesetzt werden können. Bei der Kompilierung für die Produktion würde die Codezeile optimiert werden. Die scheinbar nutzlose Zeile bietet Funktionen zum Entwickeln und Testen von Builds, ohne die Release-Builds zu beeinträchtigen.

Es gibt oben auch andere gute Vorschläge; Der einzige Weg, um wirklich zu wissen, was der Zweck ist, besteht darin, den Autor aufzuspüren und zu fragen. Ihr Quellcodeverwaltungssystem könnte dabei helfen. (Suchen blame-Typ-Funktionalität.)

Benutzeravatar von Peter Mortensen
Peter Mortensen

Ich bin mir keiner Optimierungen sicher, aber meine zwei Cent:

Dies geschah aufgrund einer Codeänderung, bei der eine primäre Bedingung entfernt wurde (der Funktionsaufruf in initial if Block, sagen wir mal), sondern die Entwickler/Maintainer

also anstatt die zugehörige zu entfernen if Block, sie haben einfach die Bedingung in geändert if(0) und ging weiter.

Benutzeravatar von Dark Matter
Dunkle Materie

Es ist Codefäule.

Irgendwann hat das “if” etwas Nützliches getan, die Situation hat sich geändert, vielleicht wurde die ausgewertete Variable entfernt.

Die Person, die das System repariert/ändert, hat es getan die Logik des Systems so wenig wie möglich beeinflussen also hat er nur dafür gesorgt, dass der Code neu kompiliert wird. Also hinterlässt er ein „if(0)“, weil das schnell und einfach geht und er sich nicht ganz sicher ist, ob er das tun möchte. Er bringt das System zum Laufen und kehrt nicht zurück, um es vollständig zu reparieren.

Dann kommt der nächste Entwickler und denkt, das sei absichtlich so gemacht worden und nur diesen Teil des Codes auskommentiert (da er sowieso nicht ausgewertet wird), dann werden diese Kommentare beim nächsten Berühren des Codes entfernt.

  • Jawohl. Nehmen Sie für alten Code jeweils nur eine Änderung vor, die toten Code entfernt. Ich kann nicht zählen, wie oft ich gegen “toten” Code randaliert habe, nur um festzustellen, dass es einen bizarren Nebeneffekt gab, der beim Slash-and-Burning übersehen wurde.

    – Julie in Austin

    27. Juni 2019 um 23:59 Uhr

1423950cookie-checkWas ist der Zweck eines ‘if (0)’-Blocks im if-else-Block?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy