2016-03-20 2 views
0

Dans le cadre d'un programme beaucoup plus important, j'utilise strtok dans une boucle while.Utilisation de strtok dans la boucle while; avertissement: utiliser le résultat d'une affectation comme condition sans parenthèses

while (cmd2Args [count] = strtok (NULL, " «)) {count ++;}

Mais l'avertissement suivant est reçu avertissement: en utilisant le résultat d'une cession comme condition sans parenthèses [- Wparentheses]

Le programme compile et fonctionne comme prévu. Dans quelles situations un tel avertissement devrait-il être pris en compte? Est-ce un mauvais style de programmation?

Répondre

1

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.