Poner verificación de condición y asignación de variables en una sentencia if

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);