Komisch ist das nicht.
value >> 1 ;
Shiftet ebenfalls nur wird das Ergebnis nicht verwendet und so bereits
ohne Optimierung einfach weggelassen. In der CMa würde in etwa
1 | loada value
|
2 | load 1
|
3 | shiftr
|
4 | pop
|
generiert werden. Also der Wert von value und 1 in den Stack geladen.
Der Shift konsumiert beide und legt das Ergebnis des Shifts auf den
Stack ab. anschliessend (die Übersetzung des ;) wird ein Wert auf dem
Stack konsumiert.
Benutzt du value >> 1 in einer Zuweisung (result = value >> 1), dann
ändert sich etwas:
1 | loada value
|
2 | load 1
|
3 | shiftr
|
4 | storea result
|
5 | pop
|
Bevor der Stack nach dem Ausdruck aufgeräumt wird, wird er gespeichert.
Aber auch hier bleibt der Inhalt von value unverändert.
val += value >>1;
Erzeugt in etwa
1 | loada val
|
2 | loada value
|
3 | load 1
|
4 | shiftr
|
5 | add
|
6 | storea val
|
7 | pop
|
Es bleibt auch hier value unverändert. Das Zwischenergebnis des Shift
wird auf dem CMa-Stack aber sofort gemeinsam mit der Inhalt von val
konsumiert und die Summe auf dem Stack abgelegt, die dann in val
zurückgespeichert wird.
Anschliessend wird auch hier der CMa Stack wieder durch das ";"
aufgeräumt.