Bevor ich es nicht selber ausprobiert habe, hätte ich meine Großmutter
darauf verwettet, dass die zweite Schleife mit 1 und nicht mit 0
beginnt. Warum ist das so? Bei beiden kommt jedoch 0 ... 9 heraus.
Walter T. schrieb:> Inkrement am Schleifenende. Gut, daß Deine Oma das nicht liest.
Hmmm ... die Praxis gibt dir ja vollkommen recht, aber so
selbtverständlich un dlogisch finde ich das trotzdem nicht.
Ist die for-Schleife nicht ein pre-cehck-loop? Denn wenn da z.B. stünde
for(int i=3; i<3 ...
wird ja garnicht erst hineingegangen. Typisch pre-check.
Das würde aber eigentlich auch implizieren, dass bei ++i das i zuerst
inkrementiert wird, bevor es in der Schleife ausgegeben wird ...
> Ist die for-Schleife nicht ein pre-cehck-loop?
"for (clause-1 ; expression-2 ; expression-3 ) statement
[..] expression-2 is the controlling expression that is evaluated before
each execution of the loop body. [..] expression-3 is evaluated [..]
after each execution of the loop body." (aus dem c99-Standard, Abschnitt
6.8.5.3 "The for statement").
Das war jetzt einfach. Und ja, das ist intuitiv.
g457 schrieb:> (aus dem c99-Standard, Abschnitt> 6.8.5.3 "The for statement").>> Das war jetzt einfach. Und ja, das ist intuitiv.
Was sagt denn C zu
>System.out.println(""+i);
?
g
JavaNeuling schrieb:> Typisch pre-check.>> Das würde aber eigentlich auch implizieren, dass bei ++i das i zuerst> inkrementiert wird, bevor es in der Schleife ausgegeben wird ...
Du wirfst da alles wild durcheinander. Die Abbruchbedingung, der
Schleifenkoerper und das Pre-(oder Post)Increment sind vollkommen
unabhaengig.
E.g. https://beginnersbook.com/2014/01/c-for-loop/
leo
JavaNeuling schrieb:> Ist die for-Schleife nicht ein pre-cehck-loop?
Check vorne, Inkrement hinten.
Kerninghan and Ritchie von 1988 sagt einfach genau das, was mein
Vorschreiber geschrieben hat:
"The for statement
for ( expr1; expr2; expr3)
statement
is equivalent to
expr1
while( expr2 ) {
statement
expr3;
}
"
> Deine Großmutter würde den vermutlich kennen ;)
Wer halbwegs mitdenken kann wüsste dass sich da seitdem in C definitiv
nicht relevantes geändert hat, ebensowenig im darauf aufbauenen C++, im
daran angelehnten Java oder bäsch, oder in sonst irgendeiner
Programmiersprache, die "for" statements unterstützt.
Und wenn man im Standard nachiest, dann braucht man nicht rumzuraten wie
der TO. Besser ∗wissen∗ als ∗glauben∗.
Nix für ungut.
skankhunt42 schrieb:> Cartoons können lehrreich sein oO
Der Cartoon funktioniert nur, wenn Runner und Coyote vor der Schleife
direkt am Abgrund stehen und "not edge" eigentlich "not next step goes
over edge" bedeutet.
JavaHater schrieb:>> aus dem c99-Standard>> Deine Großmutter würde den vermutlich kennen ;)
Wobei sie erst einmal drüber nachdenken würde, ob das nun C, C++ oder
Java-Code ist.
JavaNeuling schrieb:> Walter T. schrieb:>> Inkrement am Schleifenende. Gut, daß Deine Oma das nicht liest.>> Hmmm ... die Praxis gibt dir ja vollkommen recht, aber so> selbtverständlich un dlogisch finde ich das trotzdem nicht.>> Ist die for-Schleife nicht ein pre-cehck-loop? Denn wenn da z.B. stünde>> for(int i=3; i<3 ...>> wird ja garnicht erst hineingegangen. Typisch pre-check.>> Das würde aber eigentlich auch implizieren, dass bei ++i das i zuerst> inkrementiert wird, bevor es in der Schleife ausgegeben wird ...
Mal abgesehen davon, dass das in den Büchern, sämtlichen Internettexten
und im Standard völlig eindeutig definiert ist ...
Logik hängt immer von den Prämissen ab.
Die Voraussetzung der Anwendbarkeit von "Logik" an sich, als Argument
für eine bestimmten Schlussfolgerung zu benutzen, ist unlogisch.
An sich ist das auch eher eine Berufung auf den "gesunden
Menschenverstand", vor dem man sich, wie die Erfahrung zeigt, sehr in
Acht nehmen muss. Er täuscht nämlich leider oft.
Ich rate dazu, in solchen Fällen immer die Prämisse oder das Axiom
ausdrücklich zu formulieren. Dann kann man auch überprüfen, ob sie
(resp. es) zutrifft.
Hier war das Axiom: Der Ausdruck "for (Initialisierung Prüfung;
Anweisung) [ Rumpf }" wird in der Folge Initialisierung, Prüfung,
Anweisung ohne Alternative ausgeführt, bevor der Rumpf ausgeführt
wird.
Ganz offenbar trifft das nicht zu. Man muss sogar sagen: Es muss nicht
zutreffen. Das ist nicht die einzige plausible, rationale Methode das
Verhalten festzulegen.
g457 schrieb:>> Was sagt denn C zu>>> System.out.println(""+i);>> Mein gcc sagt das das vollkommen ok ist:$ grep -e main -A 10 main.c
was würde denn ein
> cat main.c
ausgeben?
In C spielt es keine Rolle, ob du Pre- oder Postinkrement machst. Das
mit dem Pre-Inkrement ++i hat einen anderen Hintergrund.
In C++ ist das Pre-Inkrement sinnvoll für Iteratoren weil es effizienter
ist. Bei einem Pre-Inkrement muss der Compiler keine Kopie des Iterators
anlegen.
Das ist zumindest das was man liest. Höchstwahrscheinlich werden gute
C++ Compiler das aber so optimieren, dass es auch da keine Rolle spielt.
Eine eigene Frage?
Dieser Thread ist über 7 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.