Cのgoto文
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@1周年
NGNG昔は完全に敵視する人も居たが、 try ... catch 構文が
ないんだから適当に使わないとやっぱ汚くなるよな。
0002名無しさん@1周年
NGNG0003名無しさん@1周年
NGNG{
loop:
printf("hoge");
goto loop;
}
0004>3
NGNG0005>4
NGNG0006鳥肌が立つほどゾクゾクしてクラクラするような goto 文の使い方
NGNG{
int i;
i = 0;
loop:
printf("%d\n"@` i);
i++;
if (i >= 10)
goto loop_end;
goto loop;
loop_end:
return 0;
}
/* ああ、DOSのバッチファイルと見間違えてしまいそうだ・・・ */
0007>5
NGNGC:\>^C
C:\_
0009名無しさん@1周年
NGNG■
0010名無しさん@1周年
NGNGヘッダ部分は別ファイルにするとかしてさ。
#include <stdio.h>
#define START main(){
#define INTEGER int
#define IPRINT(a) printf("%d\n"@`a)
#define IF(a) if(a){
#define GOTO goto
#define ENDIF }
#define END }
START
INTEGER I;
l00:I=0;
ll0:IPRINT(I);
l20:I=I+1;
l30:IF(I<10)
l40:GOTO ll0;
l50:ENDIF
END
0011名無しさん@1周年
NGNG0012>10
NGNG0013>12
NGNGっていうか、gotoの使い方について、もっと真面目に議論しようよ。
0014後藤
NGNG0015名無しさん@1周年
NGNG{
int i; /*この変数領域がどうなっちゃうかがポイント*/
goto outside;
}
outside:
0016名無しさん@1周年
NGNGgoto inside;
{
int i;
inside:
...
}
0017>15
NGNG●ブロック越しのgotoは許されるか?
ブロックは変数スコープであり、gotoに関係ない。許される。
●変数int i;
iはスタックから破棄されるが、まだ値は壊れていないし、
また書き込んでも実行時エラーにはならない。
0018名無しさん@1周年
NGNG0019名無しさん@1周年
NGNG0020>15
NGNG尾で破棄されるから、下記のようなコードでも、問題ないはず。
void func(void)
{
int * p;
{
int i;
i = 100; //なんでもいい
p = &i;
goto outside;
}
outside:
printf("%d"@`*p);
}
002120
NGNG3行目を以下の2行に修正……。
int a;
int * p = &a;
初期化してないポインタだ。はずかしぃ
002220
NGNG鬱だ死脳
0023>14
NGNG0024名無しさん@1周年
NGNG{
int * p;
goto inside;
{
int i;
inside:
i = 100; //なんでもいい
p = &i;
}
printf("%d"@`*p);
}
こっちはどーよ?
0025>24
NGNG関数先頭で確保され、関数末尾で破棄されるから、問題ない。
っていうか、実行時に変数宣言をする訳じゃないからなあ。
0026名無しさん@1周年
NGNGま、そりゃそだね。つか、
{
int i;
inside:
i = 100; //なんでもいい
p = &i;
}
が関数と同様に動的にとられるのかな? とか思っただけ。
0027>25
NGNGそれって規格ですか?
002827の補足
NGNGvois foo ( int x )
{
int i[100];
if( x > 0 )
{
int j[100];
...
}
else
{
int k[100];
...
}
}
…だと、常に300int分のスタックが消費されるわけですか?
0029>25
NGNGわかるように教えて。
コンパイル時にローカル変数がデータセグメントに
確保されるっていう意味じゃないよね?
0030>28
NGNG003127の補足の補足
NGNG実行しないブロックがあっても、その分のスタックが関数呼び出し時に
確保されちゃうのか?ということが聞きたかっただけで…
んで、それが、処理系に依存しない「規格」なのかどうかを…
003225
NGNG規格かどうか?と聞かれると、「よく知らない……」ってのが
本当なんだけど、取り敢えず、BC++3.1では関数の最初で確保
されてます。
>>29
ローカル変数(グローバル変数でも一緒だけど)の領域が確保
されるのは、コンパイル時です。正確に言うと、ローカル変数
の場合、領域はスタックに確保されますから(データセグメン
トではなく)関数の最初に
sub sp@`6
等のように、領域を確保するコードが埋め込まれます。
003325
NGNGあ、あんまりいじめないで……。
そこら辺りは、コンパイラの最適化の範疇にはいるのではないで
しょうか?「規格か?」と聞かれると、「知りません」としか答
えられません。
ちなみにBC++3.1で、アセンブラコードを吐き出させてみたところ、
28のコードで確保されるスタックは、30さんの仰るとおり、
200*sizeof(int)になってました。
0034名無しさん@1周年
NGNG003525
NGNGスタックを操作していると、非常に冗長なコードになるような気
がする。スコープに入る度に、sub sp@`n とか、スコープを出る
度にadd sp@`nとかがコードに埋め込まれるわけだから。例えば
forのループブロックの中に、そんなコードが入っていると、
1回ループする度に、sub sp@`n と add sp@`n が入る訳だし。
しかもgoto文の時は、その飛び先のスコープを判断して……、
なんて事になると、ややこしくてかなわない。
0036スポックの耳
NGNGの一つになっていることは確かです。ダメなコンパイラではこのへんを正しく実装
してない場合もあるでしょう。
ここで話題を最初に戻しましょう。
私は仕事でプロジェクトのコーディング規則で禁止されていない場合、gotoを使う
場合がありますが、エラー処理で関数を抜ける場合のみに限定しています。
これは、C++のtry〜catch構文の代わりとしてです。
それ以外でgotoを使うことは無いし、使うべきではないと考えます。
0037>36
NGNG状態変数等を用意するまでもない場合、goto を結構使います。私の場合
0038ガハハ
NGNGまず構造化を心がけて判りやすくやろうってことじゃ。
判りやすくやったらgotoはそんなに沢山使ってない筈じゃろうって事じゃ
http://www.chienowa.co.jp/frame1/ijinden2/Edsger_Dijkstra.html
gotoを使わない為にどうするじゃなく、判りやすくやったらgotoがあんまりないって事じゃな。
逆をやったら駄目だぞ。
0039名無しさん@1周年
NGNGgotoを使わなくてもスパゲッティーになる。
用は美しい設計をすれば必然的にgotoはなくなるよね。
って38の言ってることの焼き直しか。。
エラー処理でgotoを使った方がよりキレイなら使う。
どっちにしろ、エラー処理のところなんて設計全体でそう、多くあるもんじゃない。
0040名無しさん@1周年
NGNGエラー処理のところでgotoを使った方がいいような場合は多くあるもんじゃない。
0041これはどうだ
NGNG方法の一つは、√N迄の数で割った余りがを調べ
0で無いのが一つでもあれば素数ではありません。
という課題があってgotoを使わない方がいいかどうか
0042一句
NGNG0043名無しさん@1周年
NGNGgoto使わなくても。
0044>43
NGNG0045名無しさん@1周年
NGNG0046>
NGNGfor( N=4; N<=1000; N++ )
{
int m = (int)sqrt( (double)N ) + 1;
for( x=2; (x < m) && (N % x); x++ );
printf( "%dは素数%s。\n"@` N@` ((x < m)?("ではありません"):("です")) );
}
0047>41
NGNGでも、構造化プログラミングのもう一つの柱を使って、関数化してreturnによる
脱出を使えばいい。こんな感じね。
int check(int n)
{int i@`m=1;
for(i=4;i<=n;i+=m+m+1)/*m<=√n迄*/
{ m++;
if( 0 == (n % m) ) return 0;
}
return 1;
}
int main(void)
{int n;
for(n=4;n<=1000;n++)
{
if(check(n))printf("%4d"@`n);
}
return 0;
}
0048>46
NGNG0049>42
NGNG蒸し返すのか?
005049
NGNG主張して叩かれてたんだよな
>break=goto
0051名無しさん@1周年
NGNG0052>44@`45
NGNG0053>42
NGNGいや、そのスレ知らない。
breakをたくさん使うソースを見たらなんか頭がこんがらがって
「これじゃgotoと変わらんな」って思ったことがあったから書いただけさ。
0054>48
NGNGgoto も break も外部関数も無いから、叩き所が無くってツマんないかもしれんが(笑)
0055>54
NGNGでも、一般PGも容易に理解できるようなソースを書くことも能力だよ。
0056>53
NGNGループかswitch抜けるだけのbreakで頭がこんがらがって
gotoに見えてんじゃねーよ
0057>56
NGNG0058>57
NGNG間違い無く頭が悪い。
複雑怪奇なこととbreak=gotoとは全く無関係の主張だろ。
ちょっと読みにくかったからといってbreak=gotoなんて結論
づけてしまう奴の言う事だから本当に複雑怪奇だったかどう
かも怪しいもので頭が悪くてまともなソースが複雑怪奇に
見えただけかもな。
0059>47
NGNG関数の最初の方でmallocしたメモリを解放することなく、関数の途中で
returnてなバグを出しまくった後に、やっぱり関数は最後でちゃんと後
始末をした後に抜けるようにしよう、ということにして、goto文を使う
ようになった。
有用なgotoの使い方だと思うんだけどなあ。しかし、周りの人間には、
未だ理解してもらえていない。
0060名無しさん@1周年
NGNG多いせいだ。後の事を考えて使えば、goto使った方が後で
見やすいプログラムになる事もある。
0061名無しさん@1周年
NGNG確定するのは名前を考えるのが面倒くさい
0062>59
NGNG関数の途中で何箇所もreturnして、構造化プログラミングなんてちゃんちゃらオカシイ!
0063>59@`62
NGNGCでmallocした時だけfreeを忘れないように気をつければ
いい話しだろ。
C++だともっとスマートにできるしな。
関数の途中でreturnを使っていたら構造化されていない
なんてちゃんちゃらオカシイ!
006441
NGNGあるいはbreakするかして、後で条件を再度見るという方法
>>47 それも一つの方法ですよね。でも、これも46さんと同じで
いったん、条件を作って、後で再判断している。
#あ別件ですが√Nをスマートに処理してるのは敬服しました
これらに比べて gotoを使うと 1回の条件判断で済むと思うのです。
私はこういう場合gotoを使った方が解りやすいと思うのですが。
0065名無しさん@1周年
NGNG0066名無しさん@1周年
NGNGよく使うけど。
0067名無しさん@1周年
NGNGgoto文を使っちゃいけないんじゃなくて、普通に構造的な設計をすればgotoが必要な
場面はそんなにないという話だろう。
0068名無しさん@1周年
NGNGなんでこんな煽り口調しか出来ないんだろうな。
まぁ、人間として馬鹿丸出しだからわかりやすいからいいけどな。
0069名無しさん@1周年
NGNGしてみたら?
0070名無しさん@1周年
NGNGbreak n;
って欲しくなるとき無い?
forとかwhileの多重ループを、break 2;とかやると、二つ抜けてくれるの。
いや、そんなコード、後から見たら、何がなんだか分かんなくなるとは
思うんだけどね。
0071>68
NGNG言葉は悪いが56@`58は間違ったこと言ってないと思うぞ。
63の人は確かにちょっとお行儀が悪いな。
ただgotoかrerurn かについてreturn逆差別するのも
どかと思うな。gotoもreturnもようは使い方だろ。
007271
NGNG>breakも gotoの一種と 思えけり
なんていきなり書く方が問題あると思うからだ
そういう意味でいくと
>関数の途中で何箇所もreturnして、構造化プログラミングなんてちゃんちゃらオカシイ!
といのもgoto批判と同じ穴のムジナの逆差別的で不快だね。
63は行儀は悪いし誉められはしないが気持ちは分る。
0073>70
NGNG0074名無しさん@1周年
NGNGgotoで抜ける方が俺は見やすくていいと思うけど。
というか、超多重ネストを避ける方がgotoうんぬん
よりも重要だと思うな。
0075名無しさん@1周年
NGNGで、プログラム終了して、OSシャットダウンして、電源まで
切ってくれるってのはどうだ。
0076名無しさん@1周年
NGNG007773
NGNG回数で抜けるのはPerlでもできません。
よく読まずに書いてすまん。
0078>76
NGNG0079名無しさん@1周年
NGNGところで私も関数の途中でreturn使うけどな。
何が悪いんだろ?
関数理解していたら、後処理忘れなんてしないでしょうし、
gotoで最後まで飛ばしたって関数理解できてなかったら
逆に余計な後処理をしてしまうことだってあると思うけど?
前処理後処理が煩雑になる危険性があるのは何を選択しても
Cを使ってる限りしかたないと思うけど。
あっこれ別にC以外の自慢をしているわけじゃないですよ(笑)
008059
NGNG>関数理解していたら、後処理忘れなんてしないでしょうし、
それを言ったら、この世にメモりリークのバグなんて存在しない
ことになっちゃうよ。
実は、僕も最近goto使わなくなったんだけどね。かといって、関数
の途中でreturnするのは、未だに気持ちが悪いのでイヤ。(関数途
中のreturnなんて、構造化プログラムじゃない、なんてことは言わ
ないけど)特にプログラムのスタイルを変えたつもりは無いんだけ
ど、いつの間にやらgotoって滅多に使わないようになっちゃった。
なんでだろう??
0081名無しさん@1周年
NGNGより凶悪なんじゃないだろうか?gotoなら、ラベルは少なくとも同一
関数内にあるのは分かってるけど、throwされた例外が、どのcatchで
受け止められるか、なんて、ソースをひっくり返して見てみないと分
からないんじゃない?
そりゃまあ、プログラムを作った本人は、自分でtry/catchを書いて
いる訳だから、分かっているとは思うけど。
0082>81
NGNG例外処理は、ある関数が例外を起こしたことを知らせるだけ。
送出した例外をどう処理するかは例外を送出する側の知ったことでは
ないし、呼び出し元はある関数を呼び出したときにどういう型の例外
が発生するという以外の情報は必要としない。
0083>80
NGNG>>38-39あたりを読めって。
0084>80
NGNGgotoでも一緒だと思うけど。
何がなんでもgotoで関数の最後に飛ばされてたら、そりゃ反発
食うの当然じゃないの?
008542
NGNGfor(a = 0; a < 100; a++)
{
printf("a=%d\n"@` a);
if(a == 5) break;
}
printf("out:%d\n"@` a);
これがbreakがgotoと変わらんなと思う理由。
この使用法だとbreakはgotoと全く変わらんだろ。
breakの使用がどーのこーのとケチを付けるつもりは
全くないが、gotoの使用が構造化プログラミングを崩すと
言うのであれば、breakにも危険性は十分あると言いたいだけ。
>>67
おまえが引用してくれた39は俺だ!
煽るように突っかかってきて気分悪いわ。おまえ。
breakがgotoと一緒かどうかは使い方によるけど、
gotoと変わらん悪質な使用法も出来ることは覚えていて良いんじゃないか?
(goto自体が悪質だという意味ではない。)
0086>42
NGNGfor文とif文が矛盾しているのが変なだけで、
別にbreakがgoto文と同じなわけじゃないじゃないか。
if の判定がまともだったら、すごくまともなプログラムで
breakの使い方でしょう。
悪質な使い方=goto文とでもいいたいわけ?それなら、
なんにだって当てはめられるじゃないか。論理が滅茶苦茶。
0087名無しさん@1周年
NGNGわかるはず。gotoを偏執的に排除しようとするのはただのヒマ人だね。
0088>86
NGNGどこが矛盾?
>別にbreakがgoto文と同じなわけじゃないじゃないか。
もうちょっとよく考えなさい。
>if の判定がまともだったら、すごくまともなプログラムで
>breakの使い方でしょう。
まともかどうかはしらん。ただ、俺はこんな書き方は嫌いだ。
でもそれを押し付けるほどではないと思っている。
>悪質な使い方=goto文とでもいいたいわけ?
後半をしっかり読め。どこにも書いてないだろ。。。
おいおい、もっとしっかり読んでから返事しろよ。。
>論理が滅茶苦茶。
読解力がめちゃめちゃ。ここまで素直な文章なんだ。しっかり読みなさい。
0089>87
NGNGいるのだろうか。
gotoにかこつけて、breakだとかreturnだとか別のものを
排除したり的外れの批判する人が多いように思うわ。
0090名無しさん@1周年
NGNG>排除したり的外れの批判する人が多いように思うわ。
breakがないswitchは大変だね。
returnを使用できない関数はもう、大欠陥だね。
そんな馬鹿なことを言ってる人は一人も居ないよ。
初心者には難しいのか?もしかしてこの話題は。
0091>88
NGNG必要無いけど?
そのことが間違っていると言ってたんじゃないの?
よく考えろってあなたの書いていることからこれ以上考えようが無いが?
悪質な使い方だからbreakがgotoと一緒って言ってるようにしか
よめないけど。
そもそもどんなに使い方が悪質でもbreakをgotoと同一視することに
無理があるでしょう。
0092名無しさん@1周年
NGNG1つ上のループを抜ける事も解るわけだし。
この程度はgotoよりはマシって気もするし、使い方がおかしければ
どんなんでもクソになっちゃうのもわかるし。うーん・・・
0093>90
NGNGretrunを使うと構造化じゃないとか、break=gotoと一緒だとか
おかしな意見がいっぱい。それを指摘したら初心者になるのかい?
009486じゃないけど
NGNG>どこが矛盾?
forの終了条件が、ifの条件式とその結果によって意味をなさなくなって
いるあたりが矛盾。
このおかげで、コード自体がgoto=breakのことなどどうでもいいぐらい
に無意味なコードになっている。
つまり、このコードはbreakの邪悪さを説明する例としては全く不適当。
例を出すならもう少しましな例を出して欲しい。
0095名無しさん@1周年
NGNGと思っていたのだが、先日、初めて見た。取引先が作ったコード
なんだけど、
label:
hoge();
if(count ==5)
goto label;
とかって、マジメに書いてた。いやあ、貴重な物を見せてもらった、
と、なんだか嬉しくなっちゃったよ
0096名無しさん@1周年
NGNGbreakで抜ける、っていうのは、ごく普通の使い方だとおもうなぁ。
009785
NGNGK&Rの「3.8 Gotoと名札」でも読んで下さい。。
それと、>>85のような簡単な例を見て、それがすべてだと思わないこと。
さて、帰ろう。。。
009885
NGNG悪い書き方とは言ってないよ。んじゃ。。
0099名無しさん@1周年
NGNGってことだな。
0100>85
NGNG話にならない。
お前が出しきた例で、
>この使用法だとbreakはgotoと全く変わらんだろ。
だとか
>gotoと変わらん悪質な使用法も出来ることは覚えていて良いんじゃないか?
だとか言ってたんだろ。
0101名無しさん@1周年
NGNGだからさ、例が悪すぎるんだって。
どうせやるなら、もっとうまく書けばよかったのに。
void f(void)
{
int a@` i;
for(i = 0; i < 100; i++){
scanf("%d"@` &a);
printf("%d\n"@` a);
if(!a)
break;
}
return;
}
例えば、こんな感じの例を出せばよかったのに。
‥‥‥と、書いてみて思ったが、この例何か問題あるか?
(もちろん、scanfを使ってるとかそういうことではなくて)
っていうかさ、何度も同じこと言わせないでよ。
goto文は、普通は使う必要がないから使わないだけであって、
そこにgoto文を使う必要があると判断すれば使えばいいの。
0102>101
NGNGだよね(笑)
break文の間違った使い方でgoto文と同じという例には
なってないよね。
っていうか85は相手にしては駄目な人なんでしょう。
0103>79
NGNGエラー処理でこの手の使い方はよくやるね。
0104>102
NGNG最近そういう奴の絡んでくるスレッド多いな。
数ヶ月前はもっとまともだったような気がするんだが・・・
0105>103
NGNGint funcB()
{
if(・・・) return TRUE;
return FALSE;
}
void funcA()
{ char *mem=malloc(SIZE);
funcB();
free(mem);
}
010659
NGNG要するに関数内のエラーチェックの手法が、「エラーがあることを確認して、
処理を中断する。」から「エラーが無いことを確認して処理を続行する。」に
変わったからだと思う。つまり、
if(JudgeError()) goto label;
Hoge();
label:
とかやってたのを、
if(!JudgeError()){
Hoge();
}
に書き方を変えたって事。
そのかわり、後者の書き方だと、中括弧のネストが深くなり、当然インデントも
深くなるわけで、ソースが見にくくなるんだよね。
goto文を使った書き方、ってのはDOS上でプログラムを書いていた時代、画面の横
幅が80桁しかなく、インデントが深すぎると、ソースが画面からはみ出してし
まい見づらくなる場合に使っていた方法で、Windows上でプログラムを書くように
なってからは、広い画面が使えるので、少々では画面からはみ出さない、心おき
なくインデントが使える、と。
要するに、横幅の広いエディタを使えば、goto文は使わなくてもいい、ってことだ。
(ちがうか??)
0107103>105
NGNG0108名無しさん@1周年
NGNG>K&Rの「3.8 Gotoと名札」でも読んで下さい。。
こらっまともな例も出せない初心者がK&Rを冒涜するな
そこにはお前が主張しているようなbreak=gotoなんて
書いてないし書いているわけないだろ。
0109103>106
NGNGま、2段くらいだったらやるけどね。
0110ε>106
NGNGつまり、
a = malloc(foo);
if(JudgeError())
goto end;
Hoge();
end:
free(a);
return;
(細かいとこには拘らないでくれ)
というコードの場合、以下のように出来るならばgotoが必要なくなる。
if(JudgeError())
return;
a = malloc(foo);
Hoge();
free(a);
return;
ま、どうしても必要なgotoを無理に消す必要はないんだけどな。
0111108
NGNGそもそも85はC初心者なんだろうよ。
あの間抜けな例を見て確信したよ。
こいつは初心者でbreakで流れが分れるともうコードを
追えなくなってしまうような奴なんだ
だからgotoと一緒だとか分けのわからないことを
言うんだろう
011259
NGNG僕のコードの場合、5段6段のインデントは当たり前。下手すると、
Windows環境ですら、画面の右端を超えそうになる場合も、あり。
あー、だめだー。関数途中のreturn、許可しようかしらん……。
011385
NGNGさて、あれから考えて、なぜ、
「gotoのループ脱出の使い方とbreakが同一視できるか」を理解できないかを
考えてみました。
>>108はK&Rを持ってるようなので、読んで欲しいけど、
p.80の上の方にgotoの有用な例として
「最も一般的な使用は、例えば二つのループから一度に抜け出す時の
ように、深く入れ子になった構造での処理を中断させる場合である。
break文は最も内側のループを抜け出すだけなので
直接使用することは出来ない。」
とあるでしょ。じゃあ、ループが一つの時には。。?
breakが使えるってことでしょ。なにかピンと来ない?
また、breakを使用した時、CPUのIP(instruction pointer)はどう動く?
ここまで言ってbreakとgotoが同一視できるということにピンと来ない?
なんか、文章を読みきれないのか知らないけど、
break文とgoto文が全く同一とは言ってない。ただ、
ループ脱出のgoto文の使用がbreakとほぼ同一の効果となるから
この時は同じ物として見れると言っているだけ。
あと、>>85の例だけど、あれはループ脱出を示しているのであって
for loopが100回まわってるのに、if(a == 5)がおかしいというのは
悲しくなったよ。「1を聞いて10を知る」ここまでは無理でも
「1を聞いて1.2を知る」ぐらいにはなりましょうね。
問題の本質はbreakの使用による効果であり、ループが無駄に回っている
ってのは問題を簡単にするためでしかない。
長いけど、頑張ってよんでね。
さぁ、どんどん突っ込んでくれ。君らの知的レベルに乾杯!
0114>110
NGNG011585
NGNGgotoで2つ以上のループを抜けるときにbreakで代用できるだろ?
もちろん、returnでかける場合もあるだろうけど。
returnはまた、意味合いがことなる。
gotoの代わりにbreakで切り抜けられる。これは
gotoとbreakの同一性があるためだとは分からないかい?
0116名無しさん@1周年
NGNG++a;
goto label;
}
for(b = 0;b < 100;++b){
label:
c = a + b;
}
0117108
NGNGだから初心者がK&Rを冒涜するなって言ってるだろ
そんな意味で書いてないだろ。breakで抜けきれない時に
goto文を使うのは有用な例だと書いていだけだろ。
後半は前の方の発言でアセンブラにしたら全部ジャンプ命令
だとか言ってた奴と変わらない論理だな。語る価値も
無い問題外だ。
85の例の間抜けさはは例を直しても一緒だって指摘されて
いるだろ。
お前のは1じゃなくて-10000ぐらいの例なの。分るか?
そもそもループが無駄に回っても問題は簡単にはなってないし
間抜けなだけだ。お前実際C初心者だろ?
011885
NGNGさぁ、そんな熱くならずに。自分の馬鹿さかげんを
晒してるだけだよ。
for(a = 0; a < 100; a++)
{
if(a == 5) break;
}
printf("%d\n"@` a);
と
for(a = 0; a < 100; a++)
{
if(a == 5) goto LABEL;
}
LABEL:
printf("%d\n"@` a);
では本質的な違いがあるかい?
言ってごらん。
0119108
NGNGお前よく次から次へと間抜けな発言が出きるな
>gotoで2つ以上のループを抜けるときにbreakで代用できるだろ?
なんだそりゃ?
先に釘指しておくが日本語か論理が変なのを他人の読解力のせいに
するなよ>C初心者
0120>108
NGNG誰から見ても馬鹿な奴に馬鹿といわれても腹はたたないよ。
それはbreakをgotoで書きかえた例を出しているだけだろ。
gotoの間違った使い方でしかない。
012185
NGNGうーん。困りましたね。
>先に釘指しておくが日本語か論理が変なのを他人の読解力の
>せいにするなよ>C初心者
あなたのその日本語も見るに耐えないのですが、まぁ、いいでしょう。
理解できないのですね。かわいそうに。。
いや、いいんです。初心者が理解できる内容じゃないんだってはっきり分かってきたから。
0122ε>114
NGNG‥‥‥いや、この例の場合はね。
あくまで、gotoを消す手法の例の1つとして挙げただけだし。
0123名無しさん@1周年
NGNGなんだからさ。
012485
NGNG>gotoの間違った使い方でしかない。
そう。その通り。これは無理矢理gotoでbreakの代わりをさせただけ。
代わりをさせられる。まだ、分かりませんか?
012585
NGNG懐かしいです。初心者の哀れな姿ですよ。>108
0126>122
NGNG0127108
NGNGヒマなのでもうちょっとだけ付き合ってやるよ
>>124
だからそれはアセンブラにすれば全部ジャンプ命令だと
言うのと同じ理屈だって言ってるだろ
屁理屈はいいから、とっとと
>gotoと変わらん悪質な使用法も出来ることは覚えていて良いんじゃないか?
こっちの例を出してbreak=gotoを証明しろよ
0128名無しさん@1周年
NGNGgoto=break派は、goto をマシン語レベルの jump とし捉えているんだよねぇ?
K&Rによると、continue は
for(;;)
{
goto contin;
...
contin;
}
と等価であるという説明文があるが、これを break で考えてみると
for(;;)
{
goto brk;
...
}
brk:
とかになると思う。(少なくとも俺にはそう考えるのが自然だ)
break の説明を行うのに、上記のような例を用いても構わないだろう。
しかし、だからと言って break=goto な訳ではなくて、上記例は
goto のごく限られた(おそらく有用な)用法の1つにしか過ぎず、
もっとも恐れるべきは goto は無制限に悪用されうる。
…というのが break≠goto 派の意見だと思うんだけど、違う?
0129>85
NGNGっていうか、もしかしてただのGOTO禁止教の信者?
gotoが悪なんじゃなくて、おかしなgotoの使い方が悪なんだと何回説明
させれば気が済むわけ?
0130108
NGNG誰が見ても初心者な奴に初心者といわれても(以下略)
どうせ他人を出すならもうちょっと俺っぽい奴を
出してくれよ(笑)
0131名無しさん@1周年
NGNGfor(j = 0;j < 30;++j){
a += b[i][j];
if(a > 100)break;
}
}
for(i = 0;i < 25;++i){
for(j = 0;j < 30;++j){
a += b[i][j];
}
if(a > 100)break;
}
for(i = 0;i < 25;++i){
for(j = 0;j < 30;++j){
a += b[i][j];
if(a > 100)goto label;
}
}
label:
for(i = 0;i < 25;++i){
for(j = 0;j < 30;++j){
a += b[i][j];
}
if(a > 100)goto label;
}
label:
013285
NGNGあなたのおっしゃることが全てです。
break == gotoなんて思っているわけでもないです。勿論。
あなたのおっしゃるように、
>goto のごく限られた(おそらく有用な)用法の1つにしか過ぎず、
です。
だいたい、break==gotoなんてちょっと考えれば相似点と相違点が
すぐ分かりそうなものなのに。。はぁ。
0133ε>126
NGNGむ、確かに。
でもまあ、どうしても必要なgotoまで消す必要はないしね。
普通に設計すればgotoを使わなきゃならない可能性は低いし。
0134>85
NGNGってのはどうなったの?
0135名無しさん@1周年
NGNGお前には恥も何もないのか?
128が言ってるようなことなんて先に指摘されてるじゃないか。
アセンブラにすればジャンプ命令と言ってるの同じって。
128を逃げの口実に使ってるんじゃないよ。
0136名無しさん@1周年
NGNG関数呼び出しは、gosub-returnで代用できるとか、ローカル変数
は名前をちゃんと管理すればグローバル変数でもいいとか言い出しそう。
013785
NGNG頑張って!もう、128さんのような人が居たからもういいよ。
ちなみに、breakが危険だと感じたのは今までで一回しかないし、
それも特殊なケースだからな。
ループがネストしまくりでbreak文とif文のあらしだったといえば
君の頭脳でもちょっとは想像がつくかな?
例としてですには長すぎるし、あんなソースは見たくもないし、
だいたい、仕事のソースだから見せられん。
君がbreakが危険だと認識できるようなソースに出会わないことを
祈っておくよ。
0138ε>114
NGNG013985
NGNG>128が言ってるようなことなんて先に指摘されてるじゃないか。
誰も指摘しなかったからここまで長引いたんじゃん。
アセンブラ云々はヒントでしかない。
>>128のbreakとcontinueの説明にgotoを使用している。
これが全てだろ。
>(少なくとも俺にはそう考えるのが自然だ)
俺もそう考えるのが自然なだけ。
アセンブラが分からない君でもこの説明ならわかるだろ?
で、アセンブラが分かれば理解が深まるってだけさ。
0140128
NGNGつまらないバグを避けるため、なんとなく嫌う人が居るのだと思う。
自分で書いたコードではなくて、他人の書いたコードの
メンテを任されたと考えてくれ。
そのコードは恐ろしく深いネストと、ネスト先での return の固まりだった。
おまけに関数の先頭では、作業領域を malloc している。
ここから、あらゆる場合を尽くして、メモリーリークを見つけるのは困難
なような気がする。
このような混乱を軽減してくれるのが「構造化プログラミング」ではないの?
なんていうかな… malloc と free の対応づけとか…
fopen と fclose の対応づけとか…
そういうのが自然と構成されるような書き方が「構造的」
なのでは?
…って、上記はあくまで理屈であって、goto も、関数途中の return も
使いまくっているけどね。俺(笑)
0141108
NGNGこらこら逃げに入っているようだが話が戻ってるぞ。
breakを悪い使い方してもgoto文と一緒にはならない
という指摘は既に前の方で誰かがしてたよな。
別に仕事のソース出さなくても例ぐらい普通書けるだろ。
0142134
NGNGこらこら、話が本題に入る前に逃げるんじゃない。
0143114>ε
NGNG110の上のは「メモリを取ったあとにエラーが発生した場合」の良い例
だと思ったんでね。
0144108
NGNG俺とアセンブラの事でも競いたいのか?
やりたいなら別にいいぞ(笑)
014585
NGNGだから、なんで、
おれがgotoが悪だと言う認識をしていると思ってんのかねぇ。?
もちろん悪だけどたまに善。
絶対使っちゃいけないわけではない。って認識なんだけどなぁ。
だいたい、breakを悪用するなんてなかなか難しいぞ。
ちょっと考えれば分かるけど。。
gotoのホンの一部の機能しか持っていないし、
しかも有用な機能のだからな。
>別に仕事のソース出さなくても例ぐらい普通書けるだろ。
めんどくさいって。なんで、そこまで俺がしなきゃならん?
複雑に入れ子になったループからbreakで抜ける時を考えてみろよ。
とんでもない数のbreakになるぞ。ちょっとは自分で手を動かして
考えてみなさい。
0146ε>143
NGNG014785
NGNG>俺とアセンブラの事でも競いたいのか?
>やりたいなら別にいいぞ(笑)
がんばれ
0148名無しさん@1周年
NGNGあれ??元々それが言いたかったんじゃないの?
>>breakがgotoと一緒かどうかは使い方によるけど、
>>gotoと変わらん悪質な使用法も出来ることは覚えていて良いんじゃないか?
スレの本題からはずれるような気もするんだけど。
0149108
NGNGこら苦し紛れに話しをすり替えようとすんなや
>おれがgotoが悪だと言う認識をしていると思ってんのかねぇ。?
そんなこと誰も言ってないだろ。
>だいたい、breakを悪用するなんてなかなか難しいぞ。
お前がそういのがあるって言ったんだろ。
言い訳はいいから例も書けない初心者なら初心者だって
最初から言えよ。
0150名無しさん@1周年
NGNG0151131
NGNG比較とgotoの組み合わせでしかない。
0152名無しさん@1周年
NGNGまったく別のもんだとおもうけどな。
それより、85が只の荒し厨房になってしまったから、そういうヤツを
相手にするやり方でいきましょう(藁
0153108
NGNG俺はそろそろ下りるよ。
まぁいい暇つぶしになったわ。じゃぁな。
0154>85
NGNG> で、アセンブラが分かれば理解が深まるってだけさ。
んで、アセンブラが分かったら何?
きちんと構造化されたソースからコンパイラが吐き出すコードはスパゲッティな
ソースから吐き出されるコードより読みやすいとでも?
っていうかさあ、breakやgotoの実装はどうでもいい訳よ。
問題は、ソースコードが読みやすいかどうかなんだから。
015585
NGNGしかし、C言語レベルではgotoをうまく隠蔽している。
breakとcontinueだけが片鱗を見せている。
まぁ、jumpだけど、それはいいね。分かって書いてるだろうから。
0156131
NGNG「住所が○○の所にこれを届けろ」
015785
NGNG>まったく別のもんだとおもうけどな。
あいたたた。。またそこにもどるのか。まぁ、いいけど。
>それより、85が只の荒し厨房になってしまったから、そういうヤツを
>相手にするやり方でいきましょう(藁
うん。たのしいね。でもそろそろ仕事しなきゃいけないんだけど。
>んで、アセンブラが分かったら何?
>きちんと構造化されたソースからコンパイラが吐き出すコードは
>スパゲッティなソースから吐き出されるコードより読みやすいとでも?
想像力がたくましいね。
>っていうかさあ、breakやgotoの実装はどうでもいい訳よ。
そのとおり。
>問題は、ソースコードが読みやすいかどうかなんだから。
そのとおり。
全く同意見。
0158>85
NGNGそれも違う。
そこに必要だから使うのが善。
必要もないのに多用するのが悪。
015985
NGNG細かいね。君の言う通りだと思うよ。
016085
NGNG>「隣の家にこれを届けろ」
>「住所が○○の所にこれを届けろ」
そう。その程度の違いであって
けっきょく届くところは一緒。
もちろん、隣の家と住所が○○の所が同一ならね。
うまいたとえだな。
016185
NGNG0162ε
NGNG痛いよ、この人。
0163名無しさん@1周年
NGNGしてくるところが、バカなんだよ。結局85の論理って、「goto
が悪いって言うなら、breakだって汚いコードを書こうと思えば書
ける。どっちも似たような物じゃないか。」ってね。しかも、その
例に出そうとしいるのが、自分ですら一度しか見たことがない、
という糞コード。(85が書いたんじゃあ、無いんだろうけどさ)
そんな例を出してきても、そのコードを書いた奴が糞なだけで、
goto文の有用性を証明することには、全くならない。って分かんな
いのかな?
0164名無しさん@1周年
NGNG0165131
NGNG0166名無しさん@1周年
NGNG0167名無しさん@1周年
NGNGgotoだけじゃなく、breakでも、こんなに汚いコードが
書けます!私はそれを見たことがあります!!
って言いたかった、ということだ。
0168goto悪の歴史(※かなり想像)
NGNG・goto文の必要性が薄れる。
・goto文のないプログラミングが流行る。
・goto禁止教発足。
・goto文が悪と見なされるようになる。
0169じゃあ 3択 で
NGNG1){int i@`m@`n;
for(n=4;n<=1000;n++)
{ /* i= m*m になるようiに累計 */
for(m=2@`i=4 ; i <= n ; i += 2*(m++)+1)
if( 0 == (n % m) ) goto next;
printf("%5d"@`n);
next:
}
2) >>46 さん (break 派もこれに投票してね)
for( N=4; N<=1000; N++ )
{
int m = (int)sqrt( (double)N ) + 1;
for( x=2; (x < m) && (N % x); x++ );
printf( "%dは素数%s。\n"@` N@` ((x < m)?("ではありません"):("です")) );
}
3) >>41 さん
int check(int n)
{int i@`m=1;
for(i=4;i<=n;i+=m+m+1)/*m<=√n迄*/
{ m++;
if( 0 == (n % m) ) return 0;
}
return 1;
}
{int n;
for(n=4;n<=1000;n++)
{
if(check(n))printf("%4d"@`n);
}
return 0;
}
0170131
NGNGdo〜whileで、条件一致すると抜けるようにするけど。
0171まさしくこの状態だな。
NGNG0172名無しさん@1周年
NGNG1)gotoを使う
2)breakまたは複数終了条件にて終わらせ、後で条件チェック
3)別の関数を作って return で抜けさせて、その帰り値で条件判断
017385
NGNGほんと。その通り。軽い気持ちで書いたら煽り煽られ、アオらーになりました。
おかげで仕事が進みませんでした。
>171
まさしくその通り。
でも楽しかった。。。ちょっと。
0174>169
NGNG0175167
NGNGあー、そんな答えが返ってくるとは思ってなかったので、非常に恐縮だが、
167=163
だからね。
0176169>174
NGNG0177174
NGNG0178131
NGNGこれは
if( 0 == (n % m) ) goto next;
printf("%5d"@`n);
next:
こう書けると思うのは気のせいか?
if( 0 != (n % m) ){
printf("%5d"@`n);
}
0179169>177
NGNG0180174
NGNG0181131
NGNG上のforを見てなかった。
>>177の通りです。
018285
NGNGあー。んじゃ、ちょっと書くかぁ。
>85ってねえ、gotoの有用性を説明するために、breakを持ち出してくるところが、
>バカなんだよ。
gotoの有用性を説明した覚えはない。
>結局85の論理って、
>「gotoが悪いって言うなら、breakだって汚いコードを書こうと思えば書ける。
> どっちも似たような物じゃないか。」ってね。
似たようなものとは思っていないが、breakも使い方一つだと言いたいだけ。
>しかも、その例に出そうとしいるのが、自分ですら一度しか見たことがない、
>という糞コード。(85が書いたんじゃあ、無いんだろうけどさ)
そう。あれはひどかった。。
ここまでやるなら関数に分割して処理するか、いっそのことgoto使え!と思ったな。
>そんな例を出してきても、そのコードを書いた奴が糞なだけで、
>goto文の有用性を証明することには、全くならない。って分かんないのかな?
goto文の有用性はK&Rに書いてある例が精一杯でしょう。
なんであの例を見て、goto文の有用性を示す例になるのか不思議だ。。。
はい。突っ込みどうぞ。
0183169>178
NGNG{}を省いたのが誤読を誘ってしまいました。ごめんなさい
for(m=2@`i=4 ; i <= n ; i += 2*(m++)+1)
{
if( 0 == (n % m) ) goto next;
}
printf("%5d"@`n);
next:
018485
NGNGいや、似たようなものだと思ってるんだ。。。
0185>176経由174
NGNGちょっと見、単なるスキップに見える (^^;
018685
NGNG0187185
NGNG0188131
NGNGあ、そういう事?また誤読(笑)
わかりました。
0189174
NGNG169で正しいです。陳謝
0190131
NGNG0191169
NGNG申し訳ない。
でも火消し効果はあったようで一安心(^^;
0192うむ
NGNG2CHにあっても煽らず、煽りにのらず、煽られず。
貴重な時間を無駄にしたくないなら これも万倍大事。
0193163
NGNG>>バカなんだよ。
>gotoの有用性を説明した覚えはない。
>>85からの引用
>gotoの使用が構造化プログラミングを崩すと
>言うのであれば、breakにも危険性は十分あると言いたいだけ。
breakを引き合いに出して、gotoの有用性を説いているようにしか
読めないが?
>>145からの引用
>おれがgotoが悪だと言う認識をしていると思ってんのかねぇ。?
> もちろん悪だけどたまに善。
>絶対使っちゃいけないわけではない。って認識なんだけどなぁ。
と、有用性を限定しているのも、もちろん読んでいるけどね。
>>結局85の論理って、
>>「gotoが悪いって言うなら、breakだって汚いコードを書こうと思えば書ける。
>> どっちも似たような物じゃないか。」ってね。
>似たようなものとは思っていないが、breakも使い方一つだと言いたいだけ。
一つ質問。118辺りで、例を示して、gotoとbreakの本質的な違い、ってのを
云々していたが、「あの例では、本質的に同じ」って事を導いてから、どうやって
話に落とし前を付けるつもりだったの?「breakも使い方一つ」って?
なんだ、そりゃ。要するに、「goto文もbreak文も、使い方一つ」って言いたい訳?
はあぁ。もうちょっと表現力を身につけろよ。例の出し方も最悪じゃねえか。
しかもみんながgotoの事を話しているときに、なんで唐突にbreakが出て来るんだよ。
その説明も、情報を小出しに、小出しにして。よっぽど表現力がないか、もしくは自分
からみんなに誤解されるように書き込んでいるとしか思えないね。あれか?他の物が誤
解しているのを横目で見ながら優越感にでも浸っていたの?
火は既に消えているようなのでsageる
0194>193
NGNG楽しんでた感じだったからね。
0195名無しさん@1周年
NGNG犬ってね。ケンカしはじめちゃうと相手以外見えなくなっちゃうんだよ?
まわりで迷惑している連中も居るのにねえ。
しょうがないね。犬は。
0196>194
NGNG0197名無しさん@1周年
NGNG0198出張じじぃ
NGNG煽りに負けてはいかん。かわすのじゃ。
そして自分のミスは、素直に謝罪するのじゃ。
>>169からのやり取りを参考にするのじゃぞ。
誤読されながらも169は自分から申し訳ないと謝罪し >>189 >>190
とまったりとした決着を迎えられたのじゃ。
もう一度言っておこう。煽りに負けてはいかんのじゃ。
いかに技術を持っておろうと、煽りに負けるようではな まだまだじゃぞ
■ このスレッドは過去ログ倉庫に格納されています