Unterschied ++i, i++ bei for-Schleife?
-
Hey Leute!
Welchen Unterschied gibt es von ++i bzw. i++ in for-Schleifen? Hier mal ein kleines Beispiel:
#include<stdio.h> int main() { int x=5, y=0; for(int i=0; i<10; i++) { printf("%i\n", i); } for(int i=0; i<10; ++i) { printf("%i\n", i); } return 0; }
Die beiden Schleifen geben trotz unterschiedlichem Inkrement die gleiche Zahlenfolge aus. Gibt es dann überhaupt einen Unterschied der beiden Inkrement-Möglichkeiten?
-
Wenn der Ausdruck nicht zugewiesen wird, spielt es keine Rolle.
Anders hier:int i=5; int j=i++; // j=5, i=6 j=++i; // j=i=7
Du kannst es dir also so vorstellen:
Postinkrement : holen und erhöhen,
Präinkrement : erhöhen und holen.
Und in Programmiersprachen, in denen der Operator bei benutzerdefinierten Typen überladen werden kann (C++), kann der Unterschied gravierend sein. Beim Postinkrement wird immer ein temporäres Objekt benötigt.
Aber bei for-Schleifen und eingebauten Typen sollte der Compiler identischen Code erzeugen.
-
Also, wenn ich den Grundtenor deiner Antwort richtig entnehme, dann ist es in einer for-Schleife EGAL, ob ich ++i oder i++ schreibe. Warum aber hat sich dann doch irgendwie i++ eingebürgert? In Code-Schnipsel, die ich ja mittlerweile doch recht häufig schon gelesen habe, hab ich meistens das Postinkrement gelesen...
Dass Pre- und Postinkrement bei Zuweisungen Unterschiede machen ist mir mittlerweile klar
Preinkrement ändert vorher die Variable um 1 und rechnet mit dem neuen Wert weiter, wo hingegen das Postinkrement erst mit dem "alten" Wert die Berechnung durchführt und nach der Zuweisung den "alten" Wert erst erhöht... Ist doch richtig so, oder?
-
Wie geschrieben, es sollte egal sein. Wirklich sicher kannst du dir aber nur sein, wenn du dir den Code, den dein Compiler generiert, anschaust.
Warum du das Postinkrement in so vielen for-Schleifen siehst, weiß ich nicht, ich persönlich verwende immer das Präinkrement.
Aber ansonsten sind deine Überlegungen natürlich richtig.
-
Warum aber hat sich dann doch irgendwie i++ eingebürgert?
Würde ich schon fast als schlechten Stil ansehen..
-
Die Frage ob i++ oder ++i in diesem Fall ist so relevant wie die Frage welche Einrückung sich warum durchgesetzt hat. Sie ruft allenfalls Missionare des "guten Stils" um ihre Weisheit kundzutun.
cooky451 schrieb:
Warum aber hat sich dann doch irgendwie i++ eingebürgert?
Würde ich schon fast als schlechten Stil ansehen..
qed
-
Tim schrieb:
qed
Dafür, dass es fast 10 Minuten nach meinem Post kam, fand ich's nicht mehr so beeindruckend.
-
Ich bin hier leider in einer temporalen Anomalie namens "Arbeit" gefangen
-
Die Prefix-Variante ist ein Hinweis für den Compiler zur Geschwindigkeitsoptimierung. (Der kann etwas diesbezüglich machen, kann es auch bleiben lassen). Bei der Prefix-Variante liegt der Wert anschließend eher im Cache für direkt nachfolgende Aktionen als bei Postfix. Interessanter/wirkungsvoller in C++ für nichttriviale Fälle, bei denen kein einfacher Typ vorliegt, sondern irgendwelche Objekte/Iteratoren, wo Prefix/Postfix normalerweise überschrieben ist.
-
Tim schrieb:
Ich bin hier leider in einer temporalen Anomalie namens "Arbeit" gefangen
Dann spare Zeit:
▄
-
Wutz schrieb:
Die Prefix-Variante ist ein Hinweis für den Compiler zur Geschwindigkeitsoptimierung. (Der kann etwas diesbezüglich machen, kann es auch bleiben lassen). Bei der Prefix-Variante liegt der Wert anschließend eher im Cache für direkt nachfolgende Aktionen als bei Postfix.
Wo hast du das denn her? Finde ich nicht plausibel.
-
Na wenn der Wert bei Prefix eher im Cache liegt, dann nehme ich erst recht postfix, da bleibt er dann gleich im Register liegen?
Und die C++-Argumentation ist hier einfach nur off-topic.
-
Ich schreibe auch
i++
. Meine Vermutung ist, dass Postfix bevorzugt wird, weil unserem Denken entspricht. Es heißt ja auch C++ und nicht ++C (auch wenn das wenig mit C zu tun hat). Außerdem schreiben wir immer im deutschen und im Englischen das Subjekt zuerst und erst danach, was damit passieren soll (auf "normale Sätze" bezogen). Z.B.: Stucts werden auch in der Form Parent.Children.Children geschreiben und nicht umgekehrt.
-
Rhombicosidodecahedron schrieb:
im deutschen und im Englischen das Subjekt zuerst und erst danach
Die Sprache schrieb:
{Entleere} [den Kasten] und {fülle} [ihn] dann wieder auf.
Hm..
-
cooky451 schrieb:
Rhombicosidodecahedron schrieb:
im deutschen und im Englischen das Subjekt zuerst und erst danach
Die Sprache schrieb:
{Entleere} [den Kasten] und {fülle} [ihn] dann wieder auf.
Hm..
Das sind keine Subjekte, sondern Objekte. Grundschulstoff!
-
Tim schrieb:
Ich bin hier leider in einer temporalen Anomalie namens "Arbeit" gefangen
für den einen ist es eine anomalie, für den anderen gehört sie zum leben.
*scnr*
-
Bashar schrieb:
Das sind keine Subjekte, sondern Objekte. Grundschulstoff!
(Es bleibt aber natürlich dabei, dass man beim Imperativ erst sagt was und dann womit. (Und C soll ja angeblich eine imperative Sprache sein.))
-
yahendrik schrieb:
Und in Programmiersprachen, in denen der Operator bei benutzerdefinierten Typen überladen werden kann (C++), kann der Unterschied gravierend sein. Beim Postinkrement wird immer ein temporäres Objekt benötigt.
Schlimmer: In C++ können Prä- und Post-Inkrement völlig unabhängig voneinander definiert werden (sollte man aber besser nicht machen, wenn den Code noch jemand verstehen soll ;)).
@Topic: Ich hatte mir während meiner aktiven Zeit die Schreibweise ++i angewöhnt. Aber Regeln von Deutsch auf C abzuleiten halte ich für zweifelhaft. (Aber trotzdem passt "inkrementiere i" in das Schema "entleere den Kasten")