Warum warnt Clang: `’&&’ innerhalb von ‘||’`?

Lesezeit: 4 Minuten

Mein Verständnis ist, dass die Klammern keinen Unterschied machen, gibt es also einen Grund (außer um die Code-Klarheit zu „verbessern“), dass Clang dies standardmäßig warnt? Ich ziehe es vor, die Klammern nicht hinzuzufügen, da ich es nicht mag, Code um des Codes willen hinzuzufügen.

src/websocket.c:420:43: warning: '&&' within '||' [-Wlogical-op-parentheses]
        if (rv == 0 && N != 0 || rv == -1 && errno == ECONNRESET) {
                              ~~ ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
src/websocket.c:420:43: note: place parentheses around the '&&' expression to
      silence this warning
        if (rv == 0 && N != 0 || rv == -1 && errno == ECONNRESET) {
                                 ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~

  • Wie wäre es mit dem Hinzufügen von Code für Klarheit ist Sake? Klammern hier würden Leuten helfen, die sich nicht an die Regeln zum Vorrang von erinnern && und || (die nicht allzu oft auftauchen).

    – chao

    5. Juni 2013 um 12:30 Uhr


  • Ich bin dafür, Code hinzuzufügen, um die Übersichtlichkeit zu verbessern. Ich persönlich finde jedoch, dass das zusätzliche visuelle Rauschen der unnötigen Klammern in diesem Fall die Klarheit verringert. Wenn ich die zusätzlichen Klammern sehe, scanne ich sofort die ganze Zeile und suche nach einem Grund dafür, wenn ich keinen finde, muss ich eine Weile grübeln, ob ich es falsch gelesen habe oder ob der betreffende Code nur versucht, mir zu „helfen“. um die Operatorpräzedenz zu verstehen, die ich bereits kannte. Dieser Code ist bestimmt nicht für unerfahrene Programmierer, die meisten Leute, die es lesen, werden auf meinem Niveau sein, und daher gehe ich davon aus, dass sie genauso denken werden.

    – mxkl

    5. Juni 2013 um 12:33 Uhr


  • @KingsIndian Compiler warnen auch davor if (x = 3), was vollkommen legal ist. Der Punkt ist, dass es als etwas angesehen wird, das die Leute oft falsch verstehen, also entschieden die Compiler-Autoren, dass es eine Warnung wert ist.

    – Daniel Fischer

    5. Juni 2013 um 12:43 Uhr

  • Ich behebe auch immer Warnungen und finde es lächerlich, dass Leute dafür plädieren, dass ich unnötigen Code hinzufüge, um Leuten zu helfen, die wichtige Dinge nicht gelernt haben, wie z Operator Vorrang. Der Himmel bewahre, dass ich jemals einen so schrecklichen Programmierer einstelle.

    – mxkl

    5. Juni 2013 um 16:51 Uhr

  • Warum verteidigen alle diese Warnung so vehement? Wie würden Sie sich fühlen, wenn der Compiler Sie jedes Mal warnen würde, wenn Sie „2 + 3 * 4“ sagen? Es ist mehr als lächerlich. Die Annahme ist, dass Programmierer a Basic Verständnis der Sprache, mit der sie arbeiten, und brauchen kein visuelles Durcheinander, um Vorrang zu verstehen. Außerdem scheint Xcode keine Option zu bieten, um dies standardmäßig zu deaktivieren …

    – Philipp Guin

    17. Juni 2013 um 21:53 Uhr


Die natürliche Tendenz besteht darin, es von links nach rechts zu lesen, und es ist leicht, die Operatorpriorität zu vergessen. Das heißt, es ist nur eine Warnung, und wenn Sie wissen, was Sie tun, und Ihr eigener Stil es zulässt, können Sie es gerne unterdrücken.

  • Für diejenigen, die es unterdrücken möchten, fügen Sie Folgendes hinzu: -Wno-logical-op-parentheses zu den CFLAGS Ihres Build-Systems.

    – mxkl

    5. Juni 2013 um 12:29 Uhr

Ich vermute, weil es einfach ein bisschen unklar ist, es sei denn, der Leser ist sehr gut darin Vorrangregeln für Operatoren in C.

Dein Ausdruck ist so:

if (A && B || C && D)

und da && hat einen höheren Vorrang als ||es bedeutet

if ((A && B) || (C && D))

was du meinst, denke ich, aber es ist beim Lesen nicht sehr klar.

  • IMHO sollte sich jeder, der sich zumindest ein wenig mit grundlegender Logik befasst hat, daran erinnern, dass UND in der Mathematik einen höheren Vorrang hat als ODER. Ich denke, der Compiler ist hier ziemlich paranoid. (Das heißt, dies ist definitiv nicht derselbe Fall wie if (a = 0).)

    Benutzer529758

    28. September 2013 um 9:19 Uhr


  • Voll und ganz einverstanden – das ist die nutzloseste Warnung, die ich je gesehen habe. Warum erlaubt es, 1+2*3 zu schreiben und schlägt nicht vor, es in 1+(2*3) zu ändern?

    – Alexander Kirillin

    30. Januar 2014 um 19:34 Uhr

  • Wahrscheinlich, weil in der realen Welt die meisten Programmierer ziemlich sicher sind, was 1+2*3 tut genau, während die meisten von ihnen nicht sicher sind, was a && b || c && d wird es genau tun.

    – Drax

    5. August 2014 um 8:12 Uhr

  • Wann && und || sind nicht überladen, ist es aber nicht A && B || C && D eher so interpretiert if (A && B) { return true; } else if (C && D) { return true; } else { return false; }? Sagt, dass && hat einen höheren Vorrang etwas impliziert, dass C && D wird vor dem ausgewertet ||aber mein aktuelles Verständnis ist, dass eine genauere Übersetzung wäre A && (B || (C && D)). Diese Unterscheidung ist natürlich nur für Nanooptimierungen relevant. Wie auch immer, das Wichtigste aus der Warnung ist definitiv das A && (B || C) && D ist eine Fehlinterpretation.

    – M-Pixel

    19. Januar 2018 um 18:41 Uhr

  • @M-Pixel A && (B || (C && D)) ist nicht einmal gleichwertig. Dies wird immer als falsch ausgewertet A falsch ist, während das Original solange wahr wäre C und D sind beide wahr.

    – Unvergängliche Nacht

    6. Juni um 22:22 Uhr

1401870cookie-checkWarum warnt Clang: `’&&’ innerhalb von ‘||’`?

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

Privacy policy