Presque toutes les langues ont une foreach
boucle ou quelque chose de similaire. Est-ce que C en a un? Pouvez-vous publier un exemple de code?
110
Presque toutes les langues ont une foreach
boucle ou quelque chose de similaire. Est-ce que C en a un? Pouvez-vous publier un exemple de code?
foreach
" de quoi?foreach
boucle dans un programme C?Réponses:
C n'a pas de foreach, mais les macros sont fréquemment utilisées pour émuler cela:
Et peut être utilisé comme
L'itération sur un tableau est également possible:
Et peut être utilisé comme
Edit: Si vous êtes également intéressé par les solutions C ++, C ++ a une syntaxe native for-each appelée "range based for"
la source
#define foreach(item, array) int count=0, size=sizeof(array)/sizeof(*(array)); for(item = (array); count != size; count++, item = (array)+count)
un problème que je peux voir est que le nombre et la taille des variables vivent en dehors de la boucle for et peuvent provoquer un conflit. Est-ce la raison pour laquelle vous utilisez deux boucles for? [code collé ici ( pastebin.com/immndpwS )]if(...) foreach(int *v, values) ...
. S'ils sont en dehors de la boucle, il s'agranditif(...) int count = 0 ...; for(...) ...;
et se cassera.Voici un exemple de programme complet d'une macro for-each en C99:
la source
list[]
définition? Ne pourriez-vous pas simplement écrire à lanext
place de.next
?free()
) et d'autre part, il a une référence à la valeur dans sa définition. C'est vraiment un exemple de quelque chose qui est tout simplement trop intelligent; le code est assez complexe sans y ajouter intentionnellement de l'intelligence. L'aphorisme de Kernighan ( stackoverflow.com/questions/1103299/… ) s'applique!Il n'y a pas de foreach dans C.
Vous pouvez utiliser une boucle for pour parcourir les données mais la longueur doit être connue ou les données doivent être terminées par une valeur connue (par exemple, null).
la source
Comme vous le savez probablement déjà, il n'y a pas de boucle de style "foreach" dans C.
Bien qu'il existe déjà des tonnes de bonnes macros fournies ici pour contourner ce problème, vous trouverez peut-être cette macro utile:
... qui peut être utilisé avec
for
(comme dansfor each (...)
).Avantages de cette approche:
item
est déclaré et incrémenté dans l'instruction for (comme en Python!).p
,item
), ne sont pas visibles en dehors de la portée de la boucle (puisqu'elles sont déclarées dans l'en-tête de la boucle for).Désavantages:
typeof()
, qui est une extension GNU, ne fait pas partie du standard CJuste pour vous faire gagner du temps, voici comment vous pouvez le tester:
Semble fonctionner sur gcc et clang par défaut; n'ont pas testé d'autres compilateurs.
la source
C'est une question assez ancienne, mais je pensais que je devrais la poster. C'est une boucle foreach pour GNU C99.
Ce code a été testé pour fonctionner avec gcc, icc et clang sous GNU / Linux.
la source
Bien que C n'ait pas de pour chaque construction, il a toujours eu une représentation idiomatique pour un après la fin d'un tableau
(&arr)[1]
. Cela vous permet d'écrire une idiomatique simple pour chaque boucle comme suit:la source
(&arr)[1]
ne signifie pas un élément de tableau après la fin du tableau, cela signifie un tableau après la fin du tableau.(&arr)[1]
n'est pas le dernier élément du tableau [0], c'est le tableau [1], qui se désintègre en un pointeur vers le premier élément (du tableau [1]). Je pense que ce serait bien mieux, plus sûr et idiomatique à faireconst int* begin = arr; const int* end = arr + sizeof(arr)/sizeof(*arr);
et ensuitefor(const int* a = begin; a != end; a++)
.C a des mots-clés «for» et «while». Si une instruction foreach dans un langage comme C # ressemble à ceci ...
... alors l'équivalent de cette instruction foreach en C pourrait être comme:
la source
Voici ce que j'utilise quand je suis coincé avec C.Vous ne pouvez pas utiliser le même nom d'élément deux fois dans la même portée, mais ce n'est pas vraiment un problème car nous ne pouvons pas tous utiliser de nouveaux compilateurs sympas :(
Usage:
EDIT: Voici une alternative pour
FOREACH
utiliser la syntaxe c99 pour éviter la pollution de l'espace de noms:la source
VAR(i) < (size) && (item = array[VAR(i)])
s'arrêterait une fois que l'élément du tableau avait une valeur de 0. Donc, l'utiliser avecdouble Array[]
peut ne pas parcourir tous les éléments. On dirait que le test de boucle devrait être l'un ou l'autre:i<n
ouA[i]
. Ajoutez peut-être des exemples de cas d'utilisation pour plus de clarté.if ( bla ) FOREACH(....) { } else....
FOREACH
qui utilise la syntaxe c99 pour éviter la pollution de l'espace de noms.La réponse d'Eric ne fonctionne pas lorsque vous utilisez "pause" ou "continuer".
Cela peut être corrigé en réécrivant la première ligne:
Ligne d'origine (reformatée):
Fixé:
Si vous le comparez à la boucle de Johannes, vous verrez qu'il fait en fait la même chose, juste un peu plus compliqué et plus laid.
la source
En voici une simple, une seule boucle for:
Vous donne accès à l'index si vous le souhaitez (
i
) et à l'élément actuel sur lequel nous itérons (it
). Notez que vous pouvez rencontrer des problèmes de dénomination lors de l'imbrication de boucles, vous pouvez faire des noms d'élément et d'index des paramètres de la macro.Edit: Voici une version modifiée de la réponse acceptée
foreach
. Vous permet de spécifier l'start
index,size
afin qu'il fonctionne sur des tableaux décomposés (pointeurs), inutileint*
et changécount != size
eni < size
juste au cas où l'utilisateur modifierait accidentellement `` i '' pour être plus grand quesize
et rester coincé dans une boucle infinie.Production:
la source
Si vous prévoyez de travailler avec des pointeurs de fonction
Usage:
Mais je pense que cela ne fonctionnera que sur gcc (pas sûr).
la source
C n'a pas d'implémentation de
for-each
. Lors de l'analyse d'un tableau en tant que point, le récepteur ne sait pas combien de temps dure le tableau, il n'y a donc aucun moyen de savoir quand vous atteignez la fin du tableau. Souvenez-vous qu'en Cint*
est un point vers une adresse mémoire contenant un int. Il n'y a pas d'objet d'en-tête contenant des informations sur le nombre d'entiers placés en séquence. Ainsi, le programmeur doit garder une trace de cela.Cependant, pour les listes, il est facile d'implémenter quelque chose qui ressemble à une
for-each
boucle.Pour obtenir quelque chose de similaire pour les tableaux, vous pouvez effectuer l'une des deux opérations suivantes.
Voici un exemple d'une telle structure:
la source