Quelle sera la valeur de strlen (str) – 1 dans une condition de boucle ‘pour’ lorsque str est vide?

J’parsing un scénario:

char str[] = ""; // Understand 

Si je comprends bien strlen(str) , il s’agit de 0. C’est bien.

 printf(" %d, %ul, %u, %d, %ul, %u", strlen(str), strlen(str), strlen(str), strlen(str) - 1, strlen(str) - 1, strlen(str) - 1); 

La sortie est:

0, 0l, 0, -1, 4294967295l, 4294967295

Je les comprends aussi bien.

 for (int i = 0; i < strlen(str) - 1; i++) { } 

Ici, je ne comprends pas ce que la valeur de strlen(str) - 1 serait dans la condition de boucle for .

strlen(str) - 1 donne la valeur 4294967295 dans la boucle for. Pourquoi donc? Pourquoi pas -1?

Cette déclaration

 printf(" %d, %ul, %u, %d, %ul, %u", strlen(str),strlen(str),strlen(str),strlen(str)-1,strlen(str)-1,strlen(str)-1); 

montre que lorsque strlen( str ) - 1 est sorti comme un entier non signé, par exemple, en utilisant le spécificateur de format %ul sa valeur est 4294967295l

Dans l’état de la boucle

 for (int i=0;i 

le compilateur doit déterminer le type commun des opérandes gauche et droit ainsi que le type du résultat de la condition

 i 

L'opérande droit strlen(str)-1 a le type size_t (le type de retour de la fonction strlen est size_t ). C'est un type entier non signé qui correspond habituellement à unsigned long . Il ne peut pas avoir de valeurs négatives. Toute valeur stockée dans un object de ce type est interprétée comme une valeur non négative et, comme le montre la sortie, la valeur de strlen(str)-1 est égale à 4294967295l . (La valeur réelle que vous pourriez obtenir si vous size_t spécificateur de type %zu car il n'est peut-être pas exclu que size_t puisse correspondre même à unsigned long long)

L'opérande de droite a le type int . Son rang est au moins pas supérieur au rang de size_type. Ainsi, les deux opérandes sont convertis en type size_t et ont des valeurs non négatives.

Cette procédure de détermination du type commun s'appelle les conversions arithmétiques usuelles. Il est évident que 4294967295l est supérieur à 0. Ainsi, la boucle itérera 4294967295l fois si elle n'a pas d'instruction break.

Vous pouvez obtenir le résultat attendu si vous réécrivez la condition dans la boucle de la manière suivante

 for ( int i = 0; i < ( int )strlen( str ) - 1; i++ ) 

strlen retourne size_t qui est un entier non signé. Ainsi, strlen(str)-1 produira SIZE_MAX (la valeur maximale que size_t peut contenir) si strlen(str) est size_t 0 .

Vous devriez utiliser %zu pour imprimer les valeurs size_t .