Forum: Compiler & IDEs Keine Warnung "suggest parentheses." bei komplexen Ausdruecken


von Uwe Bonnes (Gast)


Angehängte Dateien:

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?

von (prx) A. K. (prx)


Lesenswert?

Uwe Bonnes schrieb:
> Ist das ein GCC Bug?

Nein. Immerhin ist es legaler Code und Versionen der Art
 while (c = ichwillwasundhoerbeinullauf())
sind völlig normal.

Mitunter werden Klammern um einen Ausdruck vom Compiler als Indiz 
gewertet, dass es gewollt ist. In
  if (i = 1)
sind keine drin, in
  if (... (i = 1))
hingegen schon.

: Bearbeitet durch User
von Sven B. (scummos)


Lesenswert?

Gewöhn' dir einfach an, keine Klammern um a == b && c == d zu machen, 
die sind sowieso unnötig -- dann sollte auch die Warnung wieder gehen.

von Uwe Bonnes (Gast)


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

von gnuopfer (Gast)


Lesenswert?

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.

von .... (Gast)


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.

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Uwe Bonnes schrieb:
> if (i = 1)

Hier bietet sich die folgende Schreibweise an:
1
if(1 == i)

Schreibt man nun aus Versehen
1
if(1 = i)

quittiert der Compiler das gleich mit einem Fehler.

von .... (Gast)


Lesenswert?

Kursiert diese Variante nicht aus also Joda-Ausdrucksweise? Irgend 
soetwas StarWars-bezogenes gabs da doch^^

von .... (Gast)


Lesenswert?


von gute Ideen, schlechte Ideen (Gast)


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
}

von .... (Gast)


Lesenswert?

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

if (a == b && c == d)
if ((a == b) && (c == d))

Meine Güte. Das Internet.

von gute Ideen, schlechte Ideen (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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).

von Sven B. (scummos)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.