Estoy mirando un código C heredado y me confundí, es algo así como:
UINT A, B = 1; if((A = B) == 1){ return(TRUE); } else { return(FALSE); }
Todos sabemos que habrá una advertencia del comstackdor si lo hacemos si (A = B), pero aquí parece que el ‘si’ está verificando A contra 1, ¿estoy en lo correcto?
Primero, asigna el valor de B
a A
( A = B
), luego verifica si el resultado de esta asignación, que es A
y se evalúa como 1
, es igual a 1
.
Así que técnicamente estás en lo correcto: en la forma en que comprueba A
contra 1
.
Para facilitar la lectura, el código es equivalente a:
UINT A, B = 1; A = B; if(A == 1){ return(TRUE); } else { return(FALSE); }
Más bien, su código siempre está asignando B
a A
, y además está verificando si el valor de B
(y, por lo tanto, A
) es igual a 1
.
No hay nada “legado” acerca de esto, este es generalmente un modismo muy útil si necesita el resultado de una operación pero también desea verificar errores:
int result; if ((result = foo()) != -1) { printf("The result is: %i\n", result); } else { // panic }
Si quieres mantenerlo en 1 línea:
if ((A = B), A == 1)
hace lo mismo
Correcto. El valor que A
tiene después de la asignación se comparará con 1
.
Este ejemplo de código es equivalente a solo:
return (TRUE);
Estamos tratando de evitar si las declaraciones hacen 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, vea este ejemplo.
UINT A, B = 1; bool fResult = false; fResult = (A == B); if(fResult) { doThis(); } else { doThat(); } return(fResult);