2011-07-28 31 views
7

Busco en algún código heredado C y se confundió, es algo así como:Put y asignación de variables en una sentencia if

UINT A, B = 1; 
if((A = B) == 1){ 
    return(TRUE); 
} else { 
    return(FALSE); 
} 

Todos sabemos que habrá una advertencia del compilador si hacemos si (A = B), pero aquí parece que el 'si' está marcando A contra 1, ¿estoy en lo correcto?

Respuesta

10

primer lugar, se asigna el valor de B-A (A = B), entonces se comprueba si el resultado de esta asignación, que es A y evalúa a 1, es igual a 1.

Entonces, técnicamente tiene razón: En el camino comprueba A contra 1.

Para hacer las cosas más fáciles de leer, el código es equivalente a:

UINT A, B = 1; 
A = B; 
if(A == 1){ 
    return(TRUE); 
} else { 
    return(FALSE); 
} 
+3

El hecho de que pueda escribir el código tal como se ha escrito en la pregunta, no significa que deba hacerlo. Siempre debe preferir el código como está escrito en esta respuesta porque no tiene ambigüedad. –

+6

¿Cómo es el original ambiguo? Fue claro para ti, está claro para mí. – baash05

5

Más bien, el código está asignando siempre B a A, y se está comprobando, además, si el valor de B (y por lo tanto también A) es igual a 1.

No hay nada "legado" sobre esto, esto es por lo general un lenguaje bastante útil si necesita el resultado de una operación, pero también desea comprobar si hay errores:

int result; 
if ((result = foo()) != -1) 
{ 
    printf("The result is: %i\n", result); 
} 
else 
{ 
    // panic 
} 
+0

, sí, su comprobación de foo() es como la de fopen(). El código que veo aquí es un poco más intrincado, lo que me confundió un poco ... – deddebme

0

correcta. El valor A tiene después de que la asignación se comparó con 1.

Este ejemplo de código es equivalente a poco:

return (TRUE); 
+0

Exactamente. Me pregunto si habría una situación en la que la asignación fallaría. Tiene sentido si el cheque era para el retorno. valor de una función como mencionó Kerrek SB. – itisravi

+0

Espero que la pregunta se haya ideado para mostrar esto ... B sería típicamente desconocido. – baash05

2

Si desea mantenerlo en 1 línea:

if ((A = B), A == 1) 

hace lo mismo.

0

Estamos tratando de evitar las declaraciones para hacer que el código sea más legible.

UINT A, B = 1; 
bool fResult = false; 

fResult = (A == B); 

return(fResult); 

Y si debe haber una condición para actuar sobre (no) la igualdad, consulte este ejemplo.

UINT A, B = 1; 
bool fResult = false; 

fResult = (A == B); 

if(fResult) 
{ 
    doThis(); 
} 
else 
{ 
    doThat(); 
} 

return(fResult); 
Cuestiones relacionadas