過去に掲載していた『特異なfor文の記述』を一部修正の上、再掲載する。
for文は次の様に定義されていると考えられがちである。
一般的なfor文に対する認識
for([カウンタの開始値(初期化)];[カウンタの終了値];[カウンタの増減値]){
[実行文]
}
[実行文]
}
ここで一旦VBScriptの記述を見てる。
VBScriptのfor文(Step以降は省略可。省略時は[Step 1]と見なされる。)
For [カウンタの開始値(初期化)] To [カウンタの終了値] Step [カウンタの増減値]
[実行文]
Next
[実行文]
Next
0から9までループする処理をそれぞれの方法で記述してみる。
0から9までループ(JavaScript)
for(i=0;i<10;i++){
[実行文]
}
[実行文]
}
0から9までループ(VBScript)
For i=0 To 9
[実行文]
Next
[実行文]
Next
JavaScriptはなぜ変数[i]を複数回記述しなければならないのか。次の様に記述させてもよさそうに思える。
JavaScript似の仮想言語によるfor文
for(i=0;10;1){ //もしくは[for(i=0;9;1){]
[実行文]
}
[実行文]
}
実はfor文の定義は次のようになってる。
JavaScriptのfor文
for([ループ初回に実行される処理];[ループを抜ける為の条件(真偽値)];[ループ2回目以降に実行される処理]){
[実行文]
}
[実行文]
}
処理を詳細に追ってみよう。
for文の処理を詳細に追う
for(i=0;i<10;i++){
alert(i.toString(10));
}
i=0 [ループ初回に実行される処理]
i<10 [真偽値判定] (0<10=true)
alert(i.toString(10)); [実行文] ("0"を表示)
i++ [ループ2回目以降に実行される処理] (i=1)
i<10 [真偽値判定] (1<10=true)
alert(i.toString(10)); [実行文] ("1"を表示)
i++ [ループ2回目以降に実行される処理] (i=2)
i<10 [真偽値判定] (2<10=true)
alert(i.toString(10)); [実行文] ("2"を表示)
・
・
・
i++ [ループ2回目以降に実行される処理] (i=9)
i<10 [真偽値判定] (9<10=true)
alert(i.toString(10)); [実行文] ("9"を表示)
i++ [ループ2回目以降に実行される処理] (i=10)
i<10 [真偽値判定] (10<10=false)
[ループを抜ける]
alert(i.toString(10));
}
i=0 [ループ初回に実行される処理]
i<10 [真偽値判定] (0<10=true)
alert(i.toString(10)); [実行文] ("0"を表示)
i++ [ループ2回目以降に実行される処理] (i=1)
i<10 [真偽値判定] (1<10=true)
alert(i.toString(10)); [実行文] ("1"を表示)
i++ [ループ2回目以降に実行される処理] (i=2)
i<10 [真偽値判定] (2<10=true)
alert(i.toString(10)); [実行文] ("2"を表示)
・
・
・
i++ [ループ2回目以降に実行される処理] (i=9)
i<10 [真偽値判定] (9<10=true)
alert(i.toString(10)); [実行文] ("9"を表示)
i++ [ループ2回目以降に実行される処理] (i=10)
i<10 [真偽値判定] (10<10=false)
[ループを抜ける]
この様な動作になっている為、次の様な変わった記述も可能なのである。
特異なfor文の例
for(var str="";str.length<50;str+=prompt("入力して下さい。\nstr=\""+str+"\"","")){}
これを一般的な記述方法に書き換えてみよう。
一般的な記述に書き換えた例
var str="";
while(str.length<50){
str+=prompt("入力して下さい。\nstr=\""+str+"\"","");
}
while(str.length<50){
str+=prompt("入力して下さい。\nstr=\""+str+"\"","");
}
これらの特異なfor文は推奨しない。ごく一般的なPGはfor文を見ると[カウンタ付のループ]と判断する。[カウンタ付のループ]の定義部分で文字列の操作が行なわれているとは夢にも思わないだろう。