Forum: Mikrocontroller und Digitale Elektronik Operatorrangfolge


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Georg M. (g_m)


Lesenswert?

Ich dachte, dass sowas wie
1
if(bytevar & 0x1F == 0x1F)
selbstverständlich ist. Aber nein,
man muss es so schreiben:
1
if((bytevar & 0x1F) == 0x1F)

von Andreas (Gast)


Lesenswert?

Ja,die Operratorreihenfolge in C gibt aber auch nichts anderes vor...
https://en.cppreference.com/w/c/language/operator_precedence

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


Lesenswert?

Georg M. schrieb:
> Ich dachte ...
Das Beste daran: man muss dabei zum Glück gar nichts denken, sondern 
einfach nur das Handbuch zur verwendeten Sprache durchlesen.

Da sind noch mehr solcher überraschenden Tricks versteckt...

: Bearbeitet durch Moderator
von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

und

Georg M. schrieb:
> selbstverständlich

weist dich der Compiler mit einer Warnmeldung exakt darauf hin.

von Muskelmänner 200 (Gast)


Lesenswert?

Lothar M. schrieb:
> Da sind noch mehr solcher überraschenden Tricks versteckt...

Selbst wenn man die richtige Reihenfolge einhält empfiehlt es sich bei 
so etwas immer zu Klammern, diese kosten nichts und stellen das 
gewünschte Verhalten sicher.

Spätestens wenn der Werksstudent loslegt merkt man wie sinnvoll so etwas 
ist...

von A.S. (Gast)


Lesenswert?

Εrnst B. schrieb:
> weist dich der Compiler mit einer Warnmeldung exakt darauf hin.

Gibt es denn eine sinnvolle Anwendung für die gewählte Priorität? Gerne 
auch indirekt?

Sonst ist es einfach ein Fehler der Pilgrims (àh Gründerväter).

von foobar (Gast)


Lesenswert?

> Gibt es denn eine sinnvolle Anwendung für die gewählte Priorität?

Sollte sich wohl ähnlich verhalten wie && und || - bei denen erwartet 
man diese Priorität bzg ==, <= und >=.
1
   if (a==b && c==d) ...
2
   if (a==b &  c==d) ...

von A. S. (Gast)


Lesenswert?

foobar schrieb:
> Sollte sich wohl ähnlich verhalten wie && und || - bei denen erwartet
> man diese Priorität bzg ==, <= und >=.

Dachte ich auch erst, dann verworfen und gefragt (weil ja nicht 
"boolsch") und nun plausibel im Lichte des Parallelthreads: Damit wäre 
&& ohne Kurzschluss und Klammer möglich: !a() & b()==0 & c()!=0

| geht ja sowieso :-)

von PittyJ (Gast)


Lesenswert?

Ich klammere immer, dann muss ich nicht denken.
Lieber eine Klammer zu viel, als eine zu wenig. Sonst ist man später 
stundenlang am Debuggen.

von foobar (Gast)


Lesenswert?

> Ich klammere immer, dann muss ich nicht denken.

Dann fehlen da aber welche ...

von HildeK (Gast)


Lesenswert?

PittyJ schrieb:
> Lieber eine Klammer zu viel, als eine zu wenig.

SCNR: lieber zwei Klammern zu viel als zwei zu wenig.
Mit nur einer Klammer bekommst du eine Fehlermeldung ... 😀

Aber mit dem was du meintest pflichte ich dir bei. Wenn man sich nicht 
sicher ist, geht es schneller mit einem extra Klammerpaar als in der 
Referenz nachzuschauen.

von Wilhelm M. (wimalopaan)


Lesenswert?

Wo ist das Problem?

Wenn Du
1
    std::byte bytevar{};
2
    if(bytevar & 0x1F == 0x1F) {
3
    }
schreibst gibst es eine ganz klare Fehlermeldung, wenn Du
1
    uint8_t bytevar{};
2
    if(bytevar & 0x1F == 0x1F) {
3
    }
gibt es zumindest eine aussagekräftige Warnung.

Und: warum gehst Du eigentlich davon aus, dass `&` eine höhere Präzedenz 
hat als `==` ?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die aus heutiger Sicht unlogische Rangfolge hat historische Gründe. Hier 
ist die Erklärung vom Vater von C persönlich:

  https://www.lysator.liu.se/c/dmr-on-or.html

von Georg M. (g_m)


Lesenswert?

Wilhelm M. schrieb:
> Und: warum gehst Du eigentlich davon aus, dass `&` eine höhere Präzedenz
> hat als `==` ?

Aus dem gesunden Menschenverstand.

von (prx) A. K. (prx)


Lesenswert?

Georg M. schrieb:
> Aus dem gesunden Menschenverstand.

Errare humanum est. Und wenn eine unglückliche Wahl einmal zur 
Quasi-Standard wird, ist es zu spät. Wobei der Spruch früher länger war 
als heute. ;-)
"Irren ist menschlich, aber auf Irrtümern zu bestehen ist teuflisch."

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Georg M. schrieb:
> Wilhelm M. schrieb:
>> Und: warum gehst Du eigentlich davon aus, dass `&` eine höhere
>> Präzedenz hat als `==` ?
>
> Aus dem gesunden Menschenverstand.

Den gibts nicht bei C (und nicht nur da). Allerdings ist es wenigstens
komplett dokumentiert. Wer programmiert, ohne das Handbuch zu lesen,
der ist ohnehin schlecht beraten.

Es gibt schließlich auch Programmiersprachen, bei denen nicht mal
Punkt- vor Strichrechnung gilt. Z.B. APL oder SmallTalk.

von Andreas B. (bitverdreher)


Lesenswert?

Axel S. schrieb:
> Wer programmiert, ohne das Handbuch zu lesen,
> der ist ohnehin schlecht beraten.

Richtige Männer brauchen keine Handbücher.

von erklehr behr (Gast)


Lesenswert?

Andreas B. schrieb:
> Richtige Männer brauchen keine Handbücher.

Die schreiben nämlich grundsätzlich alle Ausdrücke so in
Klammern dass keine Missverständnisse aufkommen (können).
So einfach ist das.

Lothar M. schrieb:
> Das Beste daran: man muss dabei zum Glück gar nichts denken

von Yalu X. (yalu) (Moderator)


Lesenswert?

erklehr behr schrieb:
> Die schreiben nämlich grundsätzlich alle Ausdrücke so in
> Klammern dass keine Missverständnisse aufkommen (können).

Am besten verwendet man doppelte Klammern, damit sie auch ganz sicher
nicht übersehen werden:
1
((x=((((((a*b))-c))+1))));

;-)

von Sebastian (Gast)


Lesenswert?

erklehr behr schrieb:
> Andreas B. schrieb:
>
>> Richtige Männer brauchen keine Handbücher.
>
> Die schreiben nämlich grundsätzlich alle Ausdrücke so in
> Klammern dass keine Missverständnisse aufkommen (können).

Richtige Männer brauchen keine überflüssigen Verzierungen wie Klammern.

LG, Sebastian

von Εrnst B. (ernst)


Lesenswert?

Zuviel Klammern können auch schaden:
1
if ((a=b) && (b==c)) {
2
//    ^
3
//    Tippfehler
4
// vs.
5
if (a=b && b==c) {


Ohne die Zusatz-Klammern warnt der Compiler, dass an der Stelle 
eventuell keine Zuweisung gemeint sein könnte.
>>> warning: suggest parentheses around assignment used as truth value

Mit den Extra-Klammern unterdrückt man die Warnung.

von Wilhelm M. (wimalopaan)


Lesenswert?

Εrnst B. schrieb:
> Zuviel Klammern können auch schaden:
>
>
1
> if ((a=b) && (b==c)) {
2
> //    ^
3
> //    Tippfehler
4
> // vs.
5
> if (a=b && b==c) {
6
>

Da hilft vor allem, die (möglichst alle) lokalen Variable 'const' zu 
deklarieren.

von M.A. S. (mse2)


Lesenswert?

HildeK schrieb:
> SCNR: lieber zwei Klammern zu viel als zwei zu wenig.
> Mit nur einer Klammer bekommst du eine Fehlermeldung ... 😀
:)

Der Professor führt eine Rechnung an der Tafel aus und stellt irgendwann 
fest: 'Mist, Vorzeichenfehler'. Er geht die Zeilen rückwärts noch einmal 
durch, finden einen Fehler, korrigiert ihn und sagt: 'So, 
'Vorzeichenfehler beseitigt.'
Anmerkung eines Studenten: 'Die Zahl der Vorzeichenfehler ist nunmehr 
gerade.'

: Bearbeitet durch User
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.