362 Stimmen

int a[] = {1,2,}; Warum ist ein nachgestelltes Komma in einer Initialisierungsliste zulässig?

Vielleicht bin ich nicht von diesem Planeten, aber es scheint mir, dass das Folgende ein Syntaxfehler sein sollte:

int a[] = {1,2,}; //extra comma in the end

Ist es aber nicht. Ich war überrascht, als dieser Code in Visual Studio kompiliert wurde, aber ich habe gelernt, dem MSVC-Compiler nicht zu trauen, was die C++-Regeln angeht, also habe ich den Standard überprüft, und er es auch nach der Norm zulässig. Wenn Sie mir nicht glauben, können Sie unter 8.5.1 die Grammatikregeln nachlesen.

enter image description here

Warum ist das erlaubt? Dies mag eine dumme, nutzlose Frage sein, aber ich möchte, dass Sie verstehen, warum ich frage. Wenn es sich um einen Unterfall einer allgemeinen Grammatikregel handeln würde, würde ich es verstehen - man hat beschlossen, die allgemeine Grammatik nicht noch schwieriger zu machen, nur um ein überflüssiges Komma am Ende einer Initialisierungsliste zu verbieten. Aber nein, das zusätzliche Komma ist ausdrücklich erlaubt. Zum Beispiel ist es nicht erlaubt, ein überflüssiges Komma am Ende der Argumentliste eines Funktionsaufrufs zu haben (wenn die Funktion ... ), was normal ist .

Noch einmal: Gibt es einen besonderen Grund für dieses überflüssige Komma? ausdrücklich erlaubt?

6voto

Louis Punkte 2402

Es ist einfacher für Maschinen, d.h. für das Parsen und die Erzeugung von Code. Es ist auch einfacher für Menschen, d.h. Änderung, Auskommentierung und visuelle Eleganz durch Konsistenz.

Würden Sie, C vorausgesetzt, Folgendes schreiben?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    puts("Line 1");
    puts("Line 2");
    puts("Line 3");

    return EXIT_SUCCESS
}

Nein. Nicht nur, weil die letzte Aussage ein Fehler ist, sondern auch, weil sie inkonsistent ist. Warum also das Gleiche mit Sammlungen machen? Selbst in Sprachen, die es erlauben, letzte Semikolons und Kommas wegzulassen, wird dies von der Gemeinschaft in der Regel nicht gerne gesehen. Die Perl-Gemeinschaft zum Beispiel scheint es nicht zu mögen, Semikolons wegzulassen, außer bei Einzeilern. Das gilt auch für Kommas.

Lassen Sie in mehrzeiligen Sammlungen keine Kommas weg, aus dem gleichen Grund, aus dem Sie bei mehrzeiligen Codeblöcken keine Semikolons weglassen. Ich meine, Sie würden es nicht tun, selbst wenn die Sprache es erlauben würde, richtig? Richtig?

6voto

Konrad Borowski Punkte 10645

Dies ist zulässig, um Fehler zu vermeiden, die durch das Verschieben von Elementen in einer langen Liste entstehen.

Nehmen wir zum Beispiel an, wir haben einen Code, der wie folgt aussieht.

#include <iostream>
#include <string>
#include <cstddef>
#define ARRAY_SIZE(array) (sizeof(array) / sizeof *(array))
int main() {
    std::string messages[] = {
        "Stack Overflow",
        "Super User",
        "Server Fault"
    };
    size_t i;
    for (i = 0; i < ARRAY_SIZE(messages); i++) {
        std::cout << messages[i] << std::endl;
    }
}

Und das ist großartig, denn es zeigt die ursprüngliche Trilogie der Stack Exchange-Seiten.

Stack Overflow
Super User
Server Fault

Es gibt jedoch ein Problem. In der Fußzeile dieser Website steht nämlich "Serverfehler" vor "Superuser". Reparieren Sie das besser, bevor es jemandem auffällt.

#include <iostream>
#include <string>
#include <cstddef>
#define ARRAY_SIZE(array) (sizeof(array) / sizeof *(array))
int main() {
    std::string messages[] = {
        "Stack Overflow",
        "Server Fault"
        "Super User",
    };
    size_t i;
    for (i = 0; i < ARRAY_SIZE(messages); i++) {
        std::cout << messages[i] << std::endl;
    }
}

Schließlich kann es doch nicht so schwer sein, die Linien zu verschieben, oder?

Stack Overflow
Server FaultSuper User

Ich weiß, es gibt keine Website mit dem Namen "Server FaultSuper User", aber unser Compiler behauptet, es gäbe sie. Nun, das Problem ist, dass C eine String-Verkettungsfunktion hat, die es erlaubt, zwei Strings mit doppelten Anführungszeichen zu schreiben und sie mit nichts zu verketten (ein ähnliches Problem kann auch mit ganzen Zahlen auftreten, da - Zeichen hat mehrere Bedeutungen).

Was wäre nun, wenn das ursprüngliche Array ein unnötiges Komma am Ende hätte? Nun, die Zeilen würden verschoben werden, aber der Fehler wäre nicht aufgetreten. Es ist leicht, etwas so kleines wie ein Komma zu übersehen. Wenn Sie daran denken, nach jedem Array-Element ein Komma zu setzen, kann ein solcher Fehler einfach nicht passieren. Sie Sie möchten nicht vier Stunden mit der Fehlersuche verbringen, bis Sie herausfinden, dass das Komma die Ursache für Ihre Probleme ist. .

6voto

Thomas Bonini Punkte 42356

Die einzige Sprache, in der das - in der Praxis* - nicht erlaubt ist, ist Javascript, und das verursacht eine Unmenge von Problemen. Wenn Sie z. B. eine Zeile aus der Mitte des Feldes kopieren und am Ende einfügen und vergessen, das Komma zu entfernen, wird Ihre Website für IE-Besucher völlig unbrauchbar sein.

*Theoretisch ist das erlaubt, aber der Internet Explorer hält sich nicht an den Standard und behandelt es als Fehler.

6voto

Mark B Punkte 93261

Sie ermöglicht es, dass jede Zeile der gleichen Form folgt. Das macht es erstens einfacher, neue Zeilen hinzuzufügen und ein Versionskontrollsystem die Änderungen sinnvoll verfolgen zu lassen, und zweitens lässt sich der Code so leichter analysieren. Ein technischer Grund fällt mir nicht ein.

6voto

Vlad Punkte 34235

Der Grund dafür ist trivial: einfaches Hinzufügen/Entfernen von Zeilen.

Stellen Sie sich den folgenden Code vor:

int a[] = {
   1,
   2,
   //3, // - not needed any more
};

Jetzt können Sie ganz einfach Elemente zur Liste hinzufügen/entfernen, ohne manchmal das nachgestellte Komma hinzufügen/entfernen zu müssen.

Im Gegensatz zu anderen Antworten glaube ich nicht, dass die Einfachheit der Listenerstellung ein triftiger Grund ist: Schließlich ist es für den Code trivial, die letzte (oder erste) Zeile in Großbuchstaben zu schreiben. Code-Generatoren werden einmal geschrieben und viele Male verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X