Continue Fehler im Tutorial?

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
vrcmr
Beiträge: 12
Registriert: Di Mär 05, 2013 9:19 pm

Continue Fehler im Tutorial?

Beitrag von vrcmr » Fr Sep 20, 2013 2:17 pm

Auf dieser Seite
http://www.proggen.org/doku.php?id=c:tutorial:loops

wird folgendes geschrieben:
Wir haben nun einen Wächter, der - wenn die Zahl nicht durch zwei teilbar ist - den Befehl continue aufruft. continue unterbricht die Abarbeitung der Schleife, das nachfolgende printf( „Dieser Wert ist durch zwei teilbar“ ) wird also nicht mehr erreicht. Stattdessen wird die Schleife direkt am Kopf fortgesetzt 1).
Wenn ich es aber praktisch mache dann geschieht folgendes:
Wir haben nun einen Wächter, der - wenn die Zahl durch zwei teilbar ist - den Befehl continue aufruft. continue unterbricht die Abarbeitung der Schleife nicht, das nachfolgende printf( „Dieser Wert ist durch zwei teilbar“ ) wird also erreicht und abarbeitet.

Die Logik ist folgende:

Code: Alles auswählen

if(true)
continue;
// weiterverarbeiten

if(false)
continue;
// springe zum Kopf der Schleife und beachte die nachfolgenden Code-Zeilen nicht.
Ist das richtig?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8861
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Continue Fehler im Tutorial?

Beitrag von Xin » Fr Sep 20, 2013 3:08 pm

vrcmr hat geschrieben:Auf dieser Seite
http://www.proggen.org/doku.php?id=c:tutorial:loops

wird folgendes geschrieben:
Wir haben nun einen Wächter, der - wenn die Zahl nicht durch zwei teilbar ist - den Befehl continue aufruft. continue unterbricht die Abarbeitung der Schleife, das nachfolgende printf( „Dieser Wert ist durch zwei teilbar“ ) wird also nicht mehr erreicht. Stattdessen wird die Schleife direkt am Kopf fortgesetzt 1).
Wenn ich es aber praktisch mache dann geschieht folgendes:
Wir haben nun einen Wächter, der - wenn die Zahl durch zwei teilbar ist - den Befehl continue aufruft. continue unterbricht die Abarbeitung der Schleife nicht, das nachfolgende printf( „Dieser Wert ist durch zwei teilbar“ ) wird also erreicht und abarbeitet.
wert % 2 ist true, wenn bei der Division durch 2 ein Rest bleibt - dann ist die Zahl durch zwei nicht glatt teilbar. Wenn wert % 2 also nicht durch 2 teilbar ist, springt er an den Anfang der for-Schleife. Alles nachfolgende - hinter dem Wächter - wird entsprechend nicht mehr aufgerufen.
vrcmr hat geschrieben: Die Logik ist folgende:

Code: Alles auswählen

if(true)
continue;
// weiterverarbeiten

if(false)
continue;
// springe zum Kopf der Schleife und beachte die nachfolgenden Code-Zeilen nicht.
Ist das richtig?
Die Logik verstehe ich nicht ^^

continue bedeutet grundsätzlich "Setze die Schleife fort", egal wie die Bedingung davor aussieht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

sebix
Beiträge: 82
Registriert: Mo Nov 19, 2012 8:27 pm

Re: Continue Fehler im Tutorial?

Beitrag von sebix » So Sep 22, 2013 5:18 pm

Xin hat geschrieben:continue bedeutet grundsätzlich "Setze die Schleife fort", egal wie die Bedingung davor aussieht.
Egal wie die Bedingung lautet?
Aber das hier gibt ja auch nur 0 aus, und nicht nur eins, also wird die Bedingung überprüft?

Code: Alles auswählen

#include <stdio.h>
int main(void) {
	int i = 0;
	while (i < 1) {
		printf("%d\n", i);
		i++;
		continue;
	}
	return 0;
}

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Continue Fehler im Tutorial?

Beitrag von cloidnerux » So Sep 22, 2013 5:22 pm

Aber das hier gibt ja auch nur 0 aus, und nicht nur eins, also wird die Bedingung überprüft?
Continue wird im Code-Fluss wie eine normale Funktion aufgerufen.
Sobald du in deinem Code-Fluss auf ein Continue stößt, wird der Computer zurück zum Sschleifenkopf springen. In deinem Beispiel ist es natürlich absurd. Du weist den Computer als letzten Befehl einer Schleife an, wieder zurück zum Schleifenkopf zu springen, was er ja so oder so machen würde. Daher ist dein continue unnötig. Es wird zudem nur 0 ausgegeben, da nach dem ersten durchlauf i = 1 ist und damit die Bedingung nicht mehr erfüllt.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8861
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Continue Fehler im Tutorial?

Beitrag von Xin » Mo Sep 23, 2013 9:51 am

sebix hat geschrieben:
Xin hat geschrieben:continue bedeutet grundsätzlich "Setze die Schleife fort", egal wie die Bedingung davor aussieht.
Egal wie die Bedingung lautet?
continue ist nur ein Schlüsselwort - das in dem Moment, in dem es gerufen wird, an den Anfang der Schleife zurück springt.
Steht vor Continue ein if-Statement, so wird natürlich gesprungen, wenn das if-Statement "true" ergibt. Es besteht also kein Zusammenhang zwischen der Funktion von continue und der Bedingung, die davor steht.
sebix hat geschrieben: Aber das hier gibt ja auch nur 0 aus, und nicht nur eins, also wird die Bedingung überprüft?

Code: Alles auswählen

#include <stdio.h>
int main(void) {
	int i = 0;
	while (i < 1) {
		printf("%d\n", i);
		i++;
		continue;
	}
	return 0;
}
Die Bedingung wird immer überprüft, im zweiten Fall (i==1) ist die Bedingung lediglich nicht 'true'.
continue steht am Ende jeder Schleife automatisch (sonst wäre es keine Schleife, wenn nicht an den Startpunkt der Schleife zurückspringen würdest). Das continue macht nichts anderes als an den Schleifenkopf zurück zu springen.
Wenn davor eine Bedingung ist (if( ... ) continue) dann regelt das if nur, ob das continue jetzt ausgeführt wird oder ob der Quelltext in der Schleife weiter bearbeitet wird. Man kann so einen Wächter innerhalb einer Schleife implementieren.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

sebix
Beiträge: 82
Registriert: Mo Nov 19, 2012 8:27 pm

Re: Continue Fehler im Tutorial?

Beitrag von sebix » Mo Sep 23, 2013 8:30 pm

Nun, ich weiß schon was continue macht, und das if vor dem continue auch. Aber ich würde continue eher beschreibe als, "Springe zum Schleifenkopf" / "gehe zum nächsten durchlauf" / "brich den durchlauf ab und mach sonst wie gewohnt weiter".
Xin hat geschrieben:continue bedeutet grundsätzlich "Setze die Schleife fort", egal wie die Bedingung davor aussieht.
Was bedeutet in diesem Zusammenhang aber nun "egal wie die Bedingung davor aussieht". Bzw. welche Bedingung ist hier gemeint, ich dachte hier an die Schleifenbedingung, aber das macht ja keinen Sinn, weil sie ja eben schon geprüft wird.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8861
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Continue Fehler im Tutorial?

Beitrag von Xin » Mo Sep 23, 2013 9:41 pm

sebix hat geschrieben:Nun, ich weiß schon was continue macht, und das if vor dem continue auch. Aber ich würde continue eher beschreibe als, "Springe zum Schleifenkopf" / "gehe zum nächsten durchlauf" / "brich den durchlauf ab und mach sonst wie gewohnt weiter".
Ich hoffe, dass es auch in der Bedeutung beschrieben ist. ^^
sebix hat geschrieben:
Xin hat geschrieben:continue bedeutet grundsätzlich "Setze die Schleife fort", egal wie die Bedingung davor aussieht.
Was bedeutet in diesem Zusammenhang aber nun "egal wie die Bedingung davor aussieht". Bzw. welche Bedingung ist hier gemeint, ich dachte hier an die Schleifenbedingung, aber das macht ja keinen Sinn, weil sie ja eben schon geprüft wird.
Du hast die Frage nicht gestellt, ergo zielt meine Antwort auf die Frage des Fragestellers:
Xin hat geschrieben:
vrcmr hat geschrieben: Die Logik ist folgende:

Code: Alles auswählen

if(true)
continue;
// weiterverarbeiten

if(false)
continue;
// springe zum Kopf der Schleife und beachte die nachfolgenden Code-Zeilen nicht.
Ist das richtig?
Die Logik verstehe ich nicht ^^

continue bedeutet grundsätzlich "Setze die Schleife fort", egal wie die Bedingung davor aussieht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten