2011-09-29 9 views
5

Attraversato un po 'di codice che ha usato questo, che mi ha portato a chiedermi.C++: confronto logico come istruzione condizionale?

if(condition) foo = bar(); 

condition && (foo = bar()); 

sono questi due segmenti di codice pari a un compilatore? Altrimenti, in che modo sarebbero diversi?

+0

Tale tecnica viene utilizzata qui: [Trova il massimo di tre numeri in C senza utilizzare l'istruzione condizionale e l'operatore ternario] (http://stackoverflow.com/questions/7074010/find-maximum-of-three-number-in- c-without-using-condizionale-statement-and-ternary) – Nawaz

+0

Nawaz - Una soluzione così elegante per un così inutile compito a casa. : P –

risposta

1

meno && è sovraccarico per la combinazione di tipi di condition e foo avranno un comportamento identico - quest'ultimo funziona in questo modo:

bool result; 
if(!condition) { 
    result = false; 
} else { 
    foo = bar(); 
    result = foo != 0; 
} 
and result gets ignored 

che usuale corto circuito - se il primo componente di && è false il secondo non viene valutato.

IMO la seconda variante è molto meno leggibile.

6

causa operatore precendenza, quest'ultimo viene interpretato come:

(condition && foo) = bar(); 

Inoltre, v'è una possibilità di && sovraccarico, che può provocare praticamente nulla.

Quindi in breve: non sono affatto uguali - almeno in generale.

+0

Ah, giusto sei! Questo è stato il mio errore, però, le parentesi sono presenti nel codice che ho visto. Risolto il problema –

1

A meno che condition && foo non valga lvalue, condition && foo = bar(); non ha significato.

+0

Spiacente, ho dimenticato di includere la parentesi, è stato corretto. –

0

C'è un errore del compilatore: valore l non valido. Per avere la stessa funzionalità è necessario utilizzare

conticion ? foo = bar() : <other accion>; 
+0

con un nuovo codice, ha lo stesso significato –

2

La prima versione è solo una semplice affermazione.

La seconda versione è un'espressione che restituirà il risultato dell'intera espressione. Ciò probabilmente consente alcune complicate sintassi a una riga che, come al solito, potrebbero potenzialmente rendere il codice più leggibile ma più probabilmente renderà più complesso e difficile da analizzare rapidamente a causa della mancanza di familiarità.

IMO lo utilizzano ovunque in modo coerente in modo che i lettori del codice si abituino a esso o non lo utilizzino affatto.

0

Se & & non è sovraccarico per né condizione né foo:

condition && (foo = bar()); 

sarà trattata come

(condition.operator bool()) && (foo = bar()); 

se (condition.operator bool()) non è vero, (foo = bar()) non verrà eseguito e viceversa.

Problemi correlati