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?
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
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.
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
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.
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.
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.
Kursiert diese Variante nicht aus also Joda-Ausdrucksweise? Irgend soetwas StarWars-bezogenes gabs da doch^^
.... (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 | }
|
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.
> 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.
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.