Wie mache ich in IJVM eine if verzweigung?

berserkerdq2

Bekanntes Mitglied
Hi, löse gerade eine Aufgabe mit IJVM. Hatte zunächst Probleme erst zu kapieren, wie da ohne lokale Variablen arbeiten kann. Das hat sich eigentlich geklärt.

Jetzt ist mir aufgefallen, dass ich eine if-else Verzweigung benötige.

Wie geht das in IJVM?

Wenn ich z. B. zwei lokale Variablen habe, wie kann ich diese bei einer if verzweigung nutzen.

z. B. eine lokale Variable a, die 1 ist und eine lokale Variable b die 2 ist.

Wie kann ich jetzt sagen

if(a<b){
...}
else ...

wie übersetze ich das in IJVM? Das ich dann was im if block und was im else block habe?
 
ich würde so sagen
Ähnlich wie Assembler nur halt mit dem Stack

Java:
BIPUSH 5 ; stack: 5
BIPUSH 5 ; stack: 5, 5
IF_ICMPEQ meineMethode   ; if 5 == 5
...



: meineMethode

Java:
BIPUSH 5 ; stack: 5
BIPUSH 5 ; stack: 5, 5
IFLT   else:
...
Goto: weiter
else:
...
weiter:  ; weiter im programm
 
Zuletzt bearbeitet:
Du fragst ja jetzt hier anscheinend jede einzelne Kleinigkeit, um deine Gesamtaufgabe lösen zu können.
Bist du sicher, dass du nicht irgendwie/irgendwo Informationsmaterial bekommen hast oder finden kannst, die dir helfen, die gestellte Aufgabe auch alleine zu lösen?
 
Du fragst ja jetzt hier anscheinend jede einzelne Kleinigkeit, um deine Gesamtaufgabe lösen zu können.
Bist du sicher, dass du nicht irgendwie/irgendwo Informationsmaterial bekommen hast oder finden kannst, die dir helfen, die gestellte Aufgabe auch alleine zu lösen?
Nein die Sache ist, wir haben gelernt, wie man addiert und das ist auch als Beispiel vorgegeben. Haben 6 Aufgaben gemacht, wo man auch nur addierren bzw. subtrahieren bzw. multiplizieren bzw. dividieren musste. Das ist auch nur eine freiwillige Aufgabe, also nicht verpflichtend. Aber wollte nur aus Interesse sehen, wie das geht.

Da wir nur die Rechenoperation, die ich oben genannt habe, genutzt haben, hatten wir keine if-verzweigung, habe mich das deshalb eben nur gefragt.
 
Bei sowas würde ich dann einfach einmal in Google suchen, ob man nicht eine Beschreibung finden kann, bei der die IJVM Befehle erläutert werden ...

Dann findet man ggf sowas: http://vu-programming.gitlab.io/pad/website/manual/controlling_the_flow.html

Da kann man dann jetzt schauen, was für Bedingungen man prüfen kann. Und dann kannst Du überlegen, was Du ggf. rechnen kannst, um dann den gewünschten Sprung zu machen.
 
Bei sowas würde ich dann einfach einmal in Google suchen, ob man nicht eine Beschreibung finden kann, bei der die IJVM Befehle erläutert werden ...

Dann findet man ggf sowas: http://vu-programming.gitlab.io/pad/website/manual/controlling_the_flow.html

Da kann man dann jetzt schauen, was für Bedingungen man prüfen kann. Und dann kannst Du überlegen, was Du ggf. rechnen kannst, um dann den gewünschten Sprung zu machen.
AHHH ich kann sagen z. B. minus machen und sagen ist das nun kleiner 0 dann ...

Aber wie funktioniert das, dass man da einen if else block hat?

Ich habe z. b.
IF_ICMPEQ mach...
das ist der if block hier, aber wie komme ich dann zu else rein?
 
AHHH ich kann sagen z. B. minus machen und sagen ist das nun kleiner 0 dann ...

Aber wie funktioniert das, dass man da einen if else block hat?

Ich habe z. b.
IF_ICMPEQ mach...
das ist der if block hier, aber wie komme ich dann zu else rein?
Tipp GOTO

Gegenteil erfragen wenn es erfüllt ist einer Marke springen (else)
Wenn war dann geht jetzt der If zweig los
Am ende vom if mit GOTO um Ende der IF Else springen .

Tipp schaue dir Assembler an. Wie da ein if else geht
 
Zuletzt bearbeitet:
Dein if macht ja ein Branch, d.h. er springt zu einem Label. Wenn dies aber nicht gemacht wurde, dann geht es ganz normal weiter.

Du kannst also etwas aufbauen wie:
if (bedingung) {
// xyz
} else {
// abc
}

Übersetzen zu:
- Berechnung für Bedingung.
- IF BRANCH zu Label1
- // abc
- GOTO LabelEnde
Label1:
- // xyz
LabelEnde:
 
Dein if macht ja ein Branch, d.h. er springt zu einem Label. Wenn dies aber nicht gemacht wurde, dann geht es ganz normal weiter.

Du kannst also etwas aufbauen wie:
if (bedingung) {
// xyz
} else {
// abc
}

Übersetzen zu:
- Berechnung für Bedingung.
- IF BRANCH zu Label1
- // abc
- GOTO LabelEnde
Label1:
- // xyz
LabelEnde:
Danke und wozu ist dieses GoTo LabelEnde am Ende? Warum muss man das noch machen? Damit man aus der if-else verzweigung rasu ist oder wozu genau?
 
Das habe ich da auch gesehen man macht IF_ICMPEQ Methodenaufruf und dann geht er z. B. zur Methode.
Das ist ein falsches Verständnis! Das ist kein Methodenaufruf sondern ein bedingter Sprung hin ... da kommt kein Sprung zurück.

Was nach dem IF_ICMPEQ kommt ist also dschon der "else Bereich".

Danke und wozu ist dieses GoTo LabelEnde am Ende? Warum muss man das noch machen? Damit man aus der if-else verzweigung rasu ist oder wozu genau?
Wenn du das nicht hast, was passiert denn dann im "else" Fall?
 
Das ist ein falsches Verständnis! Das ist kein Methodenaufruf sondern ein bedingter Sprung hin ... da kommt kein Sprung zurück.

Was nach dem IF_ICMPEQ kommt ist also dschon der "else Bereich".


Wenn du das nicht hast, was passiert denn dann im "else" Fall?
Ich dachte im else fall werden dann die Befehle dort ausgeführt? Wozu dann goto?

(Zudem, diese Labels zählen aber nicht als lokale Variablen oder?)
 
Ich dachte im else fall werden dann die Befehle dort ausgeführt?
Nun nimm aber das LebelEnde und damit auch das Goto LabelEnde raus. Was führt er dann alles aus im Falle, dass er nicht beim if springt?

Also ganz anschaulich:

Statt:
- Berechnung für Bedingung.
- IF BRANCH zu Label1
- // abc
- GOTO LabelEnde
Label1:
- // xyz
LabelEnde:

willst Du nur dies haben:
- Berechnung für Bedingung.
- IF BRANCH zu Label1
- // abc
Label1:
- // xyz

Was wird nun alles gemach wenn er bei dem IF nicht zu Label1 springt?
 
Nun nimm aber das LebelEnde und damit auch das Goto LabelEnde raus. Was führt er dann alles aus im Falle, dass er nicht beim if springt?

Also ganz anschaulich:

Statt:
- Berechnung für Bedingung.
- IF BRANCH zu Label1
- // abc
- GOTO LabelEnde
Label1:
- // xyz
LabelEnde:

willst Du nur dies haben:
- Berechnung für Bedingung.
- IF BRANCH zu Label1
- // abc
Label1:
- // xyz

Was wird nun alles gemach wenn er bei dem IF nicht zu Label1 springt?
Naja, er würde alles ausführen was beim else ist, also das abc oder?

JEDOCH: würden die befehle nach dem Elseblock nicht ausgeführt oder? Deshalb dieses Goto LabelEnde??
ALso man kann es sich so vorstellen

IF Geh Label 1
//abc (hier ist der Elseteil)
GOTO LabelEnde

Label1:
//xyz (wenn if true)

LabelEnde:
(Hier geht es nach dem if-else-block weiter?
 
Spiel es doch in Gedanken durch! Ohne das würde er doch auch ohne den Sprung beim IF direkt bei den Befehlen sein, die nur ausgeführt werden sollen, wenn die Bedingung erfüllt wurde.

Stell es Dir vor wie ein Brettspiel. Deine Figur geht von Feld zu Feld. Und bei jedem Feld steht eine Aufgabe.

So ein Sprung ist dann einfach ein "Gehe zu dem Feld mit Nr. x" oder von mir aus als "Rücke so und so viele Felder vor".
 
Malen wir es einfach einmal auf mit den Feldern:
1: Berechne etwas
2: Wenn Ergebnis kleiner 0 dann gehe zu Feld 3
3: Mache etwas tolles

Also nach Feld 2 kommt er direkt zu Feld .... das ist doof ... Also mit dem Überspringen:

1: Berechne etwas
2: Wenn Ergebnis kleiner 0 dann gehe zu Feld 4
3: Gehe zu Feld 5
4: Mache etwas tolles
5: ...

Jetzt mit diesem Überspringen wird das tolle nur gemacht, wenn Du in 2 den Sprung hast machen dürfen.

Edit: Er hatte versehentlich zu früh abgeschickt, als ich noch nicht fertig war ...
 
beim if wird immer das letzte auf dem Stack gePopt und danach wird entschieden Sprung oder nicht.

Deine 2 ist dann weg

IFLTlabel namePop word from stack and branch if it is less than zero
 
Zuletzt bearbeitet:
beim if wir immer das letzte auf dem Stack gePopt und danach wir entscheiden Sprung oder nicht.

Deine 2 ist dann weg

IFLTlabel namePop word from stack and branch if it is less than zero
Habe leider meine Frage gelöscht, weil ich dachte bei einer beantworteten Frage darf man nichts mehr fragen. Habe versucht in etwa das zu schreiben, was ich vorher gefragtr habe.

Aber habe vergessen was da genau stand.

Wenn ich also 1und 2 im Stack habe und dann IFLT nutze dann bleibt die 2, aber die 1 geht oder?
 
Die If-verzweigung verändert aber nicht die Stackwerte oder? Wenn ich z. B. habe im Stack 1,2 (also den Wert 1 und 2) und ich mache dann IF_ICMPEQ gehezulabel

dann ist es immer noch so, egal ob das wahr wird oder nicht, im Stack bleibt 1 und 2 oder?
Hast du dir den Link von @KonradN denn überhaupt mal angesehen?
Dort steht unter 3.1 was IF_ICMPEQ macht:
Pop two words from stack and branch if they are equal
Und falls du nicht weißt was POP macht wird das dort unter 2.1 erklärt:
POP. Remove one element from the stack, and return it.
 

Zurück
Oben