2013-07-22 21 views
22

Ho avuto questo problema quando ho cancellato per errore il nome del metodo. Il codice è passato daPerché questo codice C++ viene compilato? Che cosa fa?

bool bRet = MethodName(pData, pOutFilename); 

a

bool bRet = (pData, pOutFilename); 

ma ancora compilato? Cosa fa questo codice? Cosa significa? Sembra che ritorni vero, è sempre così (anche se pData è nullo)?

Tutte le idee sono ben accette!

+7

Controllare l'operatore virgola.Come per pData; bool bRet = pOutFilename; ' –

risposta

37

è la "comma operator" che

valuta il suo primo operando e scarta il risultato, e quindi valuta il secondo operando e restituisce il valore (e tipo).

+3

Per un "uso pratico", 'if (condizione) restituisce fprintf (stderr," Messaggio di debug \ n "), FALSE;' Se si desidera aggiungere temporaneamente un messaggio di debug senza dover aggiungere parentesi. –

+0

@RobertFisher interessante .., può anche essere 'i = DEBUG_VALUE, j;' –

+0

Vale la pena ricordare che il valore di 'pOutFilename' è implicitamente convertito in' bool'. Supponendo che 'pOutFilename' sia un puntatore, il risultato è' false' se 'pOutFilename' è un puntatore nullo,' true' altrimenti. –

17

tua espressione bool bRet = (pData, pOutFilename); è un'espressione valida, ed è equivalente alla espressione bool bRet = pOutFilename;

In bool bRet = (pData, pOutFilename);, prima espressione pData viene valutata, poi la seconda espressione pOutFilename viene valutata, allora il valore di seconda espressione è assegnato al bRet (questo è il modo in cui l'operatore , lavora da sinistra a destra).

Leggi: Comma Operator: ,

L'operatore virgola , ha left-to-right associativity. Due espressioni separate da una virgola vengono valutate da sinistra a destra. L'operando a sinistra è sempre valutato e tutti gli effetti collaterali sono completati prima che venga valutato l'operando di destra .

Per comprendere l'importanza della parentesi () nell'espressione, considerare il mio esempio di seguito. Osservare l'output in questo esempio (ho C esempio):

int main() { 
    int i = 10, b = 20, c= 30; 
    i = b, c; // i = b 
    printf("%i\n", i); 

    i = (b, c); // i = c 
    printf("%i\n", i); 
} 

uscita:

20 
30 

Per comprendere l'output: look at precedence table, hanno bassa priorità rispetto =. Nella tua espressione hai sovrascritto la precedenza usando le parentesi.

+6

Tranne se' pData' ha effetti collaterali, immagino. – Joey

+0

che poteva avere solo se fosse una macro –

+0

@StefanoFalasca Se 'pData' non è inizializzato, è possibile interpretare i vari standard applicabili nel senso che' pData' in 'pData, pOutFilename' è a volte un comportamento non definito. Qualcosa può anche accadere se 'pData' è una variabile a virgola mobile che contiene un NaN di segnalazione, ma non ne so molto. –

4

È un , comma operator. Se si dispone di un'espressione come questo:

i = (a, b);   

b saranno conservati in i.

Quindi nel tuo caso:

bRet = pOutFilename; 

pOutFilename dovrà essere conservato in bRet.

Problemi correlati