Entwickler-Ecke

Off Topic - C++: Reihenfolge von operatoren


Aya - Di 01.02.11 00:29
Titel: C++: Reihenfolge von operatoren
Hi,

ich habe hier diese zeile code in der generierung eines MD5 Hashes:


Quelltext
1:
x & y | ~x & z                    


Der funktioniert wunderbar, allerdings habe ich beim compilieren immer ne Warning:


Quelltext
1:
warning: suggest parentheses around arithmetic in operand of '|'                    


Die würd ich gern wegbekommen und eben klammern setzen. Nur.. wie? :)
Also wie ist ohne klammern die ausführ-reihenfolge?

Klar könnte ich die warning einfach ignorieren oder abschalten.. aber na ja..

Danke,
Aya


BenBE - Di 01.02.11 00:43

Schauen wir doch einfach mal in's RFC [http://www.faqs.org/rfcs/rfc1321.html]:


Quelltext
1:
2:
3:
4:
F(X,Y,Z) = XY v not(X) Z
G(X,Y,Z) = XZ v Y not(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X v not(Z))


Zu finden unter 3.4. Auch den Absatz unter dem Block lesen. HTH.


Martok - Di 01.02.11 09:27

Schauen wir mal in die Wikipedia [http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence] ;)

~ vor & vor |, sollte also


Quelltext
1:
(x & y) | ((~x) & z)                    

sein, wenn mans völlig übertreibt. Dabei ist natürlich mindestens die an der Negation überflüssig.

Warum sich der Compiler da meldet ist mir aber nicht wirklich klar... ist doch wirklich eindeutig?

EDIT: binäres und logisches NOT verwechselt.


Greenberet - Di 01.02.11 09:57

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Schauen wir mal in die Wikipedia [http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence] ;)

! vor & vor |, sollte also


Quelltext
1:
(x & y) | ((~x) & z)                    

sein, wenn mans völlig übertreibt. Dabei ist natürlich mindestens die an der Negation überflüssig.

Warum sich der Compiler da meldet ist mir aber nicht wirklich klar... ist doch wirklich eindeutig?


Der Compiler meldet sich weil es dadurch lesbarer wird.
Sicher ist den meisten Klar wie die Berechnung funktioniert. Wenn man allerdings längere Ausdrücke bzw mehrere hat und irgendwo ein kleiner Fehler ist, dann tut man sich mit Klammern um einiges leichter =)


Aya - Di 01.02.11 20:48

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Schauen wir mal in die Wikipedia [http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence] ;)

Danke :)

seh ich das dann richtig das wenn ich dashier klammern möchte:


Quelltext
1:
0x80000000 + (i - 32) << 23                    


es so richtig ist:


Quelltext
1:
(0x80000000 + (i - 32)) << 23                    


Wenn ich die tabelle bei Wikipedia richtig deute kommt + vor << richtig?

Danke,
Aya~


BenBE - Di 01.02.11 22:10

Richtig.