2011-12-23 8 views
9
int a = 1; 
int b = (1,2,3); 
cout << a+b << endl; // this prints 4 
  1. È (1,2,3) una sorta di struttura in C++ (un certo tipo primitivo di lista, forse?)
  2. Perché b assegnato il valore 3? Il compilatore prende semplicemente l'ultimo valore dalla lista?
+1

Non c'è alcuna logica dietro quel codice. È qualcosa che un insegnante potrebbe inventare per testare la tua comprensione dell'operatore virgola. Usa i [compiti a casa] quando appropriato. –

+0

o è un errore di battitura. Vale a dire (1,2,3) non è ciò che l'autore del codice intendeva. – ddyer

+0

possibile duplicato di [Cosa fa l'operatore virgola \ ', \' do in C?] (Http: // stackoverflow.it/questions/52550/what-does-the-comma-operator-do-in-c) –

risposta

8

Sì, è esattamente così: il compilatore prende l'ultimo valore. Questo è l'operatore virgola, e valuta i suoi operandi da sinistra a destra e restituisce quello più a destra. Risolve anche da sinistra a destra. Perché qualcuno dovrebbe scrivere un codice del genere, non ne ho idea :)

Quindi int b = (1, 2, 3) è equivalente a int b = 3. Non è un elenco primitivo di alcun tipo e l'operatore virgola , viene utilizzato principalmente per valutare più comandi nel contesto di un'espressione, ad esempio a += 5, b += 4, c += 3, d += 2, e += 1, f.

+4

L'unico buon uso (una sorta di) è all'interno di for (;; ++ x, ++ y) –

+0

@LokiAstari: Sì. (Ho appena capito - da "Perché qualcuno dovrebbe scrivere un codice del genere, non ho idea" mi riferivo a '(1, 2, 3)' che è inutile.L'operatore virgola va bene in altri casi ':)') – Ryan

+0

L'unica possibile (non necessariamente buona) ragione per cui posso pensare sarebbe mettere insieme un mucchio di operazioni in cui non ti importa dei risultati di ciascuna. [Esempio] (http://ideone.com/MuwxQ). * modifica: * e Loki sarebbe un altro. – FakeRainBrigand

6

(1,2,3) è un'espressione che utilizza due istanze dell'operatore virgola. L'operatore virgola valuta il suo operando di sinistra, quindi c'è un punto di sequenza e quindi valuta il suo operando di destra. Il valore dell'operatore virgola è il risultato della valutazione dell'operando di destra, il risultato della valutazione dell'operando di sinistra viene scartato.

int b = (1,2,3); 

è pertanto equivalente a:

int b = 3; 

maggior parte dei compilatori avviserà di un tale uso dell'operando virgola come esiste sempre solo un punto di utilizzare un operatore virgola se l'espressione a sinistra ha qualche effetto collaterale.

1

È l'operatore virgola che assume il formato expr, expr. La prima espressione viene valutata e il risultato viene scartato, la seconda espressione viene valutata e viene restituito il risultato.

Nel tuo caso che la linea è valutato come:

((1, 2), 3) => 
(2, 3) => 
3 
4

La seconda linea sta usando l'operatore virgola. Un'espressione come

a, b 

valuta sia a e b e restituisce b.

In questo caso, la seconda linea viene analizzato come:

int b = ((1, 2), 3); 

così (1, 2) viene valutata (a 2) poi gettati via, e il risultato finale è semplicemente 3.

-3

probabilmente utilizzato per be b = foo (1,2,3) ma il foo è stato cancellato accidentalmente. C non si lamenta di questo tipo di schifezze "è una caratteristica".

+0

Penso che quelli di voi che stanno sfogliando questa risposta manchino di un punto importante. Nessuno scriverà questo codice. Se l'interrogante sta cercando di capire questo codice, deve capire che non è ciò che l'autore ha effettivamente inteso. – ddyer

Problemi correlati