[C] Knobelspielchen

  • Ersteller Ersteller latita
  • Erstellt am Erstellt am
L

latita

Gast
Hi Leutchen,

ich hab mal für ein ein Knobelspielchen, die ich allerdings nicht mehr so lustig finde, weil ich da nicht so ganz durchsehe.
Ich frage mich (außer, dass ich es ja ausprobieren kann) was diese Anweisungsfolgen ausgeben. Es bringt mir nichts, das in den Rechner zu tippen, sondern ich möchte es gerne auf dem Papier verfolgen können:

Code:
unsigned x=6, y=7, z=4;
x+=(y?(z>>=x):y);
printf("\n%d%d%d", x,y,z);

Erst mal, was gibt es aus :) und wenn ihr es richtig habt, dann evtl. ne Erklärung, das wär cool.
 
Der ? : Operator ist mieser Programmierstil.

x ? y : z bedeutet, wenn x wahr ist dann mache y, ansonsten z

Besser zu verstehen ist deshalb immer das hier:
Code:
if( x == True )
   y;
else
   z;
Das beutet genau das gleiche ist aber tausendmal lesbarer.
Der Compiler macht in beiden Fällen den gleichen Code daraus.

In deinem Beispiel also:
Code:
unsigned x=6, y=7, z=4;
if( y )
{
   z >>= x;  // entspricht z = z / x (also 4/6)
   x += z;
}
else
{
   x+= y;
}
printf("\n%d, %d, %d", x,y,z);
Die Ausgabe sollte somit "6, 7, 0" sein.
 
*beifall*

ja du hast ganz recht

dass mit dem if und else hatte ich mir schon gedacht, besser, hatte es mir mal aufgeschrieben.
Unser Programmieren-Prof macht sowas gerne in seiner Klausur, weil (ich zumindest) da richtig nachdenken muss und durcheinander komme.

Das richtige Problem lag hierbei für mich an z>>=x. Da wusste ich absolut nicht, was das bedeuten soll.

Vielen Dank, ich glaub ich habs jetzt gut kapiert. Werds mir in der Prüfung dann auch so aufschreiben.

STOPP:

mal noch ein Beispiel
Code:
void main()
{
	unsigned x=3, y=1, z=8;
	x+=(y?(z>>=x):y++);
	printf("\n%d %d %d", x,y,z);
}

hab mir das mal anders aufgeschrieben (auf papier aber):
Code:
if(y)
{
     z= z/x;
     x+=z;
}
else
    x+=y++;

da würde meiner Meinung nach 512 rauskommen... der rechner sagt aber 411 :freak:

anscheinend gibt es einen unterschied zu z>>x und z=z/x :(
 
Zuletzt bearbeitet:
Mist.
Wusste ich doch, dass ich da was falsch gemacht habe.

z >>= x entspricht nicht z = z/x, sondern z = z/(2^x), also "durch 2 hoch x".

In deinem ersten Beispiel machte das keinen Unterschied, weil 4/6 ist mit Integerzahlen gerechnet 0 und 4/(2^6), also 4/64 ist erst recht 0.

Im zweiten Beispiel rechnen wir als z = z/(2^x), also z = 8/(2^3) = 8/8 = 1
Die Ausgabe ist somit tatsächlich 4, 1, 1.
 
*erleuchtung*

vielen Dank, dass du so schnell noch mal geguckt hast.
Gibt es eigentlich irgendwo eine Aufstellung darüber, was z.B. ">>=" bedeutet?
Wer weiß, was sich mein Prof. noch so ausdenken kann
 
Suche im Netz nach möglichen "Operatoren" für C und C++.
Du wirst dann sehen dass >>= nur eine Kurzform ist.

x = x >> 2;
x >>= 2;
bedeuten dasselbe.

Der >> Operator ist ein Bitshift nach rechts um die angegebene Zahl Bits.
Ein Bitshift Rechts ist das selbe wie eine Division.
Ein Bitshift Links << ist eine Multiplikation.
 
aaah,

bin mal auf die Idee gekommen, in meine schlaues Buch zu gucken, und jetzt versteh ich sogar wieso:
es ist eine Links- bzw. Rechtsverschiebung von binären Zahlen und deswegen multipliziert/dividiert man 2^irgendwas ...

vielen Dank noch mal
 
Zurück
Oben