2012-02-22 13 views
5

Stavo lavorando alle nozioni di base di C e stavo cercando di risolvere il problema di seguito potrebbe qualcuno spiegare perché l'output della variabile c è diverso?Perché c non viene incrementato nell'output?

Qual è l'output del seguente programma?

int main() 
{ 
    int a = -3, b = 2, c= 0, d; 
    d = ++a && ++b || ++c; 
    printf ("a = %d, b = %d, c = %d, d = %d", a, b, c, d); 
} 

Ans: -2, 3, 0, 1

Perché c non è incrementato in uscita?

+1

d = ((-2 && 3) || (++ c)). È cortocircuitato prima che arrivi a c. –

+0

Cosa stai cercando di fare? O stai semplicemente giocando con un po 'di codice? – Bart

+0

semplicemente risolvendo c puzzle – Nisha

risposta

10

La variabile c non viene incrementato perché il RHS (lato destro) di un || non viene eseguito a meno che il LHS restituisce false, e la LHS restituisce true. Gli operatori C || e && sono operatori di "cortocircuito"; non valutano il secondo operando a meno che il primo non sia sufficiente per determinare la verità generale dell'espressione.

Il && lega stretto rispetto al ||, quindi l'operazione può essere tra parentesi come:

d = (++a && ++b) || ++c; 

Il valore di ++a è -2, che restituisce true (perché qualsiasi valore che non è 0 restituisce true); il valore di ++b è 3, che risulta true; quindi il valore del termine && è vero. Poiché true || false e true || true valutano entrambi a true, non è necessario valutare l'RHS per conoscere il risultato complessivo. (La regola analoga per && è che se il primo termine viene valutato come falso, non è necessario valutare il secondo perché l'espressione generale deve essere falsa. Se si avesse a = -1; prima del test, allora b non verrà incrementato, perché ++a essere zero o falso, quindi l'RHS di && non è valutato. Ovviamente, quindi c sarebbe incrementato perché l'LHS dello || sarebbe falso e l'RHS dovrà essere valutato per determinare il risultato complessivo)

+2

Forse non capisce come -2 e 3 valgono per il vero. –

+0

@ 0A0D: Ho notato che potrebbe essere corretto. –

9

Perché ++a && ++b restituisce true.

Si chiama cortocircuito. Le espressioni all'interno delle condizioni vengono valutate da sinistra a destra. Se il tuo caso, se la prima condizione nella clausola OR viene valutata su true, non c'è motivo di valutare anche la seconda, poiché l'intera espressione è già nota come true.

2

In C, gli operatori logici booleani e || sono short-circuiting. Ciò significa che valutano solo il loro lato destro, se la valutazione del lato sinistro non è sufficiente per conoscere la risposta.

Per il codice, questo ha l'effetto di non valutare mai ++c, poiché il lato sinistro non è zero e quindi il risultato booleano o sarà vero, e non c'è bisogno di fare più lavoro.

2

È una valutazione di espressioni booleane pigri. L'esecuzione è:

++a-2

++b3

-2 && 31

Va bene! Non è necessario verificare il risultato di ||. Quindi ++c non viene valutato.

La regola è: la parte di espressione X non viene valutata nei casi: (0 && X), (1 || X). Qui 1 è "non 0", ovviamente.

2
 
d= ++a && ++b || ++c 
d= ++(-2) && ++b || ++c 
d= -1 && ++b || ++c 
d= true && ++b || ++c 
d= true && ++2 || ++c 
d= true && true || ++c 
d= true || ++c 
d= 1 

Ecco più o meno come funziona dietro le quinte ...

Problemi correlati