Wie funktioniert diese For Schleife?

4 Antworten

Die Variable k existiert nur in ihrem Kontext. Über den Screenshot ist nicht ersichtlich, in welchem Kontext sie sich genau befindet. Ob innerhalb einer anderen Kontrollstruktur oder auf oberster Ebene der Methode.

Die Schleife läuft nur solange ich.IstWand unwahr ist.

Den Zähler könntest du je Durchlauf gleich um 2 erhöhen, um dir die eine Inkrementation im Rumpf sparen zu können.

for (/* ... */; i += 2)

Das if ist ohne Sinn, denn i hat immer denselben Wert wie i. Das heißt, deine Schleife könnte sogar in Dreierschritten für i laufen.

Das dürfte nicht passieren. Sicher, dass k, nachdem die for Schleife durchlaufen wurde, 0 ist? Bzw. ist sichergestellt, dass die for Schleife überhaupt durchlaufen wird?


HerrKelv 
Fragesteller
 02.02.2020, 17:13

Ich hab jetzt nach der for schleife eine sysout hinzugefügt und es gibt "9" aus, also den richtigen Wert. Aber trotzdem wird int k ab genutzt, als wäre int k = 0

0
EllenBeuge  02.02.2020, 17:14

Magst du mir einmal sagen, was für ein Programm du da nutzt? Ich vermute das Ganze ist im Kontext irgendeines Informatik Kurses an einer Schule?

0
HerrKelv 
Fragesteller
 02.02.2020, 17:16
@EllenBeuge

BlueJ und ja für die Schule. Ist eine Robotkarol Version für bluej

0
HerrKelv 
Fragesteller
 02.02.2020, 17:23
@EllenBeuge

Ich habe ein Bild vom vollen Code oben in die Frage hinzugefügt

0
HerrKelv 
Fragesteller
 02.02.2020, 17:26
@EllenBeuge

Ich habe die for schleife jetzt durch eine while schleife ausgetauscht und es macht was ich will. Danke für die Hilfe

0

Ohne den Rückgabewert von ich.IstWand() zu kennen, kann man nicht sagen, ob die Schleife überhaupt durchlaufen wird.

Ist dir auch bewusst, dass du in der Schleife die Variable i dreimal inkrementierst?

Und dass der Vergleich i == i++ völlig sinnlos ist, da diese Bedingung immer erfüllt ist?

Ziemlich klar. K wird kein einziges Mal aufgerufen.

Du sagst es ja selbst:

if(i == i++)

Bedeutet:

i = 0
if(0 == 0+1) 

EllenBeuge  02.02.2020, 17:17

Falsch. Dein Argument wäre für ++i richtig, aber nicht für i++. Im Fall von i++ wird i zurückgegeben und danach inkrementiert.

1
skiddy  02.02.2020, 17:23
@EllenBeuge

Mein Beispiel ist richtig. Es ist vollkommen egal ob es erst danach inkrementiert wird. Was du hier vergleichst ist, ob i das gleiche ist wie i+1. Und i ist eben nicht das gleiche i+1

Geh mal in einen Online Editor und mach das nach, du wirst sehen, dass es nicht funktionieren wird.

0
EllenBeuge  02.02.2020, 17:31
@skiddy

Habe nochmal genauer darüber nachgedacht. Tatsächlich ist das Ergebnis einfach nur undefiniert. Nehmen wir noch einmal if (i == i++) als Beispiel.

Wenn der Teil links vom == zuerst ausgewertet wird, ergibt der Ausdruck true.

Falls zuerst i++, also rechts vom == ausgewertet wird, ergibt der Ausdruck false.

Unterm Strich also Compiler bzw. Interpreter abhängig und natürlich sowieso etwas, das man in der Form nicht programmieren möchte.

1
regex9  02.02.2020, 17:18

Die Inkrementation findet erst nach dem Vergleich statt.

0
mondai  02.02.2020, 17:34
@regex9

Könnte man meinen, aber die Ausgabe ist ++I.
if(i == i++) cout << "I++";
if(i == ++i) cout << "++I";

Also nach diesem Muster: i=1; If(i == (i=2)) cout << "Wahr";
A= i, B=i++ Vergleich A≠B
A=++i, B=i  Vergleich A=B

0
regex9  02.02.2020, 18:03
@skiddy

Ich weiß. Deshalb beziehe ich mich auch auf Java (von Oracle), nicht C++. 😉

1
mondai  02.02.2020, 18:38
@regex9

Von diesem Verhalten war ich auch erstmal ausgegangen.
Unter GCC lief es nicht so ab, da wirken beide Schreibweisen verschieden.

//LC0:.ascii "I++\0"
//LC1:.ascii "++I\0"

 int i =1;
 if (i==i++)Out("I++");
/*
A=i
B=A
B++
i=B
i?A 2==1?LC0:L2
*/ if(i==++i)Out("++I");
/*@L2
A=i
A++
i=A
A=1
  Wahr->LC1:L3
*/ So in etwa die Uebersetzung dazu. Fall 2 wird nicht mal wirklich verglichen.

1