89 votes

Pourquoi utiliseriez-vous une affectation dans une condition?

Dans de nombreuses langues, les missions sont légales dans certaines conditions. Je n'ai jamais compris la raison derrière cela. Pourquoi voudriez-vous écrire:

 if (var1 = var2) {
  ...
}
 

au lieu de:

 var1 = var2;
if (var1) {
  ...
}
 

124voto

Gerald Points 13865

C'est plus utile pour les boucles que pour les déclarations if.

 while( var = GetNext() )
{
  ...do something with var 
}
 

Ce qui devrait autrement être écrit

 var = GetNext();
while( var )
{
 ...do something
 var = GetNext();
}
 

36voto

Jonathan Leffler Points 299946

Je trouve cela plus utile dans les chaînes d'actions qui impliquent souvent la détection d'erreur, etc.

 if ((rc = first_check(arg1, arg2)) != 0)
{
    report error based on rc
}
else if ((rc = second_check(arg2, arg3)) != 0)
{
    report error based on new rc
}
else if ((rc = third_check(arg3, arg4)) != 0)
{
    report error based on new rc
}
else
{
    do what you really wanted to do
}
 

L'alternative (ne pas utiliser l'affectation dans la condition) est la suivante:

 rc = first_check(arg1, arg2);
if (rc != 0)
{
    report error based on rc
}
else
{
    rc = second_check(arg2, arg3);
    if (rc != 0)
    {
        report error based on new rc
    }
    else
    {
        rc = third_check(arg3, arg4);
        if (rc != 0)
        {
            report error based on new rc
        }
        else
        {
            do what you really wanted to do
        }
    }
}
 

Avec une vérification d'erreur prolongée, l'alternative peut s'exécuter à partir de la RHS de la page alors que la version en affectation conditionnelle ne le fait pas.

31voto

Chris Young Points 8525

C'est plus utile si vous appelez une fonction:

 if (n = foo())
{
    /* foo returned a non-zero value, do something with the return value */
} else {
    /* foo returned zero, do something else */
}
 

Bien sûr, vous pouvez simplement mettre le n = foo (); sur une déclaration séparée puis si (n), mais je pense que ce qui précède est un idiome assez lisible.

24voto

Michael Burr Points 181287

Cela peut être utile si vous appelez une fonction qui renvoie des données à utiliser ou un indicateur pour indiquer une erreur (ou que vous avez terminé).

Quelque chose comme:

 while ((c = getchar()) != EOF) {
    // process the character
}

// end of file reached...
 

Personnellement, c'est un idiome que je n'aime pas énormément, mais parfois l'alternative est plus laide.

9voto

Greg Hewgill Points 356191

L'idiome est plus utile lorsque vous écrivez une boucle while au lieu d'une instruction if . Pour une déclaration if , vous pouvez la décomposer comme vous le décrivez. Mais sans cette construction, vous devriez soit vous répéter:

 c = getchar();
while (c != EOF) {
    // ...
    c = getchar();
}
 

ou utilisez une structure en boucle et demi:

 while (true) {
    c = getchar();
    if (c == EOF) break;
    // ...
}
 

Je préférerais généralement la forme en boucle et demie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X