電子書籍の厳選無料作品が豊富!

# 0から6未満の間で変数$aを1つずつ上げていく
for ($a=0;$a<6;$a++){
# もし変数$aが3になればredo文を実行してブロック内の頭に飛べ。
if($a==3){
# 変数$aを表示して改行せよ。
print "$a a \n";
# 変数$aに100を代入せよ。
$a=100;
redo;
}
# 変数$aを表示して改行せよ。
print "$a\n";
}

と書いてみたのですが、実行結果が

0
1
2
3 a
100

となりました。
if($a==3)まで戻っていないように思います。redoのブロックが終わりぬけて100が表示されているのでしょうか。

A 回答 (4件)

forの1回目、$a=0、$a<6が真なのでforの中に入る。

1回目なので$a++は実行されない
{# forの開始カッコ
if($a==3){ # $a=0 のためif文の中に入らない
}
print "$a\n"; "0\n"を出力
} # for()の閉じカッコ

forの2回目、$a++を実行($a=1となる)、$a<6は真なのでforの中に入る
{# forの開始カッコ
if($a==3){ # $a=0 のためif文の中に入らない
}
print "$a\n"; "1\n"を出力
} # for()の閉じカッコ

forの3回目、$a++を実行($a=2となる)、$a<6は真なのでforの中に入る
{# forの開始カッコ
if($a==3){ # $a=0 のためif文の中に入らない
}
print "$a\n"; "2\n"を出力
} # for()の閉じカッコ

forの4回目、$a++を実行($a=3となる)、$a<6は真なのでforの中に入る
{# forの開始カッコ
if($a==3){ # $a=3 のためif文の中に入る
print "$a a\n"; # "3 a\n"を出力
$a=100; # $a=100に変わる
redo # forまで戻るが、for($a=0;$a<6;$a++)の判定は行わない。
} # ifの閉じカッコ、redoで戻っているため実質的に無視される
print "$a\n"; # redoで戻っているため、実行されない
} # forの閉じカッコ、redoで戻っているため実質的に無視される

# forの5回目、redoにより$a<6は判定されない。$a++は実行されない。($a=100のまま)
if($a==3) # $a=100 のためif文に入らない
}
print "$a\n"; # "100\n"を出力
} # for()の閉じカッコ

forの6回目、$a++を実行($a=101となる)、$a<6は偽なのでforの中に入らない
{
}# for()の閉じカッコ

# forを抜けて終了

redo直前の$a=100;をコメントアウトすると、無限ループになります。
ここまで書く必要があるのだろうか、、と思いつつ、書いちゃったんでそのまま投稿。
    • good
    • 0

確かredoはループの制御ですから、ifまでではなく、forのすぐ後まで戻るはずです。


そう考えれば、次のif判定では3でないので、forの判定文まで戻り、$aが6以上なので、終了しているものだと思われます。
for ($a=0;$a<6;$a++){
print "Start\n";
if($a==3){
print "$a a \n";
$a=100;
redo;
}
print "$a\n";
print "end\n\n";
}
この[print "Start\n";]と[print "end\n";]を入れた改造サンプルを実行してみてください。forのすぐ後まで戻ればStartという文字列を表示し、ループの最後まで実行すれば、Endという文字列を表示します。
実行結果は3 aの後ろにはEndではなくStartと表示され、100の後にEndが表示されます。
つまり、ちゃんとredoで戻っていることが確認できるはずです。(ちなみに、ループが終わるごとに空行を入れているので、一回の動作が分かりやすいと思います。)
    • good
    • 0

if($a==3)まで戻っていると思いますよ?


ただ、そのときは$aが100なためにif文ブロック内は実行されないので、
出力はredoがあってもなくても同じですが。

それとも、redoでifブロックがやり直されると思ってますか?
last,next,redoはループ制御文なので、
redoはループブロックの始めから再実行ですよ。
(ifブロックがやり直されてしまうとループ制御できませんからね。)

> ANo.1
> $a<6ではないですから、ループの中は実行されず、次の行に移ってます
redoはループ条件を再評価しないので、redo後少なくとも1回は実行されるはず。
    • good
    • 0

そうです。


$a = 100
ですから
$a<6ではないですから、ループの中は実行されず、次の行に移ってます
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!