2013-05-10 21 views
5
int a = 1, b = 0; 

if(a, b) 
    printf("success\n"); 
else 
    printf("fail\n"); 

if(b, a) 
    printf("success\n"); 
else 
    printf("fail"); 

Questo è un file cpp e ho avuto l'output in Visual Studio 2010 comeoperatore virgola in se la condizione

fail 
success 

Perché questo comportamento? Potresti spiegare per favore?

+6

si sa che sta usando l'operatore virgola nella condizione, ma dovete chiedere? –

+0

È sufficiente aggiungere un punto di interruzione alla prima istruzione ed eseguire il programma riga per riga utilizzando F10 per visualizzare il flusso. – vish213

+0

@DanielFischer So che la virgola agisce come un punto di sequenza nelle istruzioni ma non negli argomenti delle funzioni. Puoi dirmi se è un punto di sequenza all'interno di "se"? Mi sento intuitivamente ** sì **, ma vorrei che tu per confermare. –

risposta

35

http://en.wikipedia.org/wiki/Comma_operator:

Nel linguaggi di programmazione C e C++, l'operatore virgola (rappresentato dal token ,) è un operatore binario che valuta la sua prima operando e scarta il risultato, e quindi valuta la secondo operando e restituisce questo valore (e digita).

Nel tuo primo if:

if (a, b) 

a viene valutata prima e scartati, b viene valutata secondo e restituito come 0. Quindi questa condizione è falsa.

Nella tua seconda if:

if (b, a) 

b viene valutata prima e scartati, a viene valutata secondo e restituito come 1. Quindi questa condizione è vera.

Se ci sono più di due operandi, verrà restituita l'ultima espressione.

Se si desidera entrambe le condizioni per essere vero, è necessario utilizzare le && operator:

if (a && b) 
+0

Quindi qual è il punto di fare tali condizioni? qualcuno potrebbe fornire un esempio migliore e utile – Pars

+1

@Pars È utile se si desidera eseguire un'operazione che causa effetti collaterali, ma non è necessario il valore di ritorno effettivo. Ad esempio, ho avuto questa condizione in uno dei miei progetti: 'if (numeric_read (str, & err),! Err)'. Se avessi usato '&&! Err' invece di',! Err', non sarei in grado di leggere i numeri che erano 0. –