# Operatore virgola

Nei linguaggi di programmazione C e C++, l'operatore virgola (rappresentato dal token ,) è un operatore binario che valuta i suoi due operandi in ordine e restituisce il risultato del secondo. È presente un punto di sequenza tra queste valutazioni.
L'uso del token virgola come operatore è distinto dal suo utilizzo in chiamate di funzione, definizioni, dichiarazioni di variabili, dichiarazioni enum e costrutti simili, in cui funge da separatore.

## Sintassi

L'operatore virgola separa le espressioni (che hanno valore) in modo analogo a come il punto e virgola termina le istruzioni. Le sequenze di espressioni sono racchiuse tra parentesi analogamente a come le sequenze di istruzioni sono racchiuse tra parentesi graffe: (a, b, c) è una sequenza di espressioni, separate da virgole, che restituisce l'ultima espressione c mentre {a; b; c;} è una sequenza di istruzioni e non restituisce alcun valore. Una virgola può trovarsi solo tra due espressioni (la quale le separa) a differenza del punto e virgola, che si trova alla fine di un'istruzione (non di blocco), i punti e virgola terminano le istruzioni.
L'operatore virgola ha la precedenza più bassa di qualsiasi operatore C e funge da punto di sequenza. In una combinazione di virgole e punti e virgola, i punti e virgola hanno una precedenza inferiore alle virgole, poiché i punti e virgola separano le affermazioni ma le virgole si trovano all'interno delle affermazioni, il che concorda con il loro uso come punteggiatura ordinaria: a, b; c, d è raggruppato come (a, b); (c, d) perché si tratta di due affermazioni separate.

## Esempi

In questo esempio, il comportamento diverso tra la seconda e la terza riga è dovuto al fatto che l'operatore virgola ha una precedenza inferiore rispetto all'assegnazione. Anche l'ultimo esempio è diverso poiché l'espressione di ritorno deve essere valutata completamente prima che la funzione possa ritornare.

## Usi

L'uso dell'operatore virgola è relativamente limitato. Poiché scarta il suo primo operando, è generalmente utile solo quando il primo operando ha effetti collaterali desiderabili che devono essere sequenziati prima del secondo operando. Inoltre, poiché è usato raramente al di fuori di idiomi specifici e facilmente scambiato con altre virgole o punto e virgola, è potenzialmente fonte di confusione e soggetto a errori. Tuttavia, ci sono alcune circostanze in cui è comunemente usato, in particolare nei cicli for e in SFINAE. Per i sistemi embedded che possono avere capacità di debug limitate, l'operatore virgola può essere utilizzato in combinazione con una macro per sovrascrivere senza problemi una chiamata di funzione, per inserire codice subito prima della chiamata di funzione.

### Cicli for

L'uso più comune consiste nel consentire più istruzioni di assegnazione senza utilizzare un'istruzione di blocco, principalmente nell'inizializzazione e nelle espressioni di incremento di un ciclo for. Questo è l'unico uso idiomatico nella programmazione C elementare. Nell'esempio seguente, l'ordine degli inizializzatori del ciclo è significativo:
Una soluzione alternativa a questo problema in altri linguaggi è l'assegnazione parallela, che consente di eseguire più assegnazioni all'interno di una singola istruzione e utilizza anche una virgola, sebbene con sintassi e semantica diverse. Questa è usata in Go nel suo analogo ciclo for.
Al di fuori degli inizializzatori di ciclo for (che hanno un uso speciale del punto e virgola), la virgola potrebbe essere utilizzata al posto del punto e virgola, in particolare quando le istruzioni in questione funzionano in modo simile a un incremento del ciclo (ad esempio alla fine di un ciclo while):

### Macro

La virgola può essere utilizzata nelle macro del preprocessore per eseguire più operazioni nello spazio di una singola espressione sintattica.
Un uso comune consiste nel fornire messaggi di errore personalizzati nelle asserzioni non riuscite. Questo viene fatto passando un elenco di espressioni tra parentesi alla macro assert, dove la prima espressione è una stringa di errore e la seconda espressione è la condizione che viene asserita. La macro assert restituisce il suo argomento testualmente sull'asserzione fallita. Quanto segue è un esempio:
Output:
Tuttavia la macro assert è solitamente disabilitata nel codice di produzione, quindi va utilizzata solo per scopi di debug.

### Condizione

La virgola può essere utilizzata all'interno di una condizione (di un if, while, do-while o for) per consentire calcoli ausiliari, in particolare chiamando una funzione e utilizzando il risultato, rispettando l'ambito del blocco:
Un linguaggio simile esiste in Go, dove la sintassi dell'istruzione if consente esplicitamente un'istruzione facoltativa.

### Ritorno complesso

La virgola può essere utilizzata nelle istruzioni return, per assegnare una variabile globale o un parametro di uscita (passato per riferimento). Questo idioma suggerisce che gli assegnamenti fanno parte del ritorno rispetto ad essere assegnamenti ausiliari in un blocco che termina con il ritorno effettivo. Ad esempio, nell'impostazione di un numero di errore globale:
Questo può essere scritto in modo più verboso come:

### Per evitare un blocco

Per brevità, la virgola può essere utilizzata per evitare un blocco e le parentesi graffe associate:

## Altri linguaggi

Nei linguaggi di programmazione OCaml e Ruby, a questo scopo viene utilizzato il punto e virgola (";"). JavaScript e Perl utilizzano l'operatore virgola allo stesso modo di C/C++. In Java, la virgola è un separatore utilizzato per separare gli elementi in un elenco in vari contesti. Non è un operatore e non valuta l'ultimo elemento nell'elenco.