mikrocontroller.net

Forum: PC-Programmierung for-Schleife mit i++ und ++i


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: JavaNeuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
for(int i=0; i<10; i++){
  System.out.println(""+i);
}
for(int i=0; i<10; ++i){
  System.out.println(""+i);
}

Autor: Walter T. (nicolas)
Datum:

Bewertung
5 lesenswert
nicht lesenswert
Inkrement am Schleifenende. Gut, daß Deine Oma das nicht liest.

Autor: JavaNeuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ...

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
4 lesenswert
nicht lesenswert
aufgedröselt ist das
int i = 0;
while (i<10) {
  ...
  i++;
}
ob da jetzt i++ oder ++i steht, ist in diesem Fall egal.

: Bearbeitet durch User
Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da muss auch nichts mit Pre- oder Postinkrement/dekrement stehen.

Da kann auch i*=2 oder i<<=1 stehen.

Autor: JavaHater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
g457 schrieb:
> aus dem c99-Standard

Deine Großmutter würde den vermutlich kennen ;)

Autor: Jemand (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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

Autor: leo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Walter T. (nicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
 }
"

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was sagt denn C zu
>> System.out.println(""+i);

Mein gcc sagt das das vollkommen ok ist:
$ grep -e main -A 10 main.c 
int main()
{
        for (int i = 0; i < 10; i++)
        {
                System.out.println("" +i);
        }

        return 0;
}

$ rm -f main ; gcc -Wall -Wextra -pedantic -std=c99 -o main main.c ; ./main
0
1
2
3
4
5
6
7
8
9

Autor: skankhunt42 (Gast)
Datum:
Angehängte Dateien:

Bewertung
5 lesenswert
nicht lesenswert
Cartoons können lehrreich sein oO

Autor: mh (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
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.

Beitrag #6022459 wurde vom Autor gelöscht.
Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Theor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: M.A. S. (mse2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
skankhunt42 schrieb:
> Cartoons können lehrreich sein oO

Superg31l!  :)

Autor: Vlad T. (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

#include <stdio.h>

void _println(const char* s) {
  printf("%ld\n", s-"");
}

struct _System{
  struct _out{
    void (*println)(const char*);
  }out;
}System = {{&_println}};


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

?

: Bearbeitet durch User
Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Cartman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
skankhunt42 schrieb:
> skankhunt42

Du hast vergessen das Bild mit mit Photoshop anzupassen, wenn du weißt 
was ich meine ;D

Alter Troll ;)

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.