[Gelöst] i++

wenn ich folgenes schreibe:

var def_num, def;
while (def = GetDefinition(def_num++))


wird im ersten Durchlauf dann GetDefinition(0) oder GetDefinition(1) ausgeführt? Also wird def_num vorher, oder hinterher ausgeführt? (Ich nehme an, dass ++def_num und def_num++ dasselbe bedeutet, oder? )

Ich hab nämlich das Gefühl, dass GetDefinition(1) ausgeführt wird, wodurch ja die erste definition bei 0 ausgelassen werden würde, oder?

edit:
habe es mal mit def_num=-1 zu beginn ausgeführt, und das hat nichts gefunden, weshalb obige Frage wohl mit GetDefinition(0) zu beantworten ist.
Auf die Frage bin ich gekommen, weil
var idBase = DefinitionCall(idDef,"GetResearchBase"), fHasBase, j;
fHasBase = !idBase || GetPlrKnowledge(iPlr,idBase); j=1;
// Erweiterte Forschungsgrundlagen
while (idBase = DefinitionCall(idDef, Format("GetResearchBase%d", ++j)))
   if (!GetPlrKnowledge(iPlr,idBase)) fHasBase=0;

aus dem forschungslabor skript nichts bei GetReserchBase1() bewirkt hat… aber vllt wars auch ein anderer Fehler, ich teste nochmal…

Variablen werden implizit mit 0 initialisiert. Also var def_num; ist dasselbe wie var def_num = 0;.

>Ich nehme an, dass ++def_num und def_num++ dasselbe bedeutet, oder?


Nein! Der subtile Unterschied liegt im Rückgabewert: foo++ gibt den Wert von foo vor dem Erhöhen zurück, ++foo den Wert nach der Addition. In deinem Beispiel wird GetDefinition also tatsächlich mit den Werten 0, 1, 2, … aufgerufen. Mit ++def_num wäre es stattdessen 1, 2, 3, …

Diese Unterscheidung kommt aus C, wo es hauptsächlich praktisch ist, wenn man kompakten Code mit Pointern schreiben will. Viele neuere Sprachen unterstützen dieses Konstrukt nicht mehr, weil es einerseits durchaus verwirrend ist und zu subtilen Fehlern führen kann, und andererseits die Optimierer mittlerweile gut genug sind, solche Konstrukte auch zusammenzufassen, wenn sie über mehrere Zeilen geschrieben sind.

Edit: Mit der Erklärung oben kannst du auch das Problem in deinem "Edit" finden. Wenn du es nicht siehst, frag nochmal nach :)

aaah. gut dann ist das mein Fehler gewesen, dass ich dachte i++ und ++i wäre dasselbe!  Aus der Doku habe ich das nicht rauslesen können… =/  Aber gut zu wissen! :)  (man sollte bei der doku auch die dazugehörigen Erklärungen lesen, da stehts doch :smiley: )

Das heißt ja dann, bezüglich meines hinzueditierten Beispiels, dass dort dann tatsächlich mit j=2 angefangen wird? (weil j=1 zu beginn ist).
Das ist wie gesagt aus dem originalen Forschungslabor Skript.  Man muss also mit GetResearchbase2() anfangen, wenn man auf diese Weise mehr als eine Base zufügen will?

>Aus der Doku habe ich das nicht rauslesen können.


[Hier](http://clonk.de/docs/de/sdk/script/operatoren.html#opppmm) ist es beschrieben. Ist aber zugegebenermaßen etwas verwirrend durch die Verwendung der `Var()`-Funktion.

>Man muss also mit GetResearchbase2() anfangen, wenn man auf diese Weise mehr als eine Base zufügen will?


Sieht so aus. Macht auch ein bisschen Sinn, weil das erste ja einfach keine Zahl hintendran hat.