Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

21.02.2013, 21:21

Es geht einfach darum alles Schleifenrelevante an einem Ort zu haben. Das erhöht die Lesbarkeit und ermöglicht auf einen Blick zu sehen wie eine Schleife arbeitet.

m3xx

Alter Hase

  • »m3xx« ist der Autor dieses Themas

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

12

21.02.2013, 21:27

Sie existiert aus den selben Gründen, aus denen so ziemlich alle Konstrukte in Hochsprachen existieren: Abstraktion. Wenn du es lesbarer findest, den Schleifenzähler im Schleifenkörper zu inkrementieren, dann mach's eben einfach so... ;)
Das war die Antwort, die ich suchte. :)
Dann hat sich ja alles geklärt. Wenn jemand dem noch etwas wichtiges hinzufügen möchte, ich wäre interessiert^^

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

21.02.2013, 21:32

Wenn man den Zähler im Schleifenrumpf erhöht/verringert, funktioniert continue nicht so, wie man es wollen würde.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

21.02.2013, 21:56

Zudem, ob man es nun zugeben will oder nicht, vergisst man gern das Inkrement/Dekrement, wenn man es nicht oben rein schreibt. Beim Öffnen der Schleife denkt man noch: "Ah joar, den Counter zähle ich weiter unten durch". Nach dem ersten Programmlauf fasst man sich dann an die Stirn, weil man's eben doch wieder vergessen hat, nachdem man die ersten 5 Zeilen innerhalb der Schleife geschrieben hat.
Zudem erleichtert eine For-Schleife mit vorhandenem Inkrement/Dekrement die Wartbarkeit deutlich. Man findet nach 3 Monaten nämlich noch immer sofort raus, wie oft die Schleife wohl vermutlich laufen wird, was nicht sofort ersichtlich wäre, würde man das irgendwo im restlichen Kram der Schleife erledigen. Gerade Anfänger tendieren ja dazu so eine Schleife mal eben länger als 10 Zeilen werden zu lassen und da müsste man schon ziemlich lange suchen, bis man es hat. So will kein Mensch auf Dauer debuggen, das strengt tierisch an.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

15

21.02.2013, 22:03

Bei der For schleife handelt es sich im gegensatz zu einer While Schleife um eine Zählschleife. Auch wenn man eine For schleife mit While nachbilden kann so ist es nicht äquivalent! Bei einer For schleife muss, sofern sie als zählschleife gelten soll vor Eintritt in den Block feststehen wie viele Schleifendurchläufe es gibt.

In c++ ist es zwar möglich die schleifenvariable zu verändern, in anderen Sprachen jedoch nicht. Würde man sie so wie du beschrieben hast implementieren würde sie ihr eigenes Konzept verletzen. Verändert man den Zähler im Block so ist es ein Semantikfehler.
:love: := Go;

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

21.02.2013, 22:12

Bei einer For schleife muss, sofern sie als zählschleife gelten soll vor Eintritt in den Block feststehen wie viele Schleifendurchläufe es gibt.

nope

In c++ ist es zwar möglich die schleifenvariable zu verändern, in anderen Sprachen jedoch nicht. Würde man sie so wie du beschrieben hast implementieren würde sie ihr eigenes Konzept verletzen. Verändert man den Zähler im Block so ist es ein Semantikfehler.

Wieso?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

21.02.2013, 22:12

H5::, das ist Unfug. Bei einem for muss nicht und ist auch nicht dafür gedacht, dass ihre Durchlaufzahl von vornherein bekannt ist.
WHILE{}, DO{}WHILE und FOR sind alle äquivalent und jede lässt sich durch die jeweils anderen ausdrücken (in Kombination mit IF).
Mit der Veränderbarkeit der Zählvariable innerhalb des Blocks hat das sogar relativ wenig zu tun. Die Restriktion der Zählvariable ist in manchen Sprachen vorhanden und eine Art "dem Entwickler auf die Finger hauen". Ändert aber nichts an der Äquivalenz aller Schleifen.
Die meisten CPUs kennen nämlich überhaupt keine Schleifen, sondern nur Compares und Jumps, wie bei einem IF.
("rep stosx" kann man nicht ernsthaft als Schleife bezeichnen, funktioniert aber ähnlich)


@Dot: In Pascal ist die Änderung der Zählschleife innerhalb eines For-Blocks in der Tat ein Semantikfehler.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

18

21.02.2013, 22:33

Also laut Frage geht’s hier ja nicht um ausschließlich C++ oder habe ich das jetzt falsch verstanden? Die For schleife mag auch als While implementiert sein. Aber ihre Semantik ist nicht äquivalent. Ich meine ich lerne auch gern dazu aber laut Wikipedia und dem was ich so gelernt habe ist es ein Semantik Fehler. Da es syntaktisch richtig ist sagt der Compiler nur nichts. Meine Aussage bezog sich aber auf die For Schleife als Numerische Schleife.

Ich bin mir nicht sicher, aber wäre dem Compiler die Schrittweite bekannt bietet es ihm auch mehr Optimierungsmöglichkeiten. (das ist aber nur eine Theorie von mir), was bei einer Veränderung im Block nur schwer möglich ist. Es kann auch Systeme geben wo der Zähler konstant ist im Block.

For-Schleife

Edit:
Also ich wollte jetzt auch nicht Haarspalten oder so, war eigentlich nur darauf bezogen warum der Zähler generell nicht im Block verändert wird. Und das der Gedanke von der For Schleife etwas mehr als nur „syntactic sugar“ ist. Bzw. das dem Ganzen ein Sinn zugrunde liegt. Ich meine es ist ja auch kein Fehler es so zu sehen wie ich es geschrieben habe. Wie man es am Ende benutzt muss ja jeder selbst wissen.
:love: := Go;

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »H5::« (21.02.2013, 22:45)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

21.02.2013, 22:47

Die For schleife mag auch als While implementiert sein. Aber ihre Semantik ist nicht äquivalent.

Das hängt imo stark davon ab, wie genau man die Semantik der for-Schleife verstehen möchte, aber du hast damit rein prinzipiell nicht unbedingt Unrecht.

Ich bin mir nicht sicher, aber wäre dem Compiler die Schrittweite bekannt bietet es ihm auch mehr Optimierungsmöglichkeiten. (das ist aber nur eine Theorie von mir), was bei einer Veränderung im Block nur schwer möglich ist. Es kann auch Systeme geben wo der Zähler konstant ist im Block.

Insbesondere auch wenn die Anzahl der Durchläufe konstant ist, kann der Compiler potentiell optimieren.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

20

21.02.2013, 23:21

Naja, die For-Schleife ist recht fest mit dem Iterieren verknüpft. So gesehen ist sie eine „Untermenge“ der While Schleife. Wenn man jetzt sagt sie ist eine Zählschleife, gibt man ihr diese Semantik. Benutzt man sie dann nicht so verletzt man ihre Semantik. Würde man jetzt im Block den Zähler ändern, so zählt sie selbst nicht mehr und wäre nur eine Schleife in der Gezählt würde. Also wie gesagt ich will jetzt hier nicht Erbsen zählen oder so was, ich hatte nur versucht zu erklären warum sie so ist wie sie ist.

Aber wie Dot schon sagt es hängt davon ab wie man die Semantik versteht. Für mich persönlich ist es recht wichtig mich an solchen Bedeutungen zu orientieren um auch später meinen Code gut lesen zu können (Die Semantik Dokumentiert mit) und gleich auch eine Erklärung für mich warum sie so ist wie sie ist.
:love: := Go;

Werbeanzeige