| 

.NET C# Java Javascript Exception

8
Ich habe in einem Java-Programm folgende Variablen gefunden: ++BildZaehler und BildZaehler++. Der ++-Operator wird der Variablen einmal voran- (Präfix) und einmal nachgestellt (Postfix). Was bedeutet das für die Variablen? Oder ist das Doppelplus Bestandteil des Namens und es handelt sich damit um zwei unterschiedliche Variablen?
16.11.2011
nonshatter 61 1 3
3 Antworten
7
Prefix- und Postfix-Operatoren
Wird der Befehl ++ bzw. -- vorangestellt, wird zuerst diese Operation ausgeführt, anschließend die andere Operation.

Wird der Befehl ++ bzw. -- nachgestellt, wird zuerst die andere Operation ausgeführt, anschließend das Inkrement bzw. Dekrement.


Ein noch besserer Link von der Insel:
Präfix- oder Postfix-Inkrement und -Dekrement
16.11.2011
Jürgen Luhr 7,1k 2 9
3
y = x++;
bedeutet
y = x;
x = x + 1;

y = ++x;
bedeutet
x = x + 1;
y = x;


Eingebürgert hat sich x++ OHNE irgendwelche Zuweisungen um lediglich x um 1 zu erhöhen. Andere Schreibweisen verwirren nur und sollte man unterlassen.
11.01.2012
oopexpert 455 1 8
Ich gehe da nicht ganz konform mit dir.

int i = 5;
int x = 5;

System.out.println(i++); // -> 5
System.out.println(++x); // -> 6

System.out.println(i); // -> 6
System.out.println(x); // -> 6

Es spielt schon ein Rolle wann wie welcher Wert hochgesetzt wird.
Gruß Karl
Karl 11.01.2012
Karl das mag stimmen, aber nichtsdestotrotz ist es eher selten der Fall, dass man sowohl inkrementiert als auch ausgibt (bzw. eine andere Aktion mit der Variablen ausführt) im gleichen Schritt. Entweder man will die "5" ausgeben, dann inkrementiert man erst danach, oder man will gleich die 6 ausgeben, dann inkrementiert man sofort (Gleiches gilt fürs dekrementieren)... es ist einfach übersichtlicher
Karill Endusa 11.01.2012
3
So wie oopexperts Nachsatz verstehe, möchte er ja genau vor solchen Verwendungen warnen. Also wenn, dann:
int i = 5;
i++;
System.out.println(i);
Xantiva 11.01.2012
Ja, genau das wollte ich nur noch mal hervorheben nachdem ich seine Aussage durchgelesen habe.
Karill Endusa 11.01.2012
1
Wieso sollte man das nicht so machen? Außerdem, wenn es so vorgesehen wäre, dann gebe es auch nur eine Variante. Denn der Unterschied liegt nur bei dem zurückgegebenen Wert. (siehe meine Antwort)
LiRo 11.01.2012
OK OK. Das ganz ist schon fast akademischer Natur.

Noch ein Beispiel:
for (i = 0; i++ < 10; )
{System.out.println(i);}

for (i = 0; ++i < 10; )
{System.out.println(i);}

Das sind beides gültige For-Schleifen. Unschön, ich mache das normaler Weise nicht so, aber hier geht es auch nicht darum ob etwas schön ist, sondern um den Unterscheidn zwischen Pre und Post Inkrement. Und der existiert auf jeden Fall.
Auch sowas gibt es:
int i = 0;
while(condition()){
Object o = getMyObject(i++);
}
Und auch hier macht es einen Unterschied, ob Pre oder Post ...
Karl 11.01.2012
Jop, das will ich doch auch sagen. Es kommt immer auf den zurückgegeben Wert an. Ansonsten sind sie gleich.
LiRo 11.01.2012
Also die while-schleife fänd ich persönlich schon übersichtlicher, wenn sie so wär:
int i = 0;
while(condition()){
Object o = getMyObject(i);
i++;
}
oder ebend entsprechend dem pre-inkrement... also wenn nicht beim methodenaufruf incrementiert wird (egal ob pre oder post), sondern entsprechend davor oder danach!
Karill Endusa 11.01.2012
@LiRo: Und auf den Zeitpunkt der Verwendung :)
@Karill: Ich gebe dir Recht.
Karl 11.01.2012
Wie Zeitpunkt? Du meinst Verwendungszweck? Der ergibt sich aus der Rückgabe.
LiRo 11.01.2012
ja, ich habe mich falsch ausgedrückt.
Karl 11.01.2012
2
Also im Pseudocode sieht das so aus:
// ++var
int preInc(int var)
{
// Inkrementieren und dann die Variable zurückgeben.
var = var + 1;
return var;
}

// var++
int postInc(int var)
{
// Inkrementieren und dann den _alten_ Variablenwert zurückgeben.
int ret = var;
var = var + 1;
return ret;
}
11.01.2012
LiRo 1,3k 1 9
Jetzt nicht hauen, aber ++var hat weniger Zeilen Code und dürfte schneller sein :)
Karl 11.01.2012
Jop, wobei auch ein var++ von (schlauen) Compilern in ++var optimiert wird :)
LiRo 11.01.2012
Ist das nicht kontextabhängig?
Karl 11.01.2012
ja, klar sofern's geht... natürlich
LiRo 12.01.2012

Stelle deine Java-Frage jetzt!