2013-04-15 2 views
1

J'ai un peu de difficulté à comprendre ce que fait exactement une condition de test de la boucle For à un pointeur, ou même à la définir sans aucune valeur. Comparaison. Un exemple de code, je travaille avec mes devoirs est:Quelle est la fonction de définition d'une condition de test de la boucle for à un pointeur?

int f (char *s, char *t) { 
    char *p1, *p2; 
    for (p1 = s; *p1; p1++) { 
    for (p2 = t; *p2; p2++) 
     if (*p1==*p2) break; 
    if (*p2 == ‘\0’) break; 
    } 
return p1-s; 
} 

Je ne suis pas à la recherche d'une explication de la fonction, plus juste une explication de la condition de test sur les deux pour les boucles.

+0

'* p1' et' * p2' ne sont pas des pointeurs. –

Répondre

3
for (p1 = s; *p1; p1++) { 
    for (p2 = t; *p2; p2++) { 

Il est équivalent à comparer *p1 et *p2 à NUL (\0). Les boucles se terminent lorsque les terminaisons NUL des chaînes sont atteintes.

for (p1 = s; *p1 != '\0'; p1++) { 
    for (p2 = t; *p2 != '\0'; p2++) { 

Vous pouvez utiliser ce raccourci dans les déclarations if et while ainsi, et pour d'autres types. Laisser la condition vérifie la variable par rapport à la valeur zéro par défaut pour son type: '\0' pour les caractères, 0 pour les entiers, 0.0f ou 0.0 pour les flottants et les doubles, NULL pour les pointeurs.

p = malloc(n); 
if (p) { 
    // if p is not null 
} 

int len = strlen(s); 
while (len--) { 
    // loop until len reaches 0 
} 
1

for (p1 = s; *p1; p1++) continue à exécuter la boucle tandis que *p1 est vrai, à savoir, tandis que la valeur de caractère à l'adresse p1 est différent de zéro, à savoir, tandis que p1 ne pointe pas vers un octet NUL.

+0

+1 Bonne réponse. Ceci est dû à la façon dont une boucle est transformée en assemblage - regardez-le user2281043 :) –

+0

Merci, c'est ce que je pensais, mais je voulais un deuxième avis – ntharrison

+1

Cela n'a rien à voir avec "la façon dont la boucle est transformée en assemblage ", c'est une question de définition du langage. –

-1

Chaque personnage dans la boucle extérieure:

for (p1 = s; *p1; p1++) { 
} 

est testé caractère par caractère contre la boucle interne en utilisant l'arithmétique de pointeur et s'il y a match, puis break

for (p2 = t; *p2; p2++) 
    if (*p1==*p2) break; 

Fin de caractère ou est NULL pour la boucle interne puis se sépare aussi de la boucle

if (*p2 == ‘\0’) break; 
Questions connexes