Operatorrangfolge

Gast #7054600
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...
Gast #7054619
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) ...
Gast #7054632
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 :-)
Gast #7054673
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.
#7055007
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 `==` ?
#7055120
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.
Gast #7055195
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
#7055246
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.
#7055309
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.'

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren