# 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が表示されているのでしょうか。
No.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;をコメントアウトすると、無限ループになります。
ここまで書く必要があるのだろうか、、と思いつつ、書いちゃったんでそのまま投稿。
No.3
- 回答日時:
確か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で戻っていることが確認できるはずです。(ちなみに、ループが終わるごとに空行を入れているので、一回の動作が分かりやすいと思います。)
No.2
- 回答日時:
if($a==3)まで戻っていると思いますよ?
ただ、そのときは$aが100なためにif文ブロック内は実行されないので、
出力はredoがあってもなくても同じですが。
それとも、redoでifブロックがやり直されると思ってますか?
last,next,redoはループ制御文なので、
redoはループブロックの始めから再実行ですよ。
(ifブロックがやり直されてしまうとループ制御できませんからね。)
> ANo.1
> $a<6ではないですから、ループの中は実行されず、次の行に移ってます
redoはループ条件を再評価しないので、redo後少なくとも1回は実行されるはず。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby プログラミング 3 2023/06/09 14:30
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP PHP ページング データベース 1 2022/06/16 10:30
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 10:07
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) vbaのループ処理について 6 2022/05/06 15:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
foreach 回数制限
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
セレクトメニューで2つの項目...
-
メモリをアドレスを直接指定し...
-
文字の横にプルダウンを表示さ...
-
テーブル内でドロップダウンメ...
-
[Ruby] irbにおける文字化け
-
数値かどうかの判定方法
-
実行時エラー 3020の対策
-
エクセルVBA シート名の部分一...
-
変数名に変数を使用
-
formで特定のinputを送信しない...
-
phpでボタンを押したときに変数...
-
Python - Excel で Webからデー...
-
文字のカラーとフォントの指定...
-
子windowsからsubmit()後にclos...
-
【至急!!!】python言語で本を見...
-
FindFirst を複数条件で検索
-
16進の10進変換について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CLispのloop内の挙動について
-
Perlで自分自身の関数名を知る...
-
Net::Telnetでタイムアウト時間...
-
print <<"_HTML_"の中でサブル...
-
Rubyのgets関数について
-
10進数→2進数
-
CGI初心者です
-
Perlで複数の値を返す良い方法...
-
作業域が消える(ように見える)
-
検索機能の作成で困っています
-
Pythonのマルチプロセスでの並...
-
ハノイの塔の問題で困っており...
-
LISPで連想配列の操作?
-
PERLの「!=」と「=~」 or...
-
PerlでCabochaを呼び出すには(...
-
foreach 回数制限
-
シェルでawkを使い行数を取り出...
-
Wコロン
-
HASH(0xほげほげ)
-
プロトタイプ宣言のワーニング...
おすすめ情報