2011-11-16 5 views
7

Ho appena incontrato questo pezzo di codice che fa questo:Sintassi C/C++ - Separazione delle istruzioni con, anziché; legale?

delete a, a = 0; 

Si compila e funziona bene. Ma non è questo dovrebbe essere:

delete a; 
a = 0; 

Perché è possibile separare le istruzioni utilizzando, consentito in questo caso?

Grazie :)

+3

Si chiama operatore virgola: http://www.cplusplus.com/doc/tutorial/operators/. –

+2

Questa dovrebbe essere una risposta, non un commento. – Mysticial

+0

Naturalmente, l'esempio qui è C++, non C. :-) – ibid

risposta

6

Questo è l'operatore virgola. Valuta entrambi i suoi argomenti e restituisce il secondo.

+0

@Mankarse: già risolto, grazie. –

5

Questo è l'operatore virgola. Può essere usato per separare espressioni, ma non dichiarazioni.

+0

È possibile introdurre più dichiarazioni dello stesso tipo con la virgola. –

7

In C e C++, la maggior parte delle "dichiarazioni" sono in realtà espressioni. Il punto e virgola aggiunto a un'espressione lo rende una dichiarazione. In alternativa, è consentito (ma quasi sempre in cattivo stile) di separare le espressioni effetto-lato con l'operatore virgola: l'espressione lato sinistro viene valutata per i suoi effetti collaterali (e il suo valore è scartato), e la mano destra l'espressione lato è valutata per il suo valore.

5

Questo è comma operator. L'articolo MSDN è here. E dai un'occhiata alla domanda this per capire come funziona.

1

Mentre è possibile scrivere codice come questo, può essere un po 'strano. Un caso d'uso un po 'più realistico sarebbe se si dispone di una struct T come segue:

struct T { 
    bool check() const; 
    void fix(); 
}; 

Ora si vuole scorrere tutto nel struct ed eseguire verificare su di esso, e quindi chiamare risolvere se il controllo restituisce false. Il modo più semplice per farlo sarebbe

for (list<T>::iterator it = mylist.begin(); it < mylist.end(); ++it) 
    if (!it->check()) 
     it->fix(); 

Facciamo finta di voler scriverlo nel modo più breve possibile. fix() restituire vuoto significa che non puoi metterlo nelle condizioni. Tuttavia, utilizzando l'operatore virgola è possibile aggirare il problema:

for (auto it = mylist.begin(); it != mylist.end() && (it->check() || (it->fix(), true)); ++it); 

io non lo uso senza un particolarmente buona ragione, ma permette di chiamare qualsiasi funzione di una condizione, che può essere conveniente.