C++ Unterschied ++ und +1

DRQ

Lt. Junior Grade
Registriert
Okt. 2008
Beiträge
398
Guten Abend CB-Programmierer ;)
Vorne weg: Ich habe gegoogelt, die Forensuche genutzt und habe auch im Sammelthread für nützliche links durchgeklickt.
Ich habe seit einem Jahr das Fach "Informatik" in der Schule und habe gegen Ende des Jahres gänzlich den Faden verloren und muss mich in der Ferienzeit jetzt etwas darum kümmern, meine Schwächen darin aufzuholen. Ich habe hier meine Programme, die ich in der Schule gemacht habe, versteh diese aber mittlerweile selbst nicht mehr ganz und weiß auch gewisse Dinge nicht mehr.
Und zwar kenne ich den Unterschied zwischen "++" und "+1" nicht mehr. Wenn ich z.B. die Zeile "y=y+1" habe, wo ist da der Unterschied zwischen "y=y++"? Ich weiß, das "y=y++" dafür sorgt, das der Wert y ständig +1 addiert wird, ausser ich sorge für eine Unterbrechung. Aber was tut dann y=y+1? wird da y nur einmal +1 gerechnet?
Programmieren tu ich mit DevC++ ;)
Mit freundlichen Grüßen, DRQ
 
also entweder schreibst du y++; oder y=y+1; tut beides dasselbe, also die variable um 1 erhöhen.

lg vailor
 
Es reicht auch nur y++. Es ist einfach bequemer und schneller zu schreiben.
 
Hi,

also folgendes schreibt man wohl eher nie:
y = ++y;
Der Ausdruck erhöht y um 1. Genau so wie diese beiden:
y = y + 1;
++y;

Dann gibt es noch den Unterschied zwischen Pre- und Postinkrement zu beachten:
++y erhöht y und gibt den neuen Wert zurück (Pre-Inkrement):
Code:
y = 1;
x = ++y;
// x ist jetzt 2, y auch

y++ erhöht y, gibt aber den alten Wert zurück (Post-Inkrement):
Code:
y = 1;
x = y++;
// x ist weiterhin 1, y ist 2

Selbiges gilt für den -- Operator
 
Ahh, alles klar. Danke an alle hier. Ich denke mal, ich werde die Tage noch einige Fragen nachschieben ;)
 
Dann gibt es noch den Unterschied zwischen Pre- und Postinkrement zu beachten:
Oder um ein anderes Beispiel zu bemühen:
Du hast ne Funktion function(integer)
Dann bedeutet:
Code:
y = 1;
function(y++);
Die Funktion wird mit dem Wert 1 aufgerufen und nachdem die Funktion durchlaufen ist wird y auf 2 erhöht.

Code:
y = 1;
function(++y);
y wird auf 2 erhöht und dann die Funktion aufgerufen.


P.S.: Was auch geht: Statt "y=y+1" kannst du auch "y+=1" schreiben. Ebenfalls kürzer und nicht nur auf inkrementieren um 1 beschränkt. Also geht z.B. auch "y+=5"
was "y=y+5" entspräche.
 
Zuletzt bearbeitet:
es ist NICHT das gleiche
i = i + 1; ist eine Berechnung (genau wie i = i+17;)

i++ // i-- greift direkt auf den Befehlssatz des Prozessor zu zur Erhöhung der Variablen um 1 (ca um den Faktor 10 schneller als i=i+1;)

Kann natürlich sein, dass Compiler da eine unsaubere Programmierung wegoptimieren, rein vom Sprachstandard her ist es (wenn da nichts geändert wurde) NICHT das gleiche.
 
Woher hast du den Faktor 10?
 
@pizza4ever:
Wo steht bitte in der Sprachdefinition, wie ein C-Compiler die Inkrementierung durchführen muss? Muss ich irgendwie verpasst haben...
Und Prozessoren kennen Register... und jeder vernünftige Compiler macht bei so einer Anweisung mit +1 ein INC und kein ADD.

Und was hat das mit "unsauberer" Programmierung zu tun? oO

Aber ja, es ist nicht das gleiche, das stimmt schon.
man betrachte
f(i++);
f(i = i + 1); // f(++i);

Und das habt ihr wohl eher im Assembler-Umfeld als im C-Umfeld gemacht, wenn nicht...


Bei einer Schleife mit 5000000000 Durchläufen einmal mit i++ und einmal mit i = i + 1 sind es bei mir etwa 11,1 vs 12,2 Sekunden... das ist dann nicht wirklich der Faktor 10 sondern eher ein Zehntel... also Unterschied kann es schon machen, je nach dem auch wie der Compiler optimiert oder nicht.
 
Zuletzt bearbeitet:
pizza4ever schrieb:
es ist NICHT das gleiche
i = i + 1; ist eine Berechnung (genau wie i = i+17;)

i++ // i-- greift direkt auf den Befehlssatz des Prozessor zu zur Erhöhung der Variablen um 1 (ca um den Faktor 10 schneller als i=i+1;)

Kann natürlich sein, dass Compiler da eine unsaubere Programmierung wegoptimieren, rein vom Sprachstandard her ist es (wenn da nichts geändert wurde) NICHT das gleiche.

Das ist wohl eine der leichtesten Übungen für den Compiler das zu bereinigen. Das wird wohl auch jeder gängige machen. Ist aber trotzdem gut zu wissen dass da ein semantischer Unterschied besteht.

Und wenn x++ wirklich 10x schneller wäre als x+=1, könnte der Compiler ja aus x+=10 auch
Code:
x++
x++
x++
x++
x++
x++
x++
x++
x++
x++
machen :D

Ich glaube btw. dass jede Addition bei modernen Prozessoren mittlerweile in einem Taktzyklus ausgeführt werden kann. Daher dürfte es in der Praxis eigentlich absolut keinen Unterschied machen.
 
Naja, unsaubere Programmierung ist immer Definitionssache, bei einer Zählvariablen i = i+1 zu schreiben find ich unsauber. Dass Compiler viel wegoptimieren ist eh klar, bei i=i+1 ist es halt eben compilerabhängig was daraus gemacht wird, bei i++ nicht.

edit: und an den Kollegen vor mir: Was der Compiler daraus macht wissen wir idR eh nicht ;)
 
DRQ schrieb:
Programmieren tu ich mit DevC++ ;)

So weit ich weiß, ist das Abandonware (sau-alt, wird nicht mehr weiterentwickelt). Code Blocks and MS Visual C++ 2010 Express sind beide moderner und gratis.
 
Die obigen Werte traten im Übrigen auf bei dem Datentyp __int64 in VC++2010... mit Workrounds mit dem Datentyp int und gleichvielen Iterationen (verschachtelte Schleife) kommen nur noch so 9,1 Sekunden für beide raus... schenkt sich da nichts.

Und Optimierungen auf dem Niveau, sorry, die bringen nur in absoluten Ausnahmefällen was... viel mehr bringt es meist, den Algorithmus zu optimieren bzw. zu wechseln ...
 
es ging ja wohl eher um den unterschied add / inc als darum, was der compiler daraus macht. das hatte ich ja bereits im erstne post geschrieben.
 
@antred: Ich mach ein E-Tech-Fachabi ;) da hab ich 2 Stunden Info in der Woche, da dürfte DevC++ wohl reichen (das nutzen wir auch in der Schule und unser Lehrer sagte auch, dass das soweit reicht).
 
@pizza4ever: Nur dass deine Aussage, dass es nicht das selbe ist, zwar richtig, die Begründung aber falsch ist...

@DRQ: DevCPP kann man schon noch einsetzen, klar... für einfache Progrämmchen reicht das allemal.
 
pizza4ever schrieb:
i++ // i-- greift direkt auf den Befehlssatz des Prozessor zu zur Erhöhung der Variablen um 1 (ca um den Faktor 10 schneller als i=i+1;)

Das stimmt so nicht! Bei der Übersetzung in den Syntax Tree wird aus i++ einfach assign(i, plus(i, 1)) und damit genau die gleiche Addition wie bei i = i + 1. Die Optimierung auf inc/dec passiert erst beim Generieren vom Assembly Code, spezifisch für die Target ISA. Dass wirklich inc/dec verwendet wird ist aber auch keineswegs sicher. Der Compiler kann bei i++ ebenso eine normale Addition verwenden und tut es auch wenn es mehrere gleichwertige Möglichkeiten gibt oder es aus anderen Gründen sinnvoll ist.

inc/dec ist außerdem spezifisch für Intel. Andere CPUs kennen entsprechende Instructions gar nicht.

Wie du auf den Faktor 10 bei einer normalen Addition kommst solltest du aber mal erläutern..
 
Zuletzt bearbeitet:
Zurück
Oben