![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
質問1.自分で簡単なプログラムを作ってみて簡単な実験をしてみたのですが,break;を使うとループをすべて抜けるのではなくいくつかループがある場合『一番内側のループを抜ける』ということでいいのでしょうか?
例えば
do
{
}while()
while(){
}
for(i=0;i<N;i++)
のループにはすべてbreak;は通じるのでしょうか?この他にbreak;が使えるループはありますか?
2.これも自分で試しに実験してみたのですが,
#define R (double)rand()/32767.0
としておいて
例えば,
a=sin(R);
b=a;
のように使用した場合,
a=sin(R)の部分では乱数が新たな値に更新されるが,
b=aの部分では乱数が新たな値に更新されない感じがします。
結論:Rが見える形で含まれていれば乱数の値は更新され,Rが見えない形で含まれていると乱数の値は更新されない。
ってことでしょうか?
これは#defineの部分に何か秘密があるような気がします。詳しい方回答よろしくお願いします。
No.5ベストアンサー
- 回答日時:
質問1について。
>『一番内側のループを抜ける』ということでいいのでしょうか?
その通りです。
breakは3種のループすべてに使えます。
C言語で使われる反復文(ループする命令)はその3種類だけです。
他に、反復文ではないけれど、switchでbreakが使えます。
3種の反復文の中とswitchの中以外ではbreakは使えません。
質問2について。
乱数が新たな値に更新されない、ということですが、
それが自然です。
「代入したのだから、変数b と sin((double)rand()/32767.0) は同じ」
と考えたのかもしれませんが、それは違います。
a=sin(R);
の時点で、rand()で作られた乱数は、
ある数値となってaに格納されます。
aに格納された後は、単なる数値でしかありません。
bに代入するのはその値になります。
「Rを使うとその都度違う乱数が出てくるのに、
=による代入では違う」といったところで混乱が起きたのかもしれません。
#defineは、単なる「文字列の置き換え」です。
コンパイルの最初の方で展開されます。
だから
sin(R);
は
sin((double)rand()/32767.0);
とおきかえられます。
Rの出てくるところは、毎回、このように記述したのと同じなのです。
>3種の反復文の中とswitchの中以外ではbreakは使えません。
ということはもしその中以外で使うとエラーになるということでしょうか??
>a=sin(R);
>の時点で、rand()で作られた乱数は、
>ある数値となってaに格納されます。
>aに格納された後は、単なる数値でしかありません。
>bに代入するのはその値になります。
この説明なるほど納得です!!言われてみれば当たり前の事ですが,僕は今まで理解しているようで理解できていませんでした。もはやb=aのaはある確定した値にすぎないのですね!!
とても素晴らしい回答ありがとうございました。
No.9
- 回答日時:
gotoが大好きな者です。
(笑)gotoは禁じ手なので使いたくないという向きであれば、たとえば
while ( xxx ) {
f = 0 ;
while ( xxx ) {
if ( xxx ) {
f = 1 ;
break ;
}
}
if ( f ) {
break ;
}
}
のように工夫すればgotoなしで一気に抜けられます。
forなら外側のループカウンタをむりやり終了値にしてしまうなんてのもありです。
でも、こんなまどろっこしいことするなら素直にgoto使えといいたくなるかもしれませんけどね。
あとは、少々荒技なんですが、setjmp() と longjmp() というのを使うと豪快に飛べます。普通の参考書には載ってないでしょうけど。。。興味があったら調べてみてください。
回答ありがとうございます.
setjmp()とlongjmp()なんてあるんですね.知りませんでした.説明してあるページを見つけて軽く読んだのですが,初心者の僕ではちょっと意味がよく分からんでしたf^^;
No.6
- 回答日時:
breakは一番内側のブロックを抜けます。
do{}while();
while(){}
for(){}
switch(){case:}
で使いますね。
rand関数は0からRAND_MAXまでの擬似乱数を返します。
#define R (double)rand()/32767.0 → 以降のR を (double)rand()/32767.0 に書き換えます。
a=sin(R) → a=sin((double)rand()/32767.0) と同じですね。
b=a → aをbに代入しただけなので、bはaと同じ値になり乱数は関係ありません。もう一度乱数が欲しければ b=sin(R)として下さい。
回答ありがとうございました。
>もう一度乱数が欲しければ b=sin(R)として下さい。
なるほどです。今まで曖昧だった理解が具体性を帯びてきました。
No.3
- 回答日時:
breakの解釈はあってますね
「一番内側のループを抜ける」です
for分の他は、、whileとか、do whileとか、、あとselectもその部類なのかな?(ループではないけどね)
defineも解釈はあってます
defineで置き換えられてるだけなので
コンパイル時に
a=sin(R);
は
a=sin((double)rand()/32767.0);
としてコンパイルされます
で、その結果をbに代入しているので
bとaは常に同じになります
>あとselectもその部類なのかな?
selectとはどういう機能を持ったものなのですか?
>その結果をbに代入しているので
代入しているだけということなんですね。
回答ありがとうございました。
No.2
- 回答日時:
breakはそのbreakを含む一番内側のループを抜けます。
(どうしても複数のループを一度に抜けたい場合はgotoです)
breakは3つのループ全てに使えます。
ループはその3つしかないので、breakが使えるループは他にはないです。
aには既にsin(R)の結果が入っているだけなので、それをbに代入しても変化はありません。
defineの動きは単純で置き換えをしているだけです。
一般的にはコンパイルする前に
a=sin((double)rand()/32767.0); // <-R が置き換わってる
b=a;
という風にされた後にコンパイルされます。
回答ありがとうございます。
>(どうしても複数のループを一度に抜けたい場合は
>gotoです)
gotoなら一気に脱出できるのですね!
>一般的にはコンパイルする前に
>a=sin((double)rand()/32767.0); // <-R が置き換わ>ってる
>b=a;
>という風にされた後にコンパイルされます。
なるほどこのように解釈するのですね!
No.1
- 回答日時:
ちょっと調べればすぐわかるはずで, 実験するようなことじゃないと思うけど....
break は「自分を含む, 一番内側のループまたは switch から」脱出します. ループは for, while, do~while の 3種類.
rand は呼出されるたびに新しい乱数を返す. だから呼出さなければ乱数は新しくならない.
それだけ.
回答ありがとうございます。switchからも脱出できるのですね。
>ちょっと調べればすぐわかるはずで, 実験するような>ことじゃないと思うけど....
こういうのってどうやって調べるとよいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBA FindNextを使用して条...
-
画面を強制的に再描画させる方法
-
Excel VBAで、アクティブシート...
-
エクセルVBAの勉強を始めま...
-
WinAPI「MsgWaitForMultipleObj...
-
GIFアニメをループさせたくない
-
アセンブラによるウェイト(WAIT...
-
uwsc条件並列とそれの抜け方
-
vb.netからエクセル関数書き込み
-
C言語に詳しい方お願いします。...
-
WHILE (CHKIMG(”A.bmp”)=FALSE)...
-
一巡伝達関数と開ループ伝達関数
-
c++ ランダムウォーク
-
どなたかこのプログラミングを...
-
pythonでファイルのコメント行...
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
ループ内での条件処理
-
readLineとStringTokenizerで一...
-
VBA for文が止まらない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
UWSCの終了の仕方
-
DoEventsが必要な理由について
-
VBAで3秒だけ時間を止めたい
-
範囲指定したセルを1つずつ飛...
-
Escキーを押すと、中断する時と...
-
DOSコマンドのループ内のTIMEコ...
-
vbscriptでIE自動入力(途中で...
-
乱数の桁数指定、または範囲指定。
-
GIFアニメをループさせたくない
-
プログラミングについて。 1つ...
-
エクセルの当番表を作っていま...
-
テキストボックスの名前に変数...
-
ループフリー
-
vb.netからエクセル関数書き込み
-
CSVファイルの特定の行だけを読...
-
VBA for i=1 to lastrow
-
どなたかこのプログラミングを...
-
Do whileでExitせず、ループの...
おすすめ情報