Oui, c'est un mauvais style de programmation. Si le code est écrit exactement comme vous le souhaitiez, vous pouvez ne pas tenir compte de l'avertissement, mais ce n'est peut-être pas le cas.
En C, une affectation est une expression. Cela signifie que le code x = 4;
n'attribue pas seulement une valeur de 4 à x
, c'est une valeur de 4 en soi. Ainsi, vous pouvez écrire y = (x = 4);
et votre y
aura une valeur de 4.
Cela dit, la clause while
doit avoir une valeur entre parenthèses.
while(value) { /* loop body */ }
Très souvent, vous devez comparer deux valeurs là-dedans, comme while(x == 42) { /* do stuff */ }
. Mais que se passe-t-il si vous oubliez de mettre une seconde '=' et d'écrire while(x = 42) { /* do stuff */ }
?
Eh bien, au lieu de comparaison, vous avez une affectation. Mais voici l'astuce. Ils sont tous les deux valeurs (expressions, pour être correct). Et tandis que x == 42
a une valeur de zéro lorsque x
est différent de 42
, x = 42
aura toujours une valeur de 42
et passera le test de condition.
C'est pourquoi les compilateurs modernes ont mis un avertissement s'ils voient une mission intérieur while
, if
, et ainsi de suite. Si le code est correct et que vous voulez vraiment avoir l'affectation là-bas, mettez un ensemble de parenthèses supplémentaires autour de celui-ci.
while((cmd2Args[count] = strtok(NULL, " "))) {count++}
qui nous en revenir au message d'avertissement du compilateur: Si vous voulez utiliser le résultat d'une cession comme condition, de mettre des parenthèses autour d'elle.
Autre façon d'écrire, il serait
while((cmd2Args[count] = strtok(NULL, " ")) != 0) {count++}
où l'intention du programmeur est clairement.