2011-09-29 10 views
5

Encontré un código que usó esto, lo que me llevó a preguntarme.C++: ¿Comparación lógica como enunciado condicional?

if(condition) foo = bar(); 

condition && (foo = bar()); 

¿Estos dos segmentos de código son iguales a un compilador? Si no, ¿de qué manera diferirían?

+0

Tal técnica se utiliza aquí: [Encuentre un máximo de tres números en C sin utilizar la instrucción condicional y el operador ternario] (http://stackoverflow.com/questions/7074010/find-maximum-of-three-number-in- c-without-using-conditional-statement-and-ternary) – Nawaz

+0

Nawaz - Una solución tan elegante para una tarea tan inútil. : P –

Respuesta

1

A menos && está sobrecargado para la combinación de tipos de condition y foo tendrán un comportamiento idéntico - este último funciona de esta manera:

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

que es habitual cortocircuitos - si el primer componente del && es false el segundo no se evalúa.

IMO la segunda variante es mucho menos legible.

6

Debido a precedencia operador, este último se interpreta como:

(condition && foo) = bar(); 

Adicionalmente, hay una posibilidad de && ser sobrecargado, lo que puede resultar en casi cualquier cosa.

En resumen: no son para nada iguales, al menos en general.

+0

¡Ah, sí lo eres! Ese fue mi error, sin embargo, el paréntesis está presente en el código que he visto. Se corrigió la pregunta –

1

A menos que condition && foo evalúe como lvalue, condition && foo = bar(); no tiene sentido.

+0

Lo siento, omití incluir el paréntesis, se corrigió. –

0

Hay un error del compilador: l-value no válido. Para tener la misma funcionalidad, debe usar

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

con un nuevo código, tiene el mismo significado –

2

La primera versión es simplemente una declaración simple.

La segunda versión es una expresión que devolverá el resultado de la expresión completa. Eso probablemente permite una sintaxis complicada de una sola línea que, como es habitual, podría hacer que el código sea más legible, pero lo más probable es que lo haga más complejo y más difícil de analizar rápidamente debido a la falta de familiaridad.

IMO o lo usa en todas partes de forma consistente para que los lectores de su código se acostumbren a él, o no lo utilicen en absoluto.

0

Si & & no está sobrecargado por ninguna de las condiciones ni foo:

condition && (foo = bar()); 

serán tratados como

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

si (condition.operator bool()) no es cierto, (foo = bar()) no se ejecutará y viceversa.