Questa è in realtà una domanda complicata perché si basa sui dettagli della grammatica C che è complicata. La migliore fonte per capirlo è lo draft standard, possiamo usare Annex A
Sommario della sintassi della lingua come riferimento.
L'idea di base è che:
int i=0,1,2;
è una dichiarazione e:
i = 0,1,2;
è un'espressione.
In un'espressione possiamo avere la comma operator che valuta la sinistra (di solito per gli effetti collaterali), getta via il risultato e poi valuta il lato destro ecc ...
Nella dichiarazione la virgola è un separatore grammaticale non l'operatore virgola. Il ,
separa dichiaratori e dal 1
e 2
non sono dichiaratori nel contesto di una dichiarazione questa è la sintassi corretta:
int i=0,1,2;
^^^^
La grammatica rilevante dallo standard C99 è la seguente:
init-declarator-list:
init-declarator
init-declarator-list , init-declarator <--- here comma is just a seperator
init-declarator:
declarator
declarator = initializer
Quindi, in In questo caso, inizializza, che può essere un dichiaratore o un dichiarator = inizializzatore né 1
né 2
sono dichiaratori e quindi abbiamo una sintassi errata.
Vale la pena di nulla che un inizializzatore può essere un incarico espressione, ma questa espressione non ci dà un percorso di una nuda virgola operatore, anche se potremmo finire con un operatore virgola in ()
(attraverso l'espressione primaria) ma questo non apparirebbe come un separatore.
Per l'espressione della grammatica pertinente sezione 6.5.17
è:
expression:
assignment-expression
expression , assignment-expression
e la descrizione dell'operatore virgola è la seguente:
L'operando sinistro dell'operatore virgola viene valutata come vuoto espressione; c'è un punto di sequenza dopo la sua valutazione. Quindi viene valutato l'operando destro ; il risultato ha il suo tipo e valore [...]
Rilevando che l'operatore virgola ha il lowest precedence la seguente espressione:.
i = 0,1,2;
è equivalente a:
(i = 0),1,2;
e quindi i
otterrà il valore di 0
e i risultati delle ulteriori valutazioni verranno gettati.
@ Mahesha999 in realtà la domanda _bigger_ sarebbe: perché mai è necessario scrivere qualcosa del genere? La grammatica dice _ "dichiarazione \ dichiarazione-specificatori; \ dichiarazione-specificatori init-dichiaratore-lista;" _, questo è tutto. Cosa pensi che sia intuitivo (se c'è qualcosa di _intuitivo_ nell'operatore virgola) per scrivere tale codice? –
@DebasishJana questo non spiega perché il caso di dichiarazione non funziona come spiego nella mia risposta che nessun altro sembra aver ottenuto neanche. –
@AdrianoRepetti la distinzione tra ',' in un'espressione e in una dichiarazione sembra essersi persa nelle risposte qui per quale motivo ho aggiunto una risposta. Questa è la parte interessante della domanda. –