Compiler-Warnung – schlägt Klammern um die Zuweisung vor, die als Wahrheitswert verwendet wird

Lesezeit: 2 Minuten

Benutzeravatar von FP
FP

Wenn ich versuche, den folgenden Code zu kompilieren, erhalte ich diese Warnung:

warning: suggest parentheses around assignment used as truth value

Warum passiert das? Dies ist eine ziemlich verbreitete Redewendung, glaube ich. Ich verwende so etwas früher sogar in meinem Code.

struct PIDList* 
getRecordForPID(struct PIDList* list, pid_t pid) {
    while(list = list->next)
        if (list->pid == pid)
            return list;

    return NULL;
}

  • Es steht Ihnen frei, die Warnung auszuschalten oder sie lieber auszuschalten, da sie standardmäßig ausgeschaltet ist …

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    29. März 2011 um 17:54 Uhr

  • Ich bin irgendwie geistesabwesend, also bin ich dankbar für pedantisch, -Wall, -Wextra, -Wshadow und dergleichen

    – F.P

    29. März 2011 um 18:03 Uhr

  • Nun, Sie können hinzufügen -Wno-parentheses (Ich glaube, das ist die richtige), um diese spezielle Warnung zu deaktivieren. Wenn Sie jedoch so geistesabwesend sind, achten Sie darauf, nicht zu schreiben = Anstatt von ==

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    29. März 2011 um 18:08 Uhr

  • Mögliches Duplikat von Warnung: Klammern um Zuweisung vorschlagen while (*(arg_to++) = *(arg_from++));

    – jpaugh

    19. Januar 2018 um 22:57 Uhr

Seien Sie explizit – dann wird der Compiler nicht warnen, dass Sie vielleicht einen Fehler gemacht haben.

while ( (list = list->next) != NULL )

oder

while ( (list = list->next) )

Eines Tages wirst du froh sein, dass der Compiler es dir gesagt hat, Leute tun diesen Fehler machen 😉

  • Menschen tun! Genau aus diesem Grund habe ich früher geschrieben if (0 == varName) in C, damit ich eine Fehlermeldung bekomme, wenn ich mich vertippe.

    – jpaugh

    19. Januar 2018 um 22:56 Uhr

  • @jpaugh Das nennt man eine Yoda-Bedingung. Es hat eine Wikipedia-Seite 🙂

    – Lars Nyström

    11. April 2021 um 16:51 Uhr

  • @LarsNyström Freut mich, das zu wissen!

    – jpaugh

    11. April 2021 um 17:03 Uhr

Benutzeravatar von geekosaur
Geekosaurier

Während diese bestimmte Redewendung üblich ist, wird sie von Menschen noch häufiger verwendet = wenn sie meinen ==. Die Konvention, wenn Sie die wirklich meinen = ist eine zusätzliche Ebene von Klammern zu verwenden:

while ((list = list->next)) { // yes, it's an assignment

Es ist nur eine “Sicherheits”-Warnung. Es ist eine relativ häufige Redewendung, aber auch ein relativ häufiger Fehler, wenn Sie es beabsichtigt haben == da drin. Sie können die Warnung verschwinden lassen, indem Sie weitere Klammern hinzufügen:

while ((list = list->next))

1412080cookie-checkCompiler-Warnung – schlägt Klammern um die Zuweisung vor, die als Wahrheitswert verwendet wird

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

Privacy policy