2010-12-28 7 views
2

Ich habe this Frage gelesen, und ich möchte, um es hinzuzufügen, dass, was sind die Dinge, die nicht mit dem Komma-Operator erfolgen. Das hat mich sehr verwirrt, wie kann ich dies tun:Die Grenzen des Komma-Operator

int arr[3]; 
arr[0]=1,arr[1]=2,arr[2]=3; 

Aber wenn ich tun:

int arr[3],arr[0]=1,arr[1]=2,arr[2]=3; 

Es gibt mir einen Compiler-Fehler.

Ich möchte fragen, was sind die Grenzen der Komma-Operator in der Praxis?

+0

Auch eine interessante Frage ist, was * kann * mit dem Komma-Operator getan werden. Das Überladen des Komma-Operators ist das richtige Werkzeug, um zur Kompilierzeit zu testen, ob ein Ausdruckstyp ungültig ist oder nicht, d. 'sizeof ((expr, foo())) == sizeof (foo)' wobei 'foo' ein benutzerdefinierter Typ ist und eine' template foo (& operator, (T, foo)) [2]; ' . Bei Verwendung mit "T = void" wird der Standardkommaoperator verwendet. –

Antwort

10

Eine Sache zu realisieren ist, dass nicht alle Verwendungen eines Kommas in C Instanzen des Komma-Operators sind. Ändern Sie Ihr zweites Beispiel eine syntaktisch Erklärung sein:

int a0=1,a1=2,a2=3; 

die Kommata sind nicht Operatoren, sind sie nur erforderlich Syntax Instanzen von Deklaratoren in einer Liste zu trennen.

Auch das Komma in Parameter/Argument-Listen ist nicht der Komma-Operator.

Meiner Meinung nach ist die Verwendung des Komma-Operators fast immer eine schlechte Idee - es verursacht nur unnötige Verwirrung. In den meisten Fällen kann die Verwendung eines Komma-Operators mit separaten Anweisungen klarer ausgeführt werden.

Zwei Ausnahmen, die leicht in den Sinn kommen, sind innerhalb der Kontrollklauseln einer for Anweisung, und in Makros, die absolut mehr als eine "Sache" in einen einzigen Ausdruck stopfen müssen, und selbst dies sollte nur getan werden, wenn es keine gibt andere vernünftige Option).

+0

Auch wenn sie hier nur Trennzeichen sind, sollte sie dennoch ein 3-stelliges Array deklarieren und mir die Werte von links nach rechts zuweisen –

+4

@fahad: In manchen Fällen ist das Komma kein Operator, die Seite, die du verlinkt hast, sagt auch , "Kommas können in einigen Kontexten als Trennzeichen verwendet werden, wie zum Beispiel Funktionsargumentlisten. Verwechseln Sie nicht die Verwendung des Kommas als Trennzeichen mit seiner Verwendung als Operator; die zwei Verwendungen sind völlig verschieden." –

+0

Oh Entschuldigung, ich änderte meine Kommentar Sie haben mich dazwischen erwischt:) –

5

Sie können den Komma-Operator überall dort verwenden, wo ein Ausdruck angezeigt werden kann. Es gibt ein paar Ausnahmen; Insbesondere können Sie den Kommaoperator nicht in einem konstanten Ausdruck verwenden.

Sie müssen auch vorsichtig sein, wenn das Komma-Operator, wo das Komma auch als Trennzeichen, beispielsweise verwendet wird, wenn Funktionen aufrufen müssen Sie Klammern Gruppe das Komma Ausdruck verwenden:

void f(int, bool); 

f(42, 32, true); // wrong 
f((42, 32), true); // right (if such a thing can be considered "right") 

Ihr Beispiel eine Erklärung:

int arr[3],arr[0]=1,arr[1]=2,arr[2]=3; 

In einer Erklärung, können Sie mehrere Dinge erklären, indem sie mit dem Komma, so auch hier das Komma wird verwendet als Trennzeichen trennt. Sie können auch nicht einfach einen Ausdruck am Ende einer solchen Deklaration anheften. (Beachten Sie, dass Sie das gewünschte Ergebnis erhalten können, indem Sie int arr[3] = { 1, 2, 3 }; verwenden).

+0

Es lohnt sich, darauf hinzuweisen, während der Kommaoperator verwendet werden kann, wenn ein _Ausdruck_ erwartet wird. In vielen Fällen, in denen Leute denken, Ausdrücke zu verwenden, ist oft nur ein _Assignment-Ausdruck_ erlaubt. Z.B. Funktionsargumente, Initialisierer. –

Verwandte Themen