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