C-Tutorial: Unlogische "continue" Erklärung @Schleifen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Eiren
Beiträge: 4
Registriert: Mi Jun 05, 2013 9:27 pm

C-Tutorial: Unlogische "continue" Erklärung @Schleifen

Beitrag von Eiren » Mi Jun 05, 2013 9:41 pm

Hallo =)
Ich bin derzeit dabei, das C-Tutorial durchzuarbeiten und bin gerade bei den Schleifen angekommen.
An sich verstehe ich alles, außer das mit der "Pre-Condition" continue.

Nun im Tutorial steht:
"Man stellt sich einen Türsteher vor den „Then-Part“, der - wenn die Bedingung nicht erfüllt ist - die Weiterverarbeitung unterbindet."

wenn ich jetzt aber in einem eigenen Programm das hier schreibe:

Code: Alles auswählen

for (wert; wert <=20; wert = wert + 1)
  {
  if (wert)
  continue;
  printf(" Ich gebe %d aus. \n", wert);
  }
Und es wird nur die "0" ausgegeben. Aber bedeutet die "0" bei einer Entscheidung nicht false?
Bedeutet, dass dieser "Türsteher" die Weiterverarbeitung unterbindet, wenn die Bedingung erfüllt ist.
Das erkennt man auch in dem Code, der im Tutorial gezeigt wird.

Ich schreibe das hier nur, um mir das besser einprägen zu können.
ist das ein Fehler in der Erklärung oder verstehe ich was falsch?

Gruß =)

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: C-Tutorial: Unlogische "continue" Erklärung @Schleifen

Beitrag von canlot » Mi Jun 05, 2013 10:09 pm

Also im Tutorial steht es doch etwas anders. Also mit continue; springst du von dem Punkt an sofort zum nächsten Schleifendurchlauf. If Klausel wird ausgeführt wenn die Bedingung dafür wahr ist.
Also 1==1 oder 0 == 0. Wenn die beiden Zahlen gleich sind dann ist die Bedingung auch wahr also 1 auch true, wenn nicht dann 0 auch false.
Unwissenheit ist ein Segen

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

Re: C-Tutorial: Unlogische "continue" Erklärung @Schleifen

Beitrag von cloidnerux » Mi Jun 05, 2013 10:09 pm

Mit continue wird die weitere Schleifenabarbeitung abgebrochen und direkt zum Schleifenheader gesprungen.

Code: Alles auswählen

for (wert; wert <=20; wert = wert + 1)
Du solltest wert auch mit einem Wert initialisieren:

Code: Alles auswählen

for (wert = 0; wert <=20; wert = wert + 1)
Auch um sich selber nochmal klar zu machen, mit welchem Wert du hier arbeitest, weil du ja anscheinend wert auch vor der Schleife deklarierst.
Und es wird nur die "0" ausgegeben. Aber bedeutet die "0" bei einer Entscheidung nicht false?
Bedeutet, dass dieser "Türsteher" die Weiterverarbeitung unterbindet, wenn die Bedingung erfüllt ist.
Betrachte continue als normale Funktion. Sie wird wie eine normale Funktion ausgeführt, also in diesem Fall erst dann, wenn die Bedingung im if Wahr ist.

BTW: Willkommen im Forum!
Redundanz macht wiederholen unnötig.
quod erat expectandum

Eiren
Beiträge: 4
Registriert: Mi Jun 05, 2013 9:27 pm

Re: C-Tutorial: Unlogische "continue" Erklärung @Schleifen

Beitrag von Eiren » Mi Jun 05, 2013 10:28 pm

Okay, vielleicht hätte ich erwähnen sollen, dass ich vorher der Variable "wert" die 0 gegeben habe ^^
Also ich habe das jetzt mal so nochmal versucht:

Code: Alles auswählen

for (wert = 0; wert <=20; wert = wert + 1)
  {
  if (wert == 0 )
  continue;
  printf(" Ich gebe %d aus \n", wert);
  }
Es werden die Zahlen 1-19 ausgegeben.

Die Bedingung beim ersten Durchlauf ist erfüllt, da : if(0 == 0).
Die Weiterverarbeitung wird aber unterbunden und es wird zum Schleifenkopf gesprungen.
Also: bedingung = wahr und es wird "continue" ausgeführt. -> keine Weiterverarbeitung.
Und beim 2. Durchlauf ist die Bedinung nicht erfüllt, da : if(1 == 0).
Es wird continue nicht durchgeführt und es wird "printf" ausgeführt.

Aber im Tutorial steht:
Bedingung = false, Weiterverarbeitung wird unterbunden. (genaues Gegenteil zu dem, was ich oben geschrieben habe)

Es tut mir Leid, wenn ich hier aufm Schlauch stehe und total dumme Fragen stelle =)

Gruß

BTW: Danke für das Wilkommen heißen =)

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

Re: C-Tutorial: Unlogische "continue" Erklärung @Schleifen

Beitrag von cloidnerux » Mi Jun 05, 2013 10:49 pm

Aber im Tutorial steht:
Bedingung = false, Weiterverarbeitung wird unterbunden. (genaues Gegenteil zu dem, was ich oben geschrieben habe)

Es tut mir Leid, wenn ich hier aufm Schlauch stehe und total dumme Fragen stelle =)
Du darfst Sätze nicht aus dem Kontext reißen! Im Wiki steht folgendes:
Es gibt in C zwei Möglichkeiten auf Bedingungen einzugehen. Die hier gezeigte fragt die Bedingung ab und verschachtelt dann im Then-Part. Wenn's passt, dann… Es gibt aber auch eine andere Vorgehensweise: Wenn's nicht passt, dann höre auf. Man stellt sich einen Türsteher vor den „Then-Part“, der - wenn die Bedingung nicht erfüllt ist - die Weiterverarbeitung unterbindet. Einen solchen Türsteher nennt man “Wächter“ oder - damit man ein schöneres Buzzword hat - auch “Precondition“.
Hier wird NICHT über den Code gesprochen, sondern über ein Konzept.
Das Konzept nennt sich "Wächter".
Es Bezieht sich auf folgendes Problem:

Code: Alles auswählen

if(Bedingung Wahr)
{
    //bearbeitet man halt weiter
    if(Bedingung2 Wahr)
    {
        //weiterarbeiten
        ///und vlt noch 3-4 eben ifs weiter
    }
}
Hier wird eine Verarbeitung fortgesetzt, wenn eine Bedingung wahr ist, was dazu führt, dass man immer mehr ifs verschachtelt. Man bemerkt aber, dass es kein else gibt, es also nur die Bedingung Bearbeiten oder Abbrechen gibt. Da du ja egt keine Befehle zum Abbrechen hast, bist du ja erstmal darauf angewiesen, diese Verschachtelung zu machen.
Daher werden nun die Schlüsselworte "continue" und "break" eingeführt. Damit kannst du den Programmfluss steuern, damit was das Abbrechen ermöglicht.
Damit kannst du den oben gezeigten Pseudocode abändern:

Code: Alles auswählen

if(Bedingung 1 falsch)
{
    continue;
}
//bearbeite weiter, wenn Bedingung 1 wahr ist
if(Bedingung 2 falsch)
{
    continue;
}
//....
Das Konzept wird eben Wächter genannt, weil du eben immer nur darüber Wachst, ob alle Bedingungen eingehalten werden.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Eiren
Beiträge: 4
Registriert: Mi Jun 05, 2013 9:27 pm

Re: C-Tutorial: Unlogische "continue" Erklärung @Schleifen

Beitrag von Eiren » Mi Jun 05, 2013 11:03 pm

Ah! Moment...
ich habe gerade herausgefunden (vll. ein bissl doof, dass es nicht im Tutorial steht oder ich habs wieder falsch verstanden :D), dass es ja eine Rolle spielt, an welcher Stelle das continue steht.
Wenn es also an der Position des Then-Teils steht, wird continue ausgeführt, wenn die Bedingung wahr ist.
Wenn continue aber an der Else-Stelle steht, wird die zum Schleifenkopf gesprungen, wenn die Bedingung falsch ist, oder?
Das würde einiges für mich erklären^^

Vielen Dank für eure Hilfe =)

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

Re: C-Tutorial: Unlogische "continue" Erklärung @Schleifen

Beitrag von cloidnerux » Mi Jun 05, 2013 11:22 pm

ich habe gerade herausgefunden (vll. ein bissl doof, dass es nicht im Tutorial steht oder ich habs wieder falsch verstanden ), dass es ja eine Rolle spielt, an welcher Stelle das continue steht.
Wenn es also an der Position des Then-Teils steht, wird continue ausgeführt, wenn die Bedingung wahr ist.
Wenn continue aber an der Else-Stelle steht, wird die zum Schleifenkopf gesprungen, wenn die Bedingung falsch ist, oder?
Das würde einiges für mich erklären^^
Ich habe ja schon gesagt, das continue wie eine normale Funktion aufgerufen wird. Du musst auch beachten, dass du Verzweigungen mit if für nur eine nachfolgende Zeile vereinfacht darstellen kannst:

Code: Alles auswählen

if(...)
{
continue
}
ist das selbe wie

Code: Alles auswählen

if(...)
    continue;
An continue ist nichts besonderes, continue richtet sich nicht an dem Code der davor kam oder an die zu überprüfenden Bedingungen, sondern mit continue wird zum Schleifenkopf(Anfang der Schleife) gesprungen wenn es aufgerufen wird. Nichts kompliziertes!
Redundanz macht wiederholen unnötig.
quod erat expectandum

Eiren
Beiträge: 4
Registriert: Mi Jun 05, 2013 9:27 pm

Re: C-Tutorial: Unlogische "continue" Erklärung @Schleifen

Beitrag von Eiren » Mi Jun 05, 2013 11:31 pm

Ohje, dann ist das wirklich simpler als gedacht. =/

Vielen Dank =)

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

Re: C-Tutorial: Unlogische "continue" Erklärung @Schleifen

Beitrag von Xin » Do Jun 06, 2013 10:46 am

Moin Eiren!
Eiren hat geschrieben:Hallo =)
Ich bin derzeit dabei, das C-Tutorial durchzuarbeiten und bin gerade bei den Schleifen angekommen.
An sich verstehe ich alles, außer das mit der "Pre-Condition" continue.

Nun im Tutorial steht:
"Man stellt sich einen Türsteher vor den „Then-Part“, der - wenn die Bedingung nicht erfüllt ist - die Weiterverarbeitung unterbindet."

...

Bedeutet, dass dieser "Türsteher" die Weiterverarbeitung unterbindet, wenn die Bedingung erfüllt ist.
Das erkennt man auch in dem Code, der im Tutorial gezeigt wird.
Ich habe das Tutorial geschrieben und mir den Part gerade nochmal angesehen. Ich gebe Dir soweit recht, dass der Text dort interpretationsfähig ist. Das richtige ist gemeint, aber man kann das falsche daraus lesen. Damit ist mein Text an der Stelle nicht richtig.

Ich habe den Text jetzt etwas erweitert, schau doch mal bitte drüber, ob er Deine Fragen klärt.
C-Tutorial überarbeitet hat geschrieben:Es gibt in C zwei Möglichkeiten auf Bedingungen einzugehen. Die hier Gezeigte fragt die Bedingung ab und verschachtelt dann im Then-Part. Wenn's passt, dann... Es gibt aber auch eine andere Vorgehensweise: Wenn's nicht passt, dann höre auf. Man stellt sich einen Türsteher vor den "Then-Part", der - wenn die Bedingung nicht erfüllt ist - die Weiterverarbeitung unterbindet. Damit das if in den "Then-Part" verzweigt muss die Bedingung so geschrieben werden, dass sie wahr wird, wenn sie nicht erfüllt wird (Sie wird negiert, also im Wahrheitswert umgekehrt). Beispiel: Der Wert soll 2 sein. Dann ist die Bedingung **nicht** erfüllt, wenn der Wert **nicht** 2 ist. In C: ''!( Wert == 2 )'' oder in Kurz: ''Wert != 2''. Wir können so dann reagieren, wenn etwas **nicht** wie gewünscht ist. Gewünscht war ''Wert == 2'', wir reagieren, wenn ''Wert != 2''. Wenn Wunschbedingung **nicht** erfüllt, dann...
Einen solchen Türsteher nennt man "[[glossary:guard|Wächter]]" oder - damit man ein schöneres [[glossary:Buzzword]] hat - auch "[[glossary:Precondition]]".
Eiren hat geschrieben:Ich schreibe das hier nur, um mir das besser einprägen zu können.
ist das ein Fehler in der Erklärung oder verstehe ich was falsch?
Schön, dass Du gefragt hast, solche Fragen helfen das Tutorial zu verbessern. :)
Wenn man weiß, was gemeint ist, überliest man gelegentlich andere Interpretationsmöglichkeiten. Daher frage bitte auch weiter nach, wenn Du Verständnisschwierigkeiten hast.
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