mikrocontroller.net

Forum: Compiler & IDEs for-Schleifen


Autor: Richard W. (richi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

kurze Frage:

wenn man in dem Bedingungsfeld der for-Schleife eine Funktion einbaut, 
wird diese dann bei jedem Durchlauf neu ausgeführt und der return-Wert 
mit dem aktuellen Zählerwert verglichen oder wird die Funktion nur 
einmal am Anfang ausgeführt, das Ergebnis gespeichert und dann jedes mal 
damit verglichen?

Viele Grüße
Richi

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Bedingung wird bei jedem Durchlauf neu ausgewertet, also z.B. auch 
mit Funktionsaufruf.

Autor: Vorleser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das steht in einem C-Buch.

>wenn man in dem Bedingungsfeld der for-Schleife eine Funktion einbaut,
>wird diese dann bei jedem Durchlauf neu ausgeführt und der return-Wert
mit dem aktuellen Zählerwert verglichen

Nein.

So speziell ist die Bedingung bei for nicht . Die Bedingung kann jeder 
Ausdruck mit boolschem Ergebnis sein. Es wird nicht implizit mit der 
Laufvariablen verglichen. Auch besteht kein Zwang selbst explizit mit 
der Laufvariablen zu vergleichen. Solche Fälle kommen auch vor.

>oder wird die Funktion nur einmal am Anfang ausgeführt, das Ergebnis >gespeichert 
und dann jedes mal damit verglichen?

Nein

Autor: Vorleser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die Bedingung kann jeder Ausdruck mit boolschem Ergebnis sein.

Man muss sogar strenger formulieren. Die Bedingung muss ein Ergebnis mit 
boolschem Ergebnis sein.

Da die Nachfrage fast sicher kommt. Integer-Werte werden wie folgt als 
boolsche Werte interpretiert. Eine 0 heisst "Falsch". Alle 
Nicht-Null-Werte heissen "Wahr".

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richard W. schrieb:
> wenn man in dem Bedingungsfeld der for-Schleife eine Funktion einbaut,
> wird diese dann bei jedem Durchlauf neu ausgeführt und der return-Wert
> mit dem aktuellen Zählerwert verglichen oder wird die Funktion nur
> einmal am Anfang ausgeführt, das Ergebnis gespeichert und dann jedes
> mal damit verglichen?

Im Normalfall wird die Funktion bei jedem Durchlauf aufgerufen, da sie 
ja jedesmal einen anderen Wert liefern könnte.
Wenn der Compiler aber erkennen kann, daß der Wert sich nicht ändert, 
kann der mehrfache Aufruf auch weggelassen werden (typisches Beispiel 
wäre strlen() von einem konstanten String). Man kann das auch durch 
Deklaration der Funktion mit __attribute__((const)) oder 
__attribute__((pure)) explizit dem Compiler mitteilen.

Autor: Richard W. (richi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die vielen Antworten.

Ich muss es wohl etwas spezieller machen:

int funktion(void);

for(int i=0; i<funktion(); i++) {};

Wird die Funktion "funktion()" jetzt jedes mal aufgerufen oder nur 
einmal?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richard W. schrieb:
> Wird die Funktion "funktion()" jetzt jedes mal aufgerufen oder nur
> einmal?

Sie wird jedesmal aufgerufen.

Autor: Richard W. (richi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke!!!

viele Grüße
Richi

Autor: Hans Mayer (Firma: mayer) (oe1smc) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wird die Funktion "funktion()" jetzt jedes mal aufgerufen oder nur
> einmal?

ich wuerde sagen, sie wird mindestens einmal aufgerufen, denn die 
funktion koennte ja auch beim ersten mal den wert 0 od eine negative 
zahl zurueck liefern.

schoene gruesse
hans

--

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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