it-swarm.com.de

Warum werden Semikolons und Kommas gegen Schleifen ausgetauscht?

In vielen Sprachen (eine breite Liste von C bis JavaScript):

  • kommas , trennen Argumente (z. B. func(a, b, c)), während
  • semikolons ; trennen sequentielle Anweisungen (z. B. instruction1; instruction2; instruction3).

Warum wird diese Zuordnung in denselben Sprachen für für Schleifen umgekehrt?

for ( init1, init2; condition; inc1, inc2 )
{
    instruction1;
    instruction2;
}

statt (was mir natürlicher erscheint)

for ( init1; init2, condition, inc1; inc2 )
{
    instruction1;
    instruction2;
}

?

Sicher, for ist (normalerweise) keine Funktion, aber Argumente (dh init, condition, increment) verhalten sich eher wie Argumente einer Funktion als wie a Reihenfolge der Anweisungen.

Liegt es an historischen Gründen/einer Konvention oder gibt es eine gute Begründung für den Austausch von , Und ; In Schleifen?

50
Piotr Migdal

Warum wird in denselben Sprachen eine solche Zuordnung für for-Schleifen umgekehrt?.

Technisch ist die Zuordnung nicht "umgekehrt".

  • Die durch Kommas getrennten Dinge sind keine Parameter. In (mindestens) C++ und Java können sie Deklarationen sein, also sind sie nicht einmal Ausdrücke.
  • Die durch Semikolons getrennten Dinge sind ebenfalls keine (einzelnen) Anweisungen.

In Wirklichkeit haben wir hier einen anderen syntaktischen Kontext, in dem dieselben Symbole unterschiedlich verwendet werden. Wir vergleichen nicht Gleiches mit Gleichem, daher gibt es kein Mapping und kein starkes Argument für ein konsistentes Mapping basierend auf semantischer Konsistenz.

Warum also nicht umgekehrt?

Nun, ich denke, die Gründe kommen von der "natürlichen" Bedeutung von , und ;. In der englischen Schriftsprache ist ein Semikolon eine "stärkere" Unterbrechung als ein Komma, und die Glyphe für das Semikolon ist sichtbarer als ein Komma. Diese beiden Dinge zusammen lassen das derzeitige Arrangement (für mich!) Natürlicher erscheinen.

Der einzige Weg, um sicher zu wissen, warum die Syntax gewählt wurde, wäre, wenn die C-Designer uns sagen könnten, was sie im Jahr 1970 gedacht haben. Ich bezweifle, dass sie eine klare Erinnerung an technische Entscheidungen haben, die so weit zurück in der Zeit getroffen wurden.


Liegt es an historischen Gründen/einer Konvention?

Ich kenne keine Sprache vor C, die eine C-ähnliche Syntax für "for" -Schleifen verwendet hat:

  • Donal Fellows stellt fest, dass BCPL und B kein gleichwertiges Konstrukt hatten.

  • Die Äquivalente FORTRAN, COBOL und ALGOL-60 (und Pascal) waren weniger aussagekräftig und hatten Syntaxen, die nicht der C "for" -Syntax ähnelten.

Aber Sprachen wie C, C++ und Java, die nach C kamen, leihen sich eindeutig ihre "for" -Syntax von C aus.

18
Stephen C

Wir schreiben Schleifen wie:

 for(x = 0; x < 10; x++)

Die Sprache hätte so definiert werden können, dass Schleifen wie folgt aussahen:

 for(x = 0, x < 10, x++)

Stellen Sie sich jedoch dieselbe Schleife vor, die mit einer while-Schleife implementiert wurde:

 x = 0;
 while(x < 10)
 {
     x++;
 }

Beachten Sie, dass die x=0 und x++ sind Anweisungen, die durch Semikolons beendet werden. Sie sind keine Ausdrücke wie in einem Funktionsaufruf. Semikolons werden verwendet, um Anweisungen zu trennen, und da zwei der drei Elemente in einer for-Schleife Anweisungen sind, wird dies dort verwendet. Eine for-Schleife ist nur eine Verknüpfung für eine solche while-Schleife.

Außerdem verhalten sich die Argumente nicht wirklich wie Argumente für eine Funktion. Der zweite und dritte werden wiederholt ausgewertet. Es ist wahr, dass sie keine Sequenz sind, aber sie sind auch keine Funktionsargumente.

Die Tatsache, dass Sie Kommas verwenden können, um mehrere Anweisungen in der for-Schleife zu haben, können Sie auch außerhalb der for-Schleife ausführen.

x = 0, y= 3;

ist eine vollkommen gültige Aussage auch außerhalb einer for-Schleife. Ich kenne jedoch keine praktische Verwendung außerhalb der for-Schleife. Der Punkt ist jedoch, dass Kommas Anweisungen immer unterteilen. Es ist keine Besonderheit der for-Schleife.

60
Winston Ewert

In C und C++ ist dies der Kommaoperator, nicht nur ein Komma.

Die Grammatik für eine for -Schleife ist ungefähr so

for ([pre-expression]; [terminate-condition]; [increment-expression]) body-expression

Bei Ihrer Frage:

pre-expression -> init1, init2
terminate-condition -> condition
increment-expression -> inc1, inc2

Beachten Sie, dass Sie mit dem Komma-Operator mehrere Aktionen in einer Anweisung ausführen können (wie der Compiler es sieht). Wenn Ihr Vorschlag umgesetzt würde, würde die Grammatik nicht eindeutig sein, wann der Programmierer beabsichtigte, eine Komma-Operator-Anweisung oder ein Trennzeichen zu schreiben.

Kurz gesagt bedeutet ; Das Ende einer Anweisung. Eine for -Schleife ist ein Schlüsselwort, gefolgt von einer Liste optionaler Anweisungen, die von () Umgeben sind. Die Komma-Operator-Anweisung ermöglicht die Verwendung von , In einer einzelnen Anweisung.

15
James

Es gibt keine konzeptionelle Umkehrung.

Semikolons in C stehen für mehr Hauptabteilungen als Kommas. Sie trennen Aussagen und Erklärungen.

Die Hauptunterteilung in der for-Schleife besteht darin, dass es drei Ausdrücke (oder eine Deklaration und zwei Ausdrücke) und einen Body gibt.

Die in C for-Schleifen angezeigten Kommas sind nicht Teil der Syntax der for-Schleife. Sie sind nur Manifestationen des Kommaoperators.

Kommas sind wichtige Trennzeichen zwischen Argumenten in Funktionsaufrufen und zwischen Parametern in Funktionsdeklarationen, aber Semikolons werden nicht verwendet. Die for-Schleife ist eine spezielle Syntax. es hat nichts mit Funktionen oder Funktionsaufrufen zu tun.

8
Kaz

Vielleicht ist dies etwas Spezielles für C/C++, aber ich poste diese Antwort, da die Syntax der von Ihnen beschriebenen Verzögerungen hauptsächlich von der C-Syntax beeinflusst wird.

Abgesehen davon, dass die zuvor beantworteten Fragen aus technischer Sicht wahr sind, liegt das auch daran, dass in C (und C++) das Komma tatsächlich ein Operator ist, das Sie sogar Überladung können . Die Verwendung eines Semikolonoperators (operator;()) würde möglicherweise das Schreiben von Compilern erschweren, da das Semikolon der Terminator für den axiomatischen Ausdruck ist.

Was dieses Interesse ausmacht, ist die Tatsache, dass das Komma in der gesamten Sprache häufig als Trennzeichen verwendet wird. Es scheint, dass der Komma-Operator eine Ausnahme darstellt, die hauptsächlich verwendet wird, um for- Schleifen mit mehreren Bedingungen zum Laufen zu bringen. Was ist also der Deal?

In der Tat die operator, wurde erstellt, um dasselbe zu tun wie in Definitionen, Argumentlisten usw.: Es wurde erstellt, um separate Ausdrücke zu erstellen - etwas, das das syntaktische Konstrukt ist , nicht können. Es kann nur das trennen, was in der Norm definiert wurde.

Das Semikolon trennt sich jedoch nicht - es endet . Und das führt uns auch zurück zur ursprünglichen Frage:

for (int a = 0, float b = 0.0f; a < 100 && b < 100.0f; a++, b += 1.0f)
    printf("%d: %f", a, b);

Das Komma trennt die Ausdrücke in den drei Schleifenteilen, während das Semikolon einen Teil (Initialisierung, Bedingung oder nachträglicher Gedanke) der Schleifendefinition beendet.

Neuere Programmiersprachen (wie C #) erlauben möglicherweise keine Überladung des Komma-Operators, aber sie haben höchstwahrscheinlich die Syntax beibehalten, da sich das Ändern irgendwie unnatürlich anfühlt.

2
Aschratt

Für mich werden sie weniger ähnlich verwendet wie ihr sprachlicher Sinn. Kommas werden mit Listen und Semikolons mit separateren Teilen verwendet.

In func(a, b, c) haben wir eine Liste von Argumenten.

instruction1; instruction2; instruction3 Ist vielleicht eine Liste, aber eine Liste separater und unabhängiger Anweisungen.

In for ( init1, init2; condition; inc1, inc2 ) haben wir drei separate Teile - eine Liste von Initialisierungen, eine Bedingung und eine Liste von Inkrementausdrücken.

0
ludwika

Der einfachste Weg, es zu sehen, ist der folgende:

for(x = 0; x < 10; x++)

ist:

for(
x = 0;
x < 10;
x++
)

Mit anderen Worten, dieses x = 0-Ding ist eigentlich eher eine Anweisung/Anweisung als ein Parameter. Sie fügen dort eine Anweisung ein. Daher sind sie durch Semikolon getrennt.

Tatsächlich gibt es keine Möglichkeit, sie durch Komma zu trennen. Wann fügen Sie das letzte Mal Dinge wie x <10 als Parameter ein? Sie tun dies, wenn Sie x <10 einmal computerisieren und das Ergebnis dieser Operation als Parameter einfügen möchten. In der Kommawelt würden Sie also x <10 setzen, wenn Sie den Wert von x <0 an eine Funktion übergeben möchten.

Hier legen Sie fest, dass das Programm bei jeder Übergabe der Schleife x <10 prüfen soll. Das ist also eine Anweisung.

x ++ ist definitiv eine andere Anweisung.

Das sind alles Anweisungen. Sie sind also durch ein Semikolon getrennt.

0
user4951