Ponga una verificación de condición y una asignación de variable en una declaración ‘if’

3 minutos de lectura

avatar de usuario de deddebme
deddebme

Estoy mirando un código C heredado y me confundí. Es algo como:

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

Todos sabemos que habrá una advertencia del compilador si hacemos if(A = B), pero aquí parece que el ‘if’ está comprobando A contra 1. ¿Estoy en lo correcto?

Avatar de usuario de Ferdinand Beyer
Ferdinand Beyer

En primer lugar, asigna el valor de B a A (A = B), luego verifica si el resultado de esta asignación, que es A y evalúa a 1es igual a 1.

Entonces, técnicamente, tiene razón: en el camino verifica A en 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);
}

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

    –David Heffernan

    28 de julio de 2011 a las 15:03

  • ¿Cómo es el original ambiguo? Estaba claro para ti, está claro para mí.

    – baash05

    7 de junio de 2013 a las 1:04

  • Es útil escribirlo de la manera en la pregunta en los casos en que sus declaraciones de resultados tengan que hacer esa asignación. En la superficie, le ahorra el acceso a la memoria/base de datos (dándose cuenta de que el compilador podría ser lo suficientemente inteligente como para hacerlo bajo el capó).

    – Lance Roberts

    30 de septiembre de 2019 a las 22:17

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

No hay nada “heredado” en esto, generalmente es un modismo bastante útil si necesita el resultado de una operación pero también desea verificar si hay errores:

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

  • sí, tu control foo() es como el control fopen(). El código que veo aquí es un poco más complicado, lo que me confundió un poco…

    – deddebme

    28 de julio de 2011 a las 14:26

Si desea mantenerlo en 1 línea:

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

hace lo mismo

Estamos tratando de evitar declaraciones if 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 existir una condición para actuar en (no) igualdad, véase este ejemplo.

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

fResult = (A == B);

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

return(fResult);

Avatar de usuario de Sander De Dycker
Sander De Dycker

Correcto. El valor A tiene después de la asignación se comparará con 1.

Este ejemplo de código es equivalente a solo:

return (TRUE);

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

    – itisravi

    30 de julio de 2011 a las 6:00

  • Espero que la pregunta esté diseñada para mostrar esto … B normalmente sería desconocido.

    – baash05

    7 de junio de 2013 a las 1:05

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

    – itisravi

    30 de julio de 2011 a las 6:00

  • Espero que la pregunta esté diseñada para mostrar esto … B normalmente sería desconocido.

    – baash05

    7 de junio de 2013 a las 1:05

¿Ha sido útil esta solución?