Keine Warnung "suggest parentheses." bei komplexen Ausdruecken

Gast #3809610
Lesenswert?

Hallo,

durch Tippfehler kommt es manchmal zu Ausdruecken wie
if (i = 1)
oder
if ((i== 1 ) && (j = 1))

Im ersten Fall geben aktuelle GCCs eine Fehlermeldung aus, im letzten 
Fall nicht, siehe auch das angehaengte Beispiel:
> gcc -v
...
gcc version 4.8.1 20130909
> gcc -Wall main.c
main.c: In function ‘main’:
main.c:9:9: warning: suggest parentheses around assignment used as truth 
value [-Wparentheses]
         if (i = 9999)
Die fehlende Warnung in komplexen Ausdruecken macht die Fehlersuche 
schwer.

Ist das ein GCC Bug? Lohnt es sich sowas zu melden? Und wo?
Angehängte Dateien:
Gast #3809809
Lesenswert?

Wer Lesen kann, ist eindeutig im Vorteil. Die Fehlermeldung
"suggest parentheses around assignment used as truth value" sagt ja, 
dass die Klammer eine gewollte Zuweisung geschreibt. Argh!

Danke
Gast #3812716
Lesenswert?

Das Beispiel ist aber völlig normaler Code und entspricht dem Standard.

>if ((i== 1 ) && (j = 1)) ...

ist das selbe wie
if (i== 1 ) { j = 1; ... }
und sowas kann durchaus beabsichtigt werden. Ein UND-Statement wird nur 
bis zur ersten  "0" ausgewertet und danach abgebrochen. Die Auswertung 
erfolgt von Links nach Rechts.

Das man solche Schusselfehler per Warnung erkennen soll wäre total 
übertrieben.
Dann müsste man der Konsistenz wegen auch  bei ">" warnen.

if (a > 4) ....
if (a >> 4) ....

Was von beiden ist nun der Tipfehler?

>Für diese Aussage soltest zu 2 Wochen Hausarrest mit Computer- &
>Fensehverbot bekommen.
das ist DEINE Meinung, aber Dogmen gehören doch eher in die Kirche.
Auch hier schriebt der Standard offensichtlich vor, wie die Operatoren 
abgearbeitet werden.  Wenn DU eine Leseholfe brauchst, ist das DEIN 
Problem, aber nicht das einer Person, die die Programmiersprache kennt.
Gast #3812725
Lesenswert?

.... (Gast) schrieb:
>> Für diese Aussage soltest zu 2 Wochen Hausarrest mit Computer- &
>> Fensehverbot bekommen.

> das ist DEINE Meinung, aber Dogmen gehören doch eher in die Kirche.

Das hat nix mit Dogmen zu tun, eher mit Hirn!

> Auch hier schriebt der Standard offensichtlich vor, wie die Operatoren
> abgearbeitet werden.  Wenn DU eine Leseholfe brauchst, ist das DEIN
> Problem, aber nicht das einer Person, die die Programmiersprache kennt.

Du kennst sie anscheinend nicht. Sowas hier kompiliert nämlich erst gar 
nicht
1
if a == b && c == d
2
{
3
  printf("gleich\n");
4
}
Gast #3812747
Lesenswert?

> Als Troll sollte man mehr
> Hirn
> besitzen. Es ist offensichtlich, dass es darum geht:

Offensichtlich ist gar nichts, wenn man empfiehlt Klammern wegzulassen. 
Das schafft nur mehr Verwirrung und Auslegungsorgien und dafür ist C 
sattsam bekannt.
Moderator Persönliche Seite #3812774
Lesenswert?

gute Ideen, schlechte Ideen schrieb:
> Offensichtlich ist gar nichts, wenn man empfiehlt Klammern wegzulassen.

Wenn man weiß, dass C vorsätzlich so gestaltet worden ist, dass
1
if (a > b && a < c) { ... }

so funktioniert, wie man es erwarten würde, dann macht das Weglassen
der Klammern in diesem Falle die Ausdrücke tatsächlich übersichtlicher
als eine übertriebene „Klammeritis“, und ganz nebenbei hätte es ja
Uwes Problem vermieden.

(In Pascal ist das nicht so, und das empfand ich seinerzeit, als ich
noch viel mit Turbo-Pascal gearbeitet habe, als ziemlichen Mist.)

Das ist natürlich keine Empfehlung, maximal alle Klammern wegzulassen,
sondern nur die zwischen Vergleichen, die mit logischen Operatoren
verknüpft werden (was aber wiederum in der Praxis recht häufig der Fall
ist).
#3813008
Lesenswert?

gnuopfer schrieb:
> Sven B. schrieb:
>> Gewöhn' dir einfach an, keine Klammern um a == b && c == d zu machen,
>
> Für diese Aussage soltest zu 2 Wochen Hausarrest mit Computer- &
> Fensehverbot bekommen.

Für die seltener verwendeten Operatoren wie Shifts oder so finde ich es 
ja sinnvoll, Klammern zu setzen, aber hier ist das wirklich Quatsch. 
Dass das richtig geklammert wird, weiß man doch. Bei a = b + 3 setzt du 
ja auch keine Klammern, um klar zu machen dass du nicht (a=b) + 3 
meinst.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren