Forum: Mikrocontroller und Digitale Elektronik AVR-Studio - machen die Klammern hier einen Unterschied?


von David (Gast)


Lesenswert?

Hallo,

kann es beim AVR-Studio einen Unterschied machen, ob man schreibt

if ( (a==0) &&  (b==1)  )

oder

if ( (a==0) && ((b==1)) )

?

von mh (Gast)


Lesenswert?

Dem AVR Studio ist es herzlich egal, was Du schreibst. Den vom AVR 
Studio aufgerufenen Compiler interessierts.
Aber wieviele zusätzliche Klammern Du um (b == 1) machst, ist auch dem 
egal.

von Peter II (Gast)


Lesenswert?

David schrieb:
> kann es beim AVR-Studio einen Unterschied machen, ob man schreibt

ja, die Datei wird größer sonst ändert sich aber nichts.

von Himbeertorte (Gast)


Lesenswert?

Ich glaube nicht, man kann sogar "if(a==0&&b==1)" schreiben. Genauso ist 
z.B. (x+y)*2 das gleiche wie ((x+y))*2 oder (((x+y)))*2

von nicht"Gast" (Gast)


Lesenswert?

Zur Vervollständigung noch was zum Lesen

http://en.cppreference.com/w/c/language/operator_precedence

von Joachim B. (jar)


Lesenswert?

ich bin aber nie sicher ob er wirklich Punkt vor Strichrechnung 
beherrscht, im Zweifel setze ich sicherheitshalber Klammern und ggffs. 
noch casts.

Sonst wunderte ich mich schon manchmal über "merkwürdige" Ergebnisse, 
vor allem bei gemischten Rechnungen mit long und int.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Himbeertorte schrieb:
> Ich glaube nicht, man kann sogar "if(a==0&&b==1)" schreiben.
Glück gehabt: && hat eine niedrigere Priorität als ==

Es ginge allerdings schief, wenn man schreiben würde
if (a&3 == b&3)
Da müssen zwingend noch Klammern rein:
if ((a&3) == (b&3))

Siehe 
https://de.wikibooks.org/wiki/C-Programmierung:_Liste_der_Operatoren_nach_Priorit%C3%A4t

Ob man allerdings um irgendwelche Klammern zusätzlich Klammern 
macht, das ist dem Compiler schnurz...

von Wolfgang A. (Gast)


Lesenswert?

Joachim B. schrieb:
> ich bin aber nie sicher ob er wirklich Punkt vor Strichrechnung
> beherrscht, im Zweifel setze ich sicherheitshalber Klammern und ggffs.
> noch casts.

Lerne die Regeln oder setze dir einen Link auf eine passende Web-Seite. 
Jede Schnörkelei, die du überflüssigerweise in den Code packst, musst du 
beim nächsten Mal, wenn du ihn anguckst, wieder lesen.

David schrieb:
> if ( (a==0) && ((b==1)) )

Wenn du schreibst
1
if ( a==0 && b==1 )
ist das genauso übersichtlich und du musst nicht die ganzen 
überflüssigen Zeichen durch dein Hirn wälzen.

von U. C. (Gast)


Lesenswert?

Wolfgang A. schrieb:
> durch dein Hirn wälzen

Klammern? Wälzen?

Ich finde
> if ( (a==0) && (b==1) )
leichter zu lesen
als:
> if ( a==0 && b==1 )

Die Zeiten, wo man an Klammern sparen musste sind nun wirklich 
vorbei....

von Peter D. (peda)


Lesenswert?

Wenn Du die C-Vorrangregeln nicht kennst, mußt Du eben Klammern setzen.

Der AVR-GCC ist allerdings überpingelig.
Ich wollte mal die Warnung unterdrücken und habe natürlich prompt die 
Klammern falsch gesetzt.

von Marc S. (marc_s86)


Lesenswert?

wenn du in einem if eine zuweisung machst sind klammern interessant:

if(a=b)

gibt eine warning weil du ja versehentlich das 2. gleich vergessen haben 
könntest.

mit

if((a=b))

sagst du dem Compiler, dass du dort wirklich eine zuweisung und keinen 
vergleich machen wolltest.

von Adib (Gast)


Lesenswert?

Wolfgang A. schrieb:
> Wenn du schreibstif ( a==0 && b==1 )ist das genauso übersichtlich und du
> musst nicht die ganzen
> überflüssigen Zeichen durch dein Hirn wälzen.

Leider führt diese Schreibweise immer wieder zu unabsichtlichen 
Programmiererfehlern.
Deshalb fordern viele Kodierrichtlinien das Klammern um diese Ausdrucke.
(Stichwort MISRA)

Grüße, Adib.
--

von David (Gast)


Lesenswert?

Vielen herzlichen Dank für die vielen guten Antworten!

Lothar M. schrieb:
> Siehe
> 
https://de.wikibooks.org/wiki/C-Programmierung:_Liste_der_Operatoren_nach_Priorit%C3%A4t

Prima, so etwas für den Überblick habe ich gesucht! Danke Lothar!

von Marian (phiarc) Benutzerseite


Lesenswert?

Marc S. schrieb:
> wenn du in einem if eine zuweisung machst sind klammern interessant:
>
> if(a=b)
>
> gibt eine warning weil du ja versehentlich das 2. gleich vergessen haben
> könntest.
>
> mit
>
> if((a=b))
>
> sagst du dem Compiler, dass du dort wirklich eine zuweisung und keinen
> vergleich machen wolltest.

Das ist kein Teil vom Standard, sondern reine Konvention. Durch die 
doppelten (syntaktisch überflüssigen) Klammern signalisiere ich als 
Programmierer anderen Programmierern und zukünftigen selbst(en), dass 
hier absichtlich eine Zuweisung stattfindet.

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.