1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

for で散々盛り上がったようですが...

Last updated at Posted at 2023-08-18

for も,言語によって文法,実行結果は色々です。
同じ for という単語が使われていても,言語によって実際の挙動は違う可能性があります。


制御変数を途中でいじるとどうなる?

C においては,途中で制御変数を変更すると,意図した通り(?)次のループは変更した値を更新した値で実行されます。i を 5 にして,しかる後次のループでは i++ して 6 として実行。

#include <stdio.h>
int main(void){
    int i;
    for (i = 0; i < 10; i++) {
        printf("%d\n", i);
        if (i == 3) {
            i = 5;
        }
    }
}

実行結果

0
1
2
3
6
7
8
9

Python では,制御変数をどういじろうが,粛々と実行が進みます。
つまり,前もって制御変数のリスト(正確な用語ではないかもしれないが)が作られそのリストに従って,順に制御変数に割り当ててループが実行される。

for i in range(10):
    print(i)
    if i == 3:
        i = 5
0
1
2
3
4
5
6
7
8
9

ループを break で脱出したあとの制御変数の値はどうなる

Python では,break したときの値が保存されています。

for i in range(10):
    if i == 3:
        break
print(i)
3

C でも,同じです。

#include <stdio.h>
int main(void){
    int i;
    for (i = 0; i < 10; i++) {
        if (i == 3) {
            break;
        }
    }
    printf("%d\n", i);
}
3

でも,Julia だと,スコープの関係で,ループを抜け出すと制御変数は「蒸発」しています。

julia> for i = 0:9
           if i == 3
               break
           end
       end

julia> print(i)
ERROR: UndefVarError: `i` not defined
Stacktrace:
 [1] top-level scope
   @ REPL[2]:1

なんだかんだと言っても,for にしろ何にしろ,それぞれの言語仕様によるので,一概に 「for はなんとかかんとかなんだよ。」と決めつけるのは良くないでしょうね。

C や BASIC (ALGOL なども),for は 「 i を 1 から n まで k 刻みで変化させて以下を実行してね」ということだったけど
Python や Julia その他の for は「i を 1 から n まで k 刻みまで変化してできる集合を順番に取って,以下を実行してね」になっている。だから,途中で制御変数をいじっても,何の遅滞もなく物事が進む。

今更ではあるが,「ドイツ語のfürの意味」についてあえてこじつけるなら,昔の言語 C, BASIC, ALGOL は「❼ ⸨時間的⸩ ⸨期間を表して⸩ …の間〔の予定で〕; ⸨予定の日時を表して⸩ …に.」なのかもしれないが,最近の新しい言語では「❿ ⸨反復・連続;無冠詞の同一語を反復して⸩ …ずつ, …ごとに.」に近いのかもしれない。

後者に関しては,for each に近いのだろう。繰り返しについてはあと2つ,for next, do loop がある。

要するに,「郷に入れば郷に従え」。個人的な感想・感慨はおいておいて,各言語の文法規約に従いましょう。従わないとプログラムが動かないんだからしようがない。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?