Hallo,
der generelle Unterschied ist ++quark ist der PRÄinkrement Operator und
quark++ der POSTinkrement Operator d.h. beim präinkrement wird die
variable ERST erhöht und dann gelesen, beim postinkrement operator wird
die variable erst gelesen und dann erhöht.
Beispiel:
quark = 5;
x = ++quark;
nach der Anweisung:
x = 6 und quark =6
/*
entspricht
quark=quark+1;
x=quark;
*/
quark =5;
x = quark++;
/*
entspricht
x=quark;
quark=quark+1;
*/
nach der Anweisung:
x = 5 und quark =6
Hoffe dir ist damit geholfen.
mfg
chrisigleich
> ++quark braucht n paar Register weniger, ist daher schneller.
In C? Bei einem optimierenden Compiler? Nein, das wäre mir neu.
In C++ dagegen kann dank Operatorüberladung ++i tatsächlich um
Größenordnungen schneller sein als i++, wenn man in beiden Fällen den
Rückgabewert nicht beachtet.
Daher sollte man sich in C++ z.B. auch angewöhnen, den dritten
Parameter einer üblichen for-schleife als ++i zu schreiben; wobei ++i
bei einer for-schleife selbstverständlich auch in C semantisch viel
sinnvoller als i++ ist, aber das nur nebenbei.
> In C++ dagegen kann dank Operatorüberladung ++i tatsächlich um> Größenordnungen schneller sein als i++, wenn man in beiden Fällen> den Rückgabewert nicht beachtet.
Es kann im Prinzip auch um Größenordnungen langsamer sein. Hängt halt
ganz davon ab, wie die beiden definiert werden und ob inlining
vorgenommen wird. Meistens ist der Unterschied gering bis nicht
vorhanden. In der Regel wird in C++ der Präfix-Operator bevorzugt, wenn
man den Rückgabewert nicht nutzt, weil er für Klassen üblicherweise
nicht langsamer, manchmal aber einen Tick schneller als der andere ist.
Da man in C den Operator nicht überladen kann, ist die Wahl hier
ziemlich egal. Es wird wohl meistens der Postinkrement-Operator
verwendet, wobei ich hier keinen Grund kenne.
> Es wird wohl meistens der Postinkrement-Operator> verwendet, wobei ich hier keinen Grund kenne.
Dürfte historische Gründe haben. Wenn p ein Zeiger ist, dann konnte
die PDP-11 die Ausdrücke *p++ und *--p direkt in der Maschine als
Adressierungsart abbilden (*). Das dürfte auch der Grund gewesen
sein, warum K&R diese Operatoren überhaupt in C aufgenommen haben,
wobei sie natürlich die jeweils entgegengesetzten aus Symmetriegründen
auch mit aufgenommen haben.
(*) Die PDP-11 hatte überhaupt die saubersten Addressierungen aller
Maschinen, die ich bislang gesehen habe. Der PC war r7, sodass das
Lesen der Opcodes auch nur eine Variante von *p++ ist, der
Stackpointer r6, ein PUSH entsprechend *--p, ein POP *p++.
> Dürfte historische Gründe haben. Wenn p ein Zeiger ist, dann> konnte die PDP-11 die Ausdrücke *p++ und *--p direkt in der> Maschine als Adressierungsart abbilden (*).
Das kann der AVR auch ;-)
> Das dürfte auch der Grund gewesen sein, warum K&R diese Operatoren> überhaupt in C aufgenommen haben, wobei sie natürlich die jeweils> entgegengesetzten aus Symmetriegründen auch mit aufgenommen haben.
Allerdings scheint mir auch x-- verbreiteter als --x.
> Das kann der AVR auch ;-)
Na klar. Als der Operator erfunden wurde, konnten Compiler
aber noch nicht so viel optimieren wie heute. Daher ja
auch das register-Schlüsselwort, das ein Hinweis an den
Compiler war. Genauso war eben die Verwendung von *p++
ein Hinweis, heute ist es egal, ob man stattdessen *p und
p++ separat schreibt.
Eine PDP-11 war speichermäßig (je nach Ausbau) sowas wie wir
als ATmega128 mit 64 KB RAM vielleicht heute besitzen, nur
eben eine Größenordnung (oder mehr?) langsamer. ;-)
> Allerdings scheint mir auch x-- verbreiteter als --x.
Bei reiner Arithmetik ist es ja auch egal, der Vorteil des
Addressierungsmodes kommt ja nur bei *--p zum Tragen.
"Es wird wohl meistens der Postinkrement-Operator
verwendet, wobei ich hier keinen Grund kenne."
Ich denke das liegt daran:
x = x + 1;
ist das gleiche wie
x += 1;
ist (mehr oder weniger) das gleiche wie:
x++;
Es ist einfach die logische Vereinfachung.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang