2 votes

Pourquoi la commande " pour i dans {1..10} " est-elle différente de la commande " pour ((i=1 ; i<=10 ; i++))` " ?

J'ai écrit un code simple via bash script,

Code 1

for((i=1;i<=10;i++))
do
        echo $i 
        i=$((i+1))
        echo $i
        i=$((i+2))
done

sortie du code 1

1
2
5
6
9
10

Code 2

for i in {1..10}
do
        echo $i 
        i=$((i+1))
        echo $i
        i=$((i+2))
done

sortie du code 2

1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
10
11

Je me demande juste pourquoi les sorties ne sont pas les mêmes ?
Merci d'avance

6voto

choroba Points 56333

Avec in la variable itère sur la liste. Vous pouvez modifier sa valeur dans la boucle, mais lorsque l'itération suivante commence, la valeur suivante lui sera attribuée, quelle que soit la valeur que vous lui avez attribuée. (Et je n'arrive pas à imaginer un autre comportement : le shell doit-il essayer de deviner à quelle distance dans la liste vous voulez sauter ? Et si la valeur est répétée, ou pas du tout présente dans la liste) ?

Avec le style C for La variable est initialisée, et à chaque itération, sa valeur est modifiée et la condition est vérifiée. Il n'y a pas de liste de valeurs, seulement la condition pour terminer la boucle.

6voto

Charles Duffy Points 34134

Ces termes ne sont pas synonymes les uns des autres : Il s'agit de codes complètement différents, qui doivent se comporter de manière différente.

{1..10} est juste un raccourci pour 1 2 3 4 5 6 7 8 9 10 ; lorsque vous exécutez for i in 1 2 3 4 5 6 7 8 9 10 vous attribuez explicitement ces valeurs exactes a i à son tour, écrasant tout ce qui était là auparavant.

En revanche, for ((i=1; i<=10; i++)) fournit trois déclarations distinctes : Un site initialisateur ( i=1 ), qui lui indique ce qu'il doit faire pour démarrer la boucle ; un élément vérifier ( i<=10 ) pour lui indiquer comment déterminer si la boucle est terminée ; et un bouton mise à jour ( i++ ), lui indiquant ce qu'il doit faire entre les itérations de la boucle. Ce sont des commandes complètement arbitraires, et vous pouvez mettre n'importe quelle expression arithmétique que vous voulez dans ces positions.

1voto

markp Points 2561

El for((i=1;i<=10;i++)) pourrait être réécrite comme suit :

i=1                              # for loop's 'i=1'

while [[ "${i}" -le 10 ]]        # for loop's 'i<=10'
do
        echo $i
        i=$((i+1))
        echo $i
        i=$((i+2))
        ((i++))                  # for loop's 'i++'
done

Cela génère ... vous l'avez deviné ...

1
2
5
6
9
10

Charles Duffy a déjà élargi le for i in {1..10} pour montrer comment cela se passe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X