Frage zu Operatoren / Vorrang

D

David Nienhaus

Gast
Hallo liebe Leute,

ich bin gerade dabei C zu lernen.
Kann mir jemand helfen beim Entschlüsseln folgendes Codes?

Code:
int i=1, j=2;
i *= --i*j++>0 ? i++ : j--;
i = (j++,--j);
i-=--i;

Die erste Zeile macht mir schon Probleme.
Ich verstehe Sie so:
Es wird i = i*(entweder i oder j, je nach dem ob vorheriger Ausdruck größer oder kleiner 0 ist, gesetzt) danach wird dann jeweils entweder i oder j ( je nach dem) inkrementiert.
 

Robat

Top Contributor
Das heimtückische hier sind eigentlich die pre - und post-inkrement / dekrement Operatoren ++ und --.
Java:
i = x--; // hier wird erst der Wert x in i geschrieben und dann x hochgezählt
i = --x; // hier wird erst x hochgezählt und dann in i geschrieben

Die erste Zeile lässt sich wie folgt verstehen:
1) --i setzt den Wert von i auf 0 (1-1 = 0)
2) i * j = 0 * 2 = 0 , daher ist die Bedingung i > 0 nicht erfüllt
3) es wird erst der Wert von j mit i multipliziert und in i geschrieben (also i = 0 * j => 0), und danach j-- ausgeführt (also j um 1 verringert)

Den Rest kannst du ja nochmal alleine versuchen :)
 
D

David Nienhaus

Gast
Ich habe noch eine Frage:

int a=1, b=2;
a |= b;

Wie habe ich das |= zu verstehen?
Ich würde es so interpretieren:
a = a|b;
Das macht allerdings in meinen Augen nicht so viel Sinn.
Heraus kommt 3... es scheint also so als würde es bedeutet a= a+b, aber warum?
 

Robat

Top Contributor
Also du hast richtig erkannt, dass a |= b das gleiche ist wie a = a | b.
Der |-Operator ist die binäre OR-Verknüpfung. Du musst die beiden Zahlen 1 und 2 also binär OR-Verknüpfen um auf das Ergebnis zu kommen.
Code:
Wahrheitstabelle OR
x1 x2 y
0  0  0
0  1  1
1  0  1
1  1  1

-> Ergebnis ist nur 1, wenn genau einer der beiden Eingänge 1 ist

demnach 1 | 2 = 3

1(dez) = 0001 (binär)
2(dez) = 0010 (binär)
3(dez) = 0011 (binär)

  0001
| 0010
-------
  0011
 
D

David Nienhaus

Gast
Ahh, geil! Habs verstanden :)
Ist ja garnicht so schwer, wenn man es erstmal weiß. :D
Danke euch!
 
D

David Nienhaus

Gast
Hmm, jetzt bin ich verwirrt!

Ich bin jetzt davon ausgegangen, dass für folgenden Ausdruck gleiches Vorgehen zum Ziel führt:

C:
int a=1, b=2;
c = a && b;

Beide müssen gelten, also:

0001
0010
____
0000

-> c = 0

Heraus kommt allerdings 1. :confused:
 

Robat

Top Contributor
&& ist das logische UND (nimmt man für boolsche Ausdrücke) .. & ist das binäre UND ;)
Genauso ist || das logische ODER .. | ist das binäre ODER
 
D

David Nienhaus

Gast
Ahh! Heißt das, da weder a noch b = 0(falsch) sind, kommt 1(wahr) heraus?
Oder hab ich noch einen Denkfehler? :D
 

Robat

Top Contributor
Ja. Beide Werte sind ungleich 0 (was in C true ist), daher steht da true && true, was true (also 1) ergibt.
Wobei ich mir nicht sicher bin ob irgendwo definiert ist, dass da immer 1 rauskommt oder doch nur eine Zahl ungleich 0.
 
D

David Nienhaus

Gast
Cool, danke :)

Nochmal zu der Zweiten zeile von dem ersten Post:

i = (j++,--j);

Ich habe ein bisschen rumprobiert und es scheint so, als würde der erste Teil der Klammer immer komplett ignoriert werden, liege ich da richtig?
 

Robat

Top Contributor
Prinzipiell sollten beide Ausdrücke in der Klammer ausgeführt werden. Zugewiesen wird aber nur der letzte Ausdruck.
Der Grund warum da 2 rauskommt ist ja, weil erst j++ ausgeführt wird (danach ist j 3) und dann --j .. demnach ist i dann 3 - 1, also 2
 
D

David Nienhaus

Gast
Ach so, dann hab ich mich wohl vertan. Vielen Dank nochmal, ich glaube das wars dann erstmal :D
 

Ähnliche Java Themen

Neue Themen


Oben