2010-02-16 6 views
2

Étant donné cette boucle, pourquoi y a-t-il un point-virgule à la fin?Ne comprends pas cette syntaxe

for(s = string; *s == ' '; s++) 
    ; 

grâce

modifier * est donc possible d'inverser cette procédure il commence à la fin d'une chaîne et vérifie un espace et diminue jusqu'à ce qu'il trouve un charachter?

+0

changez-le pour utiliser ++ s - il a le potentiel de produire un meilleur code. –

+4

Pourquoi cela améliorerait-il le code? Ce serait exactement la même chose dans cet exemple. – Marius

+0

Ce serait le cas si vous avez un compilateur qui a l'optimisation correcte (ce qui fait le plus, d'où le mot "potentiel"). Il est recommandé d'utiliser le pré-incrémentiel à moins que l'incrémentation ne soit nécessaire - l'optimisation n'est généralement pas appliquée aux types non intégrés. –

Répondre

0

La boucle ne fait rien. Tout ce qui arrive est que le pointeur est avancé.

3

Le point-virgule signifie que rien n'est fait à l'intérieur de la boucle. Dans votre code, la boucle boucle juste jusqu'à ce que le caractère de la chaîne ne soit pas un espace. C'est-à-dire, après que cette ligne pointe vers le premier caractère de la chaîne qui n'est pas un espace.

3

Le point-virgule fait une déclaration vide dans la boucle. Cette boucle recherche le premier char non vide string.

6

Il est une déclaration vide, ce qui est un non-op en C. Il est comme si vous aviez dit:

for(s = string; *s == ' '; s++) 
{ 
    // do nothing 
} 

Vous utilisez quand tout peut être fait dans la for(...) construction lui-même - la grammaire C exige qu'il y ait une déclaration contrôlée, mais il n'y a rien à faire.

+0

Je ne comprends pas pourquoi cela n'a pas été accepté comme la réponse après 6 ans –

0

Il doit y avoir une instruction ou un bloc comme "corps" de la boucle for. C'est ce qui est exécuté à chaque fois dans la boucle (tant que s pointe toujours sur un espace).

un point-virgule lui-même est la déclaration vide - qui est, rien ne se passe dans le corps de la boucle, juste la s++ sur la ligne de boucle for.

1

Parce que dans C (et d'autres) pour la grammaire est la suivante: pour (init; condition; étape) corps

où le corps peut être une fermeture (un bloc de code dans {}), mais le corps peut aussi être vide avec;

1

Je voudrais souligner que la boucle pourrait être écrit comme ceci pour le rendre plus explicite ce qui se passe et d'accroître la lisibilité:

for(s = string; *s == ' ';) 
    s++; 

ou en utilisant une boucle while:

s = string; 
while(*s == ' ') 
    s++; 

Mais je pense que la première approche avec le corps vide est plus "c-idiomatique" (et plus difficile à lire).

+0

L'augmentation de la lisibilité est à vos yeux seulement , A MON HUMBLE AVIS.Le fait que le formulaire original soit idiomatique est ce qui le rend facile à lire pour les programmeurs expérimentés. –

+0

Eh bien, la * seule * raison pour laquelle nous en parlons est que le PO avait du mal à le comprendre ... –

Questions connexes