gotoを恐れず使う兵共がfinallyや多重breakを語るスレat TECH
gotoを恐れず使う兵共がfinallyや多重breakを語るスレ - 暇つぶし2ch1:デフォルトの名無しさん
05/08/11 11:18:15
前スレ スレリンク(tech板)

2:デフォルトの名無しさん
05/08/11 11:29:02
goto 1000

3:デフォルトの名無しさん
05/08/11 12:32:08
このボタンを押せば強制終了っていう場合は
どうやって実装する?

4:デフォルトの名無しさん
05/08/11 12:42:54
一般的には、ボタンが押されたことを通知するメッセージを捕捉して、
トップレベルウィンドウを閉じる処理をするんだろうなぁ。
いずれにしてもメッセージ操作だけだね。

5:デフォルトの名無しさん
05/08/11 12:51:53
>>3
外部割り込み

6:デフォルトの名無しさん
05/08/11 13:07:40
ボタンの後ろに機械接点があって、押すと接点が解放しPCの電力供給を絶つようにする。

7:デフォルトの名無しさん
05/08/11 13:36:10
核ミサイルを発射する処理をすれば

8:マイク ◆yrBrqfF1Ew
05/08/11 14:38:37
例外的な状況こそ例外

9:デフォルトの名無しさん
05/08/11 16:00:29
>>8
トートロジー

10:デフォルトの名無しさん
05/08/11 16:01:10
>>1
gotoを恐れずに使いたくないからfinallyや多重breakを使うわけだが。

11:デフォルトの名無しさん
05/08/11 16:23:09

本格的なプログラムを作成するために存在するC++にはなぜfinallyや多重break,continueがないのですか?

12:マイク ◆yrBrqfF1Ew
05/08/11 16:36:16
トートロジー?(▽

13:デフォルトの名無しさん
05/08/11 16:37:29
トポロジーの親戚さ

14:デフォルトの名無しさん
05/08/11 17:14:38
>>11
finallyがないのはクラスを作ってデストラクタで何とかしなさいということ。
しかもstd::auto_ptrを始めとして大体は既にそのようなクラスが存在するから自分で作ることは少ない。

//俺が思うにfinallyや多重break, continueがないのは単に思いつかなかっただけではないかという気がする。

15:デフォルトの名無しさん
05/08/11 19:13:46
初代C++から幾度も仕様拡張・改変が繰り返されているのに?

16:デフォルトの名無しさん
05/08/11 19:16:08
ところで、finallyって機能の一般的な名称としては何て言うの?
俺の脳内的には「あとしまつ部」なんだけど、これじゃ格好悪いし。

17:デフォルトの名無しさん
05/08/11 19:25:31
>>16
ってことは、お主は try とか catch は何て言うのよ
「finally 節」 で良いじゃん

18:デフォルトの名無しさん
05/08/11 19:55:49
C++がJavaのfinallyを見て言った
C++「おまえ、それでよくガベージコレクタがあるって言えたな」
Java「みんなCが好きなんだよ」

19:デフォルトの名無しさん
05/08/11 20:08:20
??

ああ、メモリ以外は自分で解放する必要があるってことか

20:デフォルトの名無しさん
05/08/11 20:41:06
Cが嫌いな奴もいるだろ
女の子とか

21:デフォルトの名無しさん
05/08/11 20:44:16
>>20
偏見。私は女だがCが嫌いというわけでもない。

22:デフォルトの名無しさん
05/08/11 20:57:05
>>21
お前が本当に女なら、おっぱい晒せ。


23:デフォルトの名無しさん
05/08/11 21:03:21
>>21
ずっと前からお前の事好きだった

24:デフォルトの名無しさん
05/08/11 23:21:32
実は私、男なの。ゲイなのよ。

25:デフォルトの名無しさん
05/08/11 23:22:24
ポーーーーーーーーーーーーゥゥゥゥゥゥッッッ!!!
どーも~~~、ゲイでぇ~~~~~す~~~~

26:デフォルトの名無しさん
05/08/11 23:30:58
gotoを恐れず使う兵共はゲイだと

27:デフォルトの名無しさん
05/08/12 00:20:34
ニューハーフなら受け止める

28:デフォルトの名無しさん
05/08/12 11:54:43
スレが危険な方向に……

29:デフォルトの名無しさん
05/08/12 12:30:22
これでまたさらにム板住民→キモイという方程式が確固たるものに…
>>22は氏んでくれ

30:デフォルトの名無しさん
05/08/16 23:30:11
次スレ立ってたのか。

>10
然り。

31:デフォルトの名無しさん
05/08/17 01:41:13
age

32:デフォルトの名無しさん
05/08/17 11:41:55
>>3
組み込みの場合のマジレス。

while(1) ;

33:デフォルトの名無しさん
05/08/18 00:02:44
Cとかでtry-catchサポートするようになったら
やっぱfinally無しではキツい気がする。

finallyの中身は後片付けでしかないんで
デストラクタに書けばいいだろと言う主張は
なんか面倒くさい気もするけど納得できた。

C++とは無関係にCにも例外処理とfinallyが欲しい。

34:デフォルトの名無しさん
05/08/18 00:18:21
>>33
try-catchに関しては、普通にC++コンパイラ使えば良いじゃん。


35:デフォルトの名無しさん
05/08/18 01:17:31
try-catch
使ったらそれはもうC++だよw

36:デフォルトの名無しさん
05/08/18 03:16:49
つ Objective-C (Cocoa)

37:デフォルトの名無しさん
05/08/18 09:11:42
>>33
>C++とは無関係にCにも例外処理とfinallyが欲しい。

あるんだけど。

これまた、C++と無関係なCの例外処理だから、catchに困るんだけどね。

38:デフォルトの名無しさん
05/08/20 12:32:28
              :ill||||||||||l:
             :i|||||||||||||||
           /''';:|||||||||||||||||l:、
          /:i  :||||||貞|||||||i `'! gotoやめれ~・・  ・
          / :|  :||||||||||||||||||l ノ!
          | ヽ |||||||||||||||||||| :|
          ! !;ヽ:||||||||||||||||||||!; |
      .__|  |/|||||||||||||||||||||; |____
       |  _|  .|/||||||||||||||||||||; |_____  .|
      | |:='ヾ‐イ:||:|l|l|l|l|l|l|ll|||||' |::::::::::::| |
      | |:::::::: | |;:|||||:l|:l|l|l|:l|:||||| イ=::::::| |  ザー ……
      | |:::::::::/ };|||||||||l|:l|l|l|:l|:|||.ノ:=:::::| |
      | |:::=!川!;|||||!l|||l|:l|l||||ー'‐'.;:::::::::::| |
      | |:::::::::!l.|ノ      / ./:::::=:::::::| |
      | |::::::::::::|:::      ノ }::::::::=::::::| |
      |  ̄ ̄~|:::      川リ ̄ ̄ ̄ ̄ |
      | ̄l ̄ ̄|::::      | ~ ̄ ̄ ̄| ̄|
      |_|:.::.:.:.:|:::::      |:.:.:.:.:.::..:.:.:|_|
      .:.:.:.:.:.:.:.:.:|;;;::::      .|.:.:.:.:.:.:.:.:.:..:.:.:.:

39:デフォルトの名無しさん
05/08/20 12:52:56
((((;゚д゚))))ヤメマス!

40:デフォルトの名無しさん
05/08/21 10:43:27
現代のプログラミング言語で、Fortranのような言語で使用されていたGOTOを
必要としない言語は何でしょうか?


41:デフォルトの名無しさん
05/08/21 11:01:17
>>40
「Fortranのような言語で使用されていたGOTO」というと、こんなのか?
URLリンク(xlsoft.com)

42:デフォルトの名無しさん
05/08/21 11:13:07
一般的なGOTOですね。
CやC++等ではGOTO使わないと思うのですが、GOTOを必要としない
ための構造というと、どういうものなのでしょうか?

もちろんFORやWHILEループ、SWITCH等はそれだとはおもうのですが。

43:デフォルトの名無しさん
05/08/21 14:27:40
>GOTOを必要としないための構造というと、どういうものなのでしょうか?
つ[COME FROM文]

URLリンク(www.fortran.com)

44:デフォルトの名無しさん
05/08/21 14:43:51
>>42
ダイキストラたんに聞いてこい。

45:デフォルトの名無しさん
05/08/21 23:26:50
>>40
つ[構造化定理]

46:デフォルトの名無しさん
05/08/22 13:51:36
>>42
>CやC++等ではGOTO使わないと思うのですが
あなたがどう思うかに関わらず
goto を必要とする人々はいます。
つーか、そういう質問をするスレではありません。

47:デフォルトの名無しさん
05/08/25 10:04:14
>>42
継続(current-continuation)。
明示的に扱えるのはschemeくらいしか無いが。

48:デフォルトの名無しさん
05/09/27 12:40:41
スレタイの無理やり加減が結構好きなんだが
さりとてこれといった話題があるでもない。

49:デフォルトの名無しさん
05/10/23 18:03:34
現実問題goto使った汚いコードよりgoto使わない汚いコードのほうが100倍多い件

50:デフォルトの名無しさん
05/10/23 18:07:55
よくわかんない。
統計とってよ。

51:デフォルトの名無しさん
05/10/23 23:06:54
取ったら取ったでサンプルが偏ってるとか言われそうだな

52:デフォルトの名無しさん
05/10/23 23:19:17
ちゃんと、そう言われないと思うようなデータを取ってこいよ。

53:デフォルトの名無しさん
05/10/23 23:21:13
「汚い」の定義もしないで何を話しているのか・・・

54:デフォルトの名無しさん
05/10/23 23:22:21
お前ら良くこんな底の方にあるスレに気がついたな

55:デフォルトの名無しさん
05/10/23 23:23:37
>>53
定義はいらん。主観だからだ。
ヒューマンインターフェースチックな評価手法が妥当だと思われる。

56:デフォルトの名無しさん
05/10/23 23:25:07
汚ないコードとgotoを使う・使わないが直交しているし、
gotoを使わないコードはgotoを使うコードの100倍どころか
1000倍以上存在しているだろうから、
goto使った汚いコードよりgoto使わない汚いコードのほうがはるかに多いだろう。


57:デフォルトの名無しさん
05/10/23 23:27:22
goto使いたがる人間はコーディングに対して意識の高い人間だからコードはきれい。
ただgotoを排除したがる人間は噂レベルの情報を鵜呑みにする思考停止したコーディングレベルの低い人間だからコードが汚い。

58:デフォルトの名無しさん
05/10/24 09:58:24
すでにgotoの存在自体を知らないプログラマが大多数を占めている罠


59:デフォルトの名無しさん
05/10/24 10:24:45
よくわかんない。
統計とってよ。

60:デフォルトの名無しさん
05/10/24 13:55:43
統計統計と連呼しないで下さい。話を止める効果しかありませんよ。
ご自身の主張をなされば良いでしょう

61:デフォルトの名無しさん
05/10/24 16:35:13
「早起きは三文の得」と言われても、統計を要求する人なんだよ、たぶん。

62:デフォルトの名無しさん
05/10/24 17:39:59
その三文とは金額のことですか? それとも距離のことですか?
具体的にどんな得があるというのか説明してください。

とか?

63:デフォルトの名無しさん
06/01/05 19:14:32
>>58
それはないよ
ジャンプも知らない奴はデバッグできない

64:デフォルトの名無しさん
06/01/05 19:19:09
なぜアセンブリのgotoは許されるのかについて

65:デフォルトの名無しさん
06/01/05 19:20:29
っていうか、アセンブリでjmpなかったら何もできん・・・w

66:デフォルトの名無しさん
06/01/05 19:21:45
つかお前らassertスレが大分前に落ちましたよ

67:デフォルトの名無しさん
06/01/09 00:09:17
gotoだろうが何だろうが頭ごなしに否定あるいは肯定をするのは自分でモノを考えていない証拠です!><
プログラミングってのがそんな定型的な作業ならわざわざ人間様がやる必要はないはずです!><

68:デフォルトの名無しさん
06/01/09 00:20:44
>>67
自分で考えているかどうかっつーより、思考停止しているだけの話だろ。

69:デフォルトの名無しさん
06/01/10 00:05:45
「自分で考えていない」と「思考停止している」はどう違うのか

70:デフォルトの名無しさん
06/01/15 22:31:06
gotoは使ってより美しくなるのなら使え、そうでないなら使うな、ではないか?



71:デフォルトの名無しさん
06/01/16 00:10:04
>>70
同意するけど。
「何が美しいか」は完全に個人的な感覚に属する問題だからw

72:デフォルトの名無しさん
06/03/03 02:45:41
gotoにまつわる話だけで一冊の本になりそうなんだが
どこか出してくれないかな。買うぜ。

73:デフォルトの名無しさん
06/03/03 21:13:04
>>71
goto排斥原理主義者にとっては「gotoが使われている」=「最悪に醜い」だからなぁw

74:デフォルトの名無しさん
06/03/05 14:23:47
knuth先生のコードにもgotoが使われているものがあったぞ。
確かミニマックスαβ探索だったと思う。

knuth先生だって必要最低限のgoto使うことがあるのだから、原理主義はやめるべき。



75:デフォルトの名無しさん
06/05/03 20:41:23
goto 1

76:デフォルトの名無しさん
06/05/03 20:52:18
>>74
ってか、knuth は goto 擁護論者の筆頭だろ。


77:デフォルトの名無しさん
06/05/03 21:42:42
高徳納には先生ってつける奴多いけど何で?

78:デフォルトの名無しさん
06/05/04 17:16:51
趣味だろ

79:デフォルトの名無しさん
06/05/04 22:28:29
先生と 生徒

ハァハァ

80:デフォルトの名無しさん
06/05/04 22:53:19
ジジイは趣味じゃないからパス

81:デフォルトの名無しさん
06/08/08 15:08:54
 if (A) { procX; }
 else if (B) { procY; procX; }
という処理をしたいのですが、procX、procYともに関数にするほどではないけれども、
上の位置にベタで書くにはちょっと無駄なタイプをしている気がするような処理なのです。
そこで
 if (A) goto labelX;
 else if (B) goto labelY;
 else return;
 labelY: procY;
 labelX: procX;
という書き方をしました。procXとprocYの実装を一度しか書かないという縛りで
gotoを使わずに書く書き方があれば教えてくださいm(_ _)m


82:81
06/08/08 15:09:56
書き込んで気が付きましたがスレ違いっぽいですね。
すみません。

83:デフォルトの名無しさん
06/08/08 15:14:08
if(B) procY;
else if(!A) return;
procX;

普通にこれではマズいのか?

84:81
06/08/08 15:57:02
>>83
ぉぅっ。エレガントです…。思いつきませんでした。

実際のコードはAで判定できる箇所が多くかつ判定自体も速いので、
できればAの判定を先に持ってきたいのですが…。
先に書くべきでしたね。

85:デフォルトの名無しさん
06/08/08 16:58:17
if(!A) {
 if(B) procY;
 else return;
}
procX;

これで>>81と等価かな。

86:81
06/08/08 18:22:30
>>85
できるもんなんですねぇ…。
勉強になりました。ありがとうございました。


87:デフォルトの名無しさん
06/08/08 20:00:42
そういう思考ができない人はあまりプログラマに向いて無い希ガス

88:デフォルトの名無しさん
06/08/08 20:15:33
>>81
俺ならこうやってネストしちゃうな。
(例として、条件がCまで、処理がprocZまでの三段階に増えたとする)

if(!A) {
 if(!B) {
  if(!C) return;
  procZ;
 }
 procY;
}
procX;

89:デフォルトの名無しさん
06/08/08 21:43:38
誰もお前には聞いてないんだよカス

90:デフォルトの名無しさん
06/08/08 22:43:54
GOTO使う事によってコードが短くなる件

91:デフォルトの名無しさん
06/08/08 22:54:29
まあ、goto使うことで
コードが短くも速くもならないなら
使うなとは言えるなw

92:デフォルトの名無しさん
06/08/08 23:20:51
    if (flag)
        goto N0021;
    return;

N0021:
    ~

こういうコードならつい最近見た。Fortran から C に単純変換したものらしい。
こういうのがいたるところに orz

93:デフォルトの名無しさん
06/08/08 23:37:24
>>92
実行形式から逆コンパイルした結果も
それと同様に goto だらけになったりするんだろうなぁ。

94:デフォルトの名無しさん
06/08/09 19:48:06
>>89
では今度からきちんと指名 (無料) するように。

95:デフォルトの名無しさん
06/09/06 08:55:10
コンパイル済みの汗ソース見ればくだらない議論と気付くはずw

96:デフォルトの名無しさん
06/09/06 20:08:23
ちうか、わざわざ高級言語つって読み書きしやすい制御構文を用意しているのに、
それを破壊するような使い方をするなっていうのがgotoは悪派の主張なわけで、
機械語に落ちれば全部jmpだろってのはあんまり関係ないよな。

まあ、機械語レベルのjmp命令がif等の制御構文と同等のレベルで
読み書きできるような人間にゃgotoだろうがforだろうが関係ないのかもしれんが、
そうじゃない人もいるんでそういう人も思いやってくれよということで。

97:デフォルトの名無しさん
06/09/28 07:51:36
1.gotoはどんな事があっても絶対使うな!
2.gotoはなるべく使わない方がいい

初心者に教えるなら1の方が正しいと思う。

98:デフォルトの名無しさん
06/09/28 08:24:30
ちなみに俺自身がどの程度使っているか調べてみたら、
92年ごろこんな事やってた。

// ポートからマウス移動量を取得
outp(0x7fdd,0x80);goto L1;
L1: x1 =inp(0x7fd9)&0xf;
outp(0x7fdd,0xa0);goto L2;
L2: x1+=(inp(0x7fd9)&0xf)<<4;
outp(0x7fdd,0xc0);goto L3;
L3: y1 =inp(0x7fd9)&0xf;
outp(0x7fdd,0xe0);goto L4;
L4: y1+=(inp(0x7fd9)&0xf)<<4;
outp(0x7fdd,0);goto L5;
L5: wark =inp(0x7fd9);

pc98のコードだが、今となってはよく分からん。
見ての通り組み込みに近い処理なので、こういうウェイトが
必要な場合もあったんだろうな、たぶん。


99:デフォルトの名無しさん
06/09/28 19:48:42
ジャンプ系の命令を挟んで数clockをwaitするってこと…なのか?
要するにnop代わりにgotoを使ったと…結構アレげだな

100:98
06/09/28 20:20:07
>ジャンプ系の命令を挟んで数clockをwaitするってこと…なのか?

たぶん、そういう事をやりたかったのだと思う。
gotoはCで書けるけど、nopはasmブロックで書かなくてはならないので
gotoを選択したんじゃないかねー。「念のため」的なコードは書かない
主義なので、このgotoが無ければ動かない機種があったのだとは思う。
14~15年前の若かりし日のコードなんで詳しい事は思い出せないなw

101:デフォルトの名無しさん
06/09/28 23:28:51
>>100
約15年前のキミに言っておきたい。
そのコードにはコメントを入れておけとw

102:デフォルトの名無しさん
06/09/28 23:29:29
おっと、もちろん、goto使用理由に関するコメントな。

103:デフォルトの名無しさん
06/09/29 00:27:57
最近のコンパイラだと、最適化で消される悪寒・・・

104:98
06/09/29 00:49:32
>そのコードにはコメントを入れておけとw
まったくもってそうかも知れない。。。

ちなみに別な所はこんな感じ

// マウス割り込みを許可する
void pascal MOUSE::_enable()
{
asm pushf
disable();
setvect(MOUSE_VECT,MOUSE::main); // ベクタの更新
outp(0x7fdf,0x93); // マウスモードセット
int a = inp(0x0a) & 0xdf; // 8259A(スレーブ)読みだし
outp(0x0a,a); // マウス割り込み許可(8259A)
goto w1;
w1: outp(0x7fdf,0x08); // マウス割り込み許可(8255A)
goto w2;
w2: asm popf
}

これだけマメにコメント入れているのに問題のgotoだけ何のコメントも
入ってないのは一体。。。。orz



105:デフォルトの名無しさん
06/09/29 06:52:14
自信の有無か、切羽詰ってたのか、或いは煮詰まっていたのか。

106:デフォルトの名無しさん
06/09/29 23:52:01
>>104
マジックナンバー(0x7fdfとか)に対するコメントはgoodだが、
「ベクタの更新」はコメント要らない気がする。
ていうか、だからgotoにコメント入れろとw

107:デフォルトの名無しさん
06/09/30 02:16:48
goto を入れるまでも無いくらい、自然で当然な行為だったんでわ。

108:デフォルトの名無しさん
06/09/30 02:17:28
goto を、じゃなくてコメントを、だった。
酔ってるんで許してくれ。

109:デフォルトの名無しさん
06/09/30 02:21:43
nopするだけのasmブロックをマクロで定義した方が良かったと思われる。

110:デフォルトの名無しさん
06/12/01 12:12:09
gotoを恐れなく使うのなら、finallyやbreakなんてヌルい物じゃなく、
gotoより強力な継続をバリバリに活用する方法を語るべきだろ。

111:デフォルトの名無しさん
06/12/01 12:34:53
ま、要するに使う側にとっては多少CPU時間が変わろうが仕様通り動けば良いわけだから
個人で開発するぶんには、完全に好みと言うか主観なわけで。


112:デフォルトの名無しさん
06/12/04 10:41:09
それは議論の対象外だろ

113:デフォルトの名無しさん
06/12/23 22:52:44
個人的に、breakとか使わなくてもifとgotoで事足りるんだが。

114:デフォルトの名無しさん
06/12/24 15:34:12
そりゃ、そうだろ…

115:デフォルトの名無しさん
06/12/24 15:46:17
プリフェッチの関係でnopではなくjmp shortを使わないとウエイトにならないとかでしょ?
当時のPC98ではそれが普通だったっつーか俺が覚えてるくらいだから広まってはいたんじゃないか

116:デフォルトの名無しさん
06/12/25 13:40:26
これまで何度も言われてきたことだけど
「個人で開発するぶんには・・・」とか「***で事足りるから***は不要」とか
無意味だとは思わんかね?

117:デフォルトの名無しさん
06/12/25 14:15:25
andとnotとorとgotoで事足りるから制御構造は不要

118:デフォルトの名無しさん
06/12/27 00:36:01
nand さえあれば、andもnotもorも不要なんじゃなかったっけ?

119:デフォルトの名無しさん
06/12/28 15:51:00
最終的にはチューリングマシン云々とかマシン語云々に行き着くんだろうな

120:デフォルトの名無しさん
06/12/29 00:38:20
>>119
フルアセンブラで組むのはさすがにバカ→C言語を使う俺、最高→いやいやC++使いの俺、最高→(以下略

121:デフォルトの名無しさん
06/12/29 01:11:44
プログラマを顎で使うクライアントの俺、最高

122:デフォルトの名無しさん
06/12/29 06:34:33
作業に見合うだけのお金を払ってくれるならな。

123:デフォルトの名無しさん
07/01/02 20:09:15
>>81と似たケースなんだけど
if(A){
 if(B){
  procX;
 } else {
  procY;
 }
} else {
 procY;
}

ってなってたら判断回数を増やさずにprocYを
一箇所だけにしたい場合、

if(A){
 if(B){
  procX;
 } else {
  goto _Y;
 }
} else {
_Y:
 procY;
}

って書く以外にある?


124:デフォルトの名無しさん
07/01/02 20:28:59
if (A && B){
  procX;
} else {
  procY;
}
じゃいけないの?

125:デフォルトの名無しさん
07/01/02 20:55:36
それじゃプログラムが変わってしまう。

126:デフォルトの名無しさん
07/01/02 20:58:39
あれ、ぼけてたかも…

127:デフォルトの名無しさん
07/01/02 21:07:49
>>123
すげー
gotoは絶対禁止ってルール作った方がいいよw

128:デフォルトの名無しさん
07/01/02 21:20:41
>>125
特に変わってないように見えるんだけど

129:デフォルトの名無しさん
07/01/02 22:20:23
>>128
>>126

130:デフォルトの名無しさん
07/01/02 22:22:59
だいたいgoto無くて困った事ないなw

131:デフォルトの名無しさん
07/01/03 19:40:17
>>129
ああそうか、 >>125=>>126 なのか。
>>124=>126 だと思ってた

132:デフォルトの名無しさん
07/01/03 20:01:01
(A && B && (procX || 1)) || procY;
ネタ提供

133:デフォルトの名無しさん
07/01/04 20:07:36
自分はこんなくだらないことでgotoを使う/使わないなどと悩むことはしないよ。

134:デフォルトの名無しさん
07/01/04 21:43:08
悩むまでもなくgotoを使うということか

135:デフォルトの名無しさん
07/01/04 21:49:00
goto眼中無しだろ普通

136:133
07/01/04 22:00:10
>>134
当然noだ。
故意に曲解していないか?
>>135 yes

137:デフォルトの名無しさん
07/01/04 22:17:01
134 はギャグで言っただけだろう

138:デフォルトの名無しさん
07/01/04 22:33:01
はいはいthrowthrow

139:デフォルトの名無しさん
07/01/04 23:21:51
しかしcatch

140:デフォルトの名無しさん
07/01/04 23:23:35
しかしgotoの嫌われっぷりも、相当なもんだよな
実際多少gotoつかったぐらいじゃ、可読性など落ちはしない
可読性を決める要因は、goto文の有無とは殆ど関係ないところにあるのにな

C++でgoto使うと、gotoでコンストラクタすっ飛ばすんじゃねえ
とか、コンパイラに怒られたりするな
goto文はなかなか教育的だ

141:デフォルトの名無しさん
07/01/04 23:35:33
使うシーンが思い浮かばん
使わなきゃならない、もしくは使ったほうがいい場合が思い浮かばん
もっともJava使ってんだけどJavaにはgotoって無いよね?

142:デフォルトの名無しさん
07/01/05 01:10:07
残念ながらJavaはgotoをサポートしていない。

143:デフォルトの名無しさん
07/01/05 01:23:31
特に残念でもないw

144:デフォルトの名無しさん
07/01/05 01:25:25
まぁ、Java は goto なんか使わせたら速攻でスパゲッティなコードを書くようなプログラマを対象にした言語だからな。

145:デフォルトの名無しさん
07/01/05 01:27:06
kwsk

146:デフォルトの名無しさん
07/01/05 01:33:27
このコマンドをいれると自動で玉が出る
goto

ゴト行為はやめましょう

147:デフォルトの名無しさん
07/01/05 01:36:05
>>145
詳しくもなにもそのまんまなだけ。Javaが現代COBOLだとか言われているのって聞いたことない?
"普通のプログラマはまともに使いこせない"という理由で他にも元ネタの言語であるC++からtemplateなどを排除し、
メモリ管理ひとつまともにできないプログラマの為にGCを標準装備したりしている。

148:デフォルトの名無しさん
07/01/05 01:37:48
>>147
そういえばそういうコードはよく見るなw

149:デフォルトの名無しさん
07/01/05 11:29:43
>>144
実際には goto なくてもスパゲッティ作れる人が大量投入されてる。
(そうじゃない人も多数いるけど。まぁどの言語もなんだが。)

150:デフォルトの名無しさん
07/01/05 11:50:03
Javaでmainに全コードベタ書きするスタイルを採用したらgotoが必要になると思うぞ。

151:デフォルトの名無しさん
07/01/05 12:02:54
Dr.goto

152:デフォルトの名無しさん
07/01/05 21:53:43
手続き指向言語(?)にはgoto欲しいかもね

153:デフォルトの名無しさん
07/01/06 17:24:39
>>83
それだと評価順が変わるのでいいのか?
>>85
あとにコードが続いてたらreturnはまずい気が。

154:デフォルトの名無しさん
07/01/06 17:51:23
>>147
詳しくのニュアンスに違和感を覚えるのは俺だけではないはずだ

155:デフォルトの名無しさん
07/01/06 18:46:18
>>154
IT土方の現代コボラーさん、いらっしゃ~い。
まぁ、IT土方なんて沢山いるから、違和感を覚えたのは君だけじゃないよ、きっと、うん。

156:デフォルトの名無しさん
07/01/06 19:10:46
違和感を覚えた部分はそこじゃないと思うよ多分。

157:デフォルトの名無しさん
07/01/06 19:14:03
>>156
IT土方さん、いらっしゃい。

158:デフォルトの名無しさん
07/01/06 20:13:02
コボラーにはJAVAすら使えない。

159:デフォルトの名無しさん
07/01/06 20:34:18
こぼらーってJavaっていう言語があること知ってるの?

160:デフォルトの名無しさん
07/01/06 22:01:30
>>158-159
コボラーにあやまれ! そこの現代コボラー!

161:デフォルトの名無しさん
07/01/06 22:15:19
コボラーってアトランティス人みたいなもんでしょ

162:デフォルトの名無しさん
07/01/06 22:38:27
コボラーってどんな言語?

163:デフォルトの名無しさん
07/01/06 22:44:53
コボラーって伝承とか伝説でだけ出てくる空想上の生物じゃね?

164:デフォルトの名無しさん
07/01/07 16:28:26
>>141
機能限定のラベル付きbreak、continueなら・・・

165:デフォルトの名無しさん
07/01/07 17:57:19
高速電脳の斜向かいにある美容院の名前はコボル

166:デフォルトの名無しさん
07/01/08 01:37:16
コボルちゃん

167:デフォルトの名無しさん
07/01/08 17:48:22
>>158-159
Javaも書けるCOBOLプログラマはそもそもコボラーとは呼ばれない

168:デフォルトの名無しさん
07/01/08 18:02:11
>>167
そのJavaコードがコボルチックだったりするからコボラーと呼ばれる。
コボラーが書いたC言語のコード見たらすごかった。
全部グローバル変数にしてw

169:デフォルトの名無しさん
07/01/08 18:38:23
>>167
そりゃそうだ、現代コボラーと呼ばれるだけだから。

>>168
あるあるw

170:デフォルトの名無しさん
07/01/08 20:15:24
>>168
コボルにはローカル変数無いの?

ちなみにおれ、コボル覚えられなかったんだよね…(´・ω・`)
C系よりよほど難しいと思うんだが。

171:デフォルトの名無しさん
07/01/08 20:23:11
>>170
10年以上前にやったCOBOL85あたりではローカル変数って言う考え方は無かった
アドレスとかポインタとか意識する必要が無いからCOBOLのほうが圧倒的に簡単だと思うがの

172:デフォルトの名無しさん
07/01/08 20:26:56
>170
>ちなみにおれ、コボル覚えられなかったんだよね…(´・ω・`)
>C系よりよほど難しいと思うんだが。

ナカーマ( ・∀・)人(・∀・ )

俺もC++ならtemplateもバッチリ使いこなせてメタプロもできるし、
アセンブラやスクリプト系の言語も問題なくこなせるんだが、
COBOLだけはダメっす。

173:デフォルトの名無しさん
07/01/08 23:47:19
cobolはデータ依存プログラミングができるから、ある意味非常に強力。
逆に、それを使わないとグローバル変数しかない非常に貧弱な言語になってしまう。

174:デフォルトの名無しさん
07/01/15 23:15:26
だから、商用システムなんかにはよく使われていた。
当時は、それが生産性が高かったんだよ。

175:デフォルトの名無しさん
07/03/03 23:23:27
漏れのトコはエラー処理へすっ飛ばす時にgoto使ってるんだが。

goto完全毛嫌い派ってそこんとこどうなん?


176:デフォルトの名無しさん
07/03/04 16:11:26
>>175
あいつら馬鹿だから、もちろんそれも否定するよ。

177:デフォルトの名無しさん
07/03/04 16:29:08
たまに1関数1returnとか言い出す。

178:デフォルトの名無しさん
07/03/04 16:53:23
if( is_error( hoge, hoge ) ) {
 10行ぐらいのエラー処理
 return ERROR;
}

if( is_error( next, hoge ) ) {
 上のと同じ10行ぐらいのエラー処理
 return ERROR;
}

if( is_error( next_next, hoge ) ) {
 やっぱり同じ10行ぐらいのエラー処理
 return ERROR;
}

以下続く

こんな感じの無残なコードは、何度も見かけたもんだがw

179:デフォルトの名無しさん
07/03/29 14:58:09
例外キャッチしたら頭に戻ってやり直しってコードには躊躇なくgotoを使うな

180:デフォルトの名無しさん
07/03/29 21:42:18
>>179
それって catch ブロックの中から try ブロックの中あるいはその前へ飛ぶの?

181:デフォルトの名無しさん
07/04/02 23:02:59
for(;;) try{
// 例外が起きそうな処理
break;
}
catch(e){
}


182:デフォルトの名無しさん
07/04/02 23:46:11
ダサッ

183:デフォルトの名無しさん
07/04/03 01:25:49
摩訶不思議

184:デフォルトの名無しさん
07/04/29 03:54:13
1関数1returnというのは「出口はひとつ」を誤解してるんだろうな。
returnが複数でも出口は一つだし。returnはある意味"goto 最後の}"だと
思えばいい。

本当の「出口が一つじゃない」というのはBASICの
100 GOSUB 200
110 PRINT "1"
120 PRINT "2"
130 END
200 INPUT A
210 IF A=1 THEN RETURN 110
220 RETURN 120
の210行と220行みたいな話を言っているはず。これはもはやreturnではなくて
gotoだからな。

185:デフォルトの名無しさん
07/04/30 03:33:13
じゃあ「入り口が一つ」については?

186:デフォルトの名無しさん
07/04/30 20:37:51
入り口も出口も複数

   subroutine hoge(i, j, k, *, *)
   k = i + j
   entry huge(k, *, *)
   k = k - 1
   if (k .ne. 0) return 1
   return 2
   end

   program main
   read(*,*) n1, n2
   call hoge(n1, n2, i, *100, *300)
100 write(*,*) n1, ' + ', n2, ' - 1 = ', i
   i = 10
200 write(*,*) i
   call huge(i, *200, *300)
300 write(*,*) 'end'
   end


187:デフォルトの名無しさん
07/05/01 18:25:16
>>186
よーし、おじさんはCOBOLつかっちゃうぞ。

PERFORM xxx THRU yyyy

188:デフォルトの名無しさん
07/05/11 20:53:36
goto 1;

189:デフォルトの名無しさん
07/05/12 00:08:15
goto\s+[\w\d]+;|^\s*[\w\d]+:
をショッキングピンクにしてgoto使いまくりだな。

190:デフォルトの名無しさん
07/05/12 18:15:53
色々謎な正規表現だな

191:デフォルトの名無しさん
07/05/13 11:32:44
189の目を盗んでラベルの後に空白文字を入れてやるぜ。
goto fuck189 ;
fuck189 :

192:デフォルトの名無しさん
07/07/21 19:14:32
以下のケースってgotoしたくなる。

if(a && b && c){
処理1
goto jmp;
} else if(d){
処理2
}
if(a && b){
jmp:
処理3
}


193:デフォルトの名無しさん
07/07/21 20:37:51
真理値表を書いてみよう。
a b c d 処理1 処理2 処理3
0 0 0 0 x x x
0 0 0 1 x o x
0 0 1 0 x x x
0 0 1 1 x o x
0 1 0 0 x x x
0 1 0 1 x o x
0 1 1 0 x x x
0 1 1 1 x o x
1 0 0 0 x x x
1 0 0 1 x o x
1 0 1 0 x x x
1 0 1 1 x o x
1 1 0 0 x x o
1 1 0 1 x o o
1 1 1 0 o x o
1 1 1 1 o x o
なんだ、goto要らないじゃん。

194:デフォルトの名無しさん
07/07/24 10:55:01
で、バカを晒した>>192はどこに行った?
しかし、真理値表を書かないと結論が出ない>>193も大概だがな。

195:デフォルトの名無しさん
07/07/24 20:10:20
>>194
if(a && b){
を省略したいってことじゃないかな。auto a,bだとして。
コンパイラにやって欲しい処理だ。

196:デフォルトの名無しさん
07/10/28 23:46:38
goto使ったら先輩にしつこくなじられるようになった
うぜぇwwwwwgotoアレルギーうぜぇwwwwwww

197:デフォルトの名無しさん
07/10/29 21:33:37
>>196
もともと人間関係うまくいってなかっただけじゃね?

198:デフォルトの名無しさん
07/11/02 14:45:06
うちの下っ端で考え無しにgoto使ってるアホがいやがる
うぜぇwwwww無能下っ端うぜぇwwwwwww

って感じだろ

199:デフォルトの名無しさん
08/02/09 17:53:27
スレリンク(tech板:553-578番) あたりの続き
> 578 :デフォルトの名無しさん:2008/02/09(土) 17:20:17
> >>570
> >556 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 13:55:24
> >まぁさ、例外あるような言語ではgotoいらないかもしれないけど、
> >Cとかだと普通に使うよ?
> >557 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 14:28:31
> >いや,普通には使わないわ(ww
>
> ここから始まった話題なので、
> 今に限ってはCのgotoの話をしている。pythonは今のトピックにおいて関係なし。
> Cは例外ないから>>558がgotoなしで書けるという話も決着がついてない。
> ここで例外使えばいいという指摘自体が的外れ。
> まあ実際gotoは無くてもいいが、あると遥かリソース開放とかは便利。
> むろんGCとか例外とかがあればそっちのが便利だが。

存分にどうぞ。

あ、setjmp/longjmp使うからgoto使わないわ、というオチは禁止ね。

200:デフォルトの名無しさん
08/02/09 17:55:48
>>199
リソース解放のためにgotoって、、、不必要に汚ないコードができるだけだろ

201:デフォルトの名無しさん
08/02/09 17:59:11
>>200
goto使わないともっと汚くなるんじゃない。

202:デフォルトの名無しさん
08/02/09 18:00:29
まぁgoto禁止の会社で、あらゆるコードが以下のように
なってるのを見たとき、「素直にgoto使え」とオモタ。

do {
  if (hoge) {
    break;
  }
} while (0);

203:デフォルトの名無しさん
08/02/09 18:05:49
>>199で問題になってるコードを天災
はっきり言って呼び出し側で解放したほうがいい典型例。
呼ばれた側で解放したければ、この関数を呼んでから
解放するような関数を書けと言いたい。

> 558 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 14:35:39
> >>557
>
> そう?ファンクショントレース埋め込むときとか、以下のように
> エラーの場合、リソース開放して戻るときとか頻繁に使うなぁ。
> {
>   A *a = NULL; B *b = NULL; C *c = NULL; int result = E_UNKNOWN;
>
>   if ((a = A_new()) == NULL) {
>     result = E_MEM; goto END_FUNC;
>   }
>   if ((b = B_new()) == NULL) {
> ...
>
> END_FUNC:
>   if (a !=NULL && result != E_SUCCESS) {
>     A_free(a);
>   }
>   ...
> }


204:デフォルトの名無しさん
08/02/09 18:07:55
continueもある場合は、gotoよりも明確になるように思う。

breakで外側のループを脱出するために、switchで書いたほうが良さげな
内側の多分岐がif/else if/else ifになってたりするとgoto使え、だな。

205:デフォルトの名無しさん
08/02/09 18:12:33
>>203
関数がエラーで返った場合、オブジェクトに変更が加えられていないことが
保証されるとする場合、それじゃだめやね。エラーが発生したら、まき戻す
処理が必要になる。

206:デフォルトの名無しさん
08/02/09 18:15:49
>>205
エラーの発生箇所によって巻き戻し方が違うんなら、どのみちgotoでは処理できん。
巻き戻し方が同じなら、goto先で巻き戻すのもreturn先で巻き戻すのも同じ。

と思うのだが。

207:デフォルトの名無しさん
08/02/09 18:19:37
>>206
>エラーの発生箇所によって巻き戻し方が違うんなら、どのみちgotoでは処理できん。

でもgoto使ったほうがスッキリかけるでしょ。

>巻き戻し方が同じなら、goto先で巻き戻すのもreturn先で巻き戻すのも同じ。

APIの使い勝手が大きく違うじゃない。

208:デフォルトの名無しさん
08/02/09 18:57:34
>>207
いや、だからさ、APIとしては呼び出す側は何もしなくていいの。
処理とリソース管理を分離して実装しましょう、ってだけの話。
なんで無理にgotoなんて使いたがるのか、ワケワカラン。

209:デフォルトの名無しさん
08/02/09 19:02:43
>>208
抽象論が多くてわかりにくい。具体的なコード書いて改善してみてくれ。

210:デフォルトの名無しさん
08/02/09 19:12:49
>>203でコピペされてるコードも全然具体的じゃないけどな。

211:デフォルトの名無しさん
08/02/09 19:30:27
巻き戻し処理って、本当に巻き戻すのか単にコピーをしておくのかどっちが多いの?
transactional memoryって効率を求めるとすると、なにかしら約束事があったほうがよいんだろうけど。
完全に透過に見える実装にしたいならos側からアプローチしたほうが楽な気もする。

212:デフォルトの名無しさん
08/02/09 20:28:38
>>210
結局「gotoはダメ!って教えられたからダメダ!」で、思考停止したダケの人なのね。

>>211
>巻き戻し処理って、本当に巻き戻すのか単にコピーをしておくのかどっちが多いの?

場合による。例えば、ある処理が1,2,3,4の順番で実行することがきめられてる場合
(1を実行しないと、2が実行できない場合)、実際に実行して3でエラーが発生したら、
1,2を巻き戻す処理が必要だし。

OS側からのアプローチってどんなアプローチ?

213:デフォルトの名無しさん
08/02/09 20:34:39
gotoなんて設計に何の影響もない
同一関数内でしか影響のないものによくもまあそんなに熱くなれるなw

これ眺める限りさほど奇天烈な使い方があるようにも思えないが。
URLリンク(www.google.com)

214:デフォルトの名無しさん
08/02/09 20:43:49
>>213
>gotoなんて設計に何の影響もない

gotoは設計に影響ないとしても、APIが保障するリソース管理の方針は
大いに影響がある。

下位のモジュールがエラーを返した場合、それ以下のリソースには影響
がなかったことが保障されるのであれば、モジュールは自身の管理する
モジュールを開放すればよいことが保証される。

例外とデストラクタの伝播のようなもの。

215:デフォルトの名無しさん
08/02/09 20:44:26
んで、Cでそれを実装するには、gotoがいいよといってるわけで。

216:デフォルトの名無しさん
08/02/09 20:44:43
GCC の labels as value と computed goto を使うと結構豪快に遊べるけどなw

217:デフォルトの名無しさん
08/02/09 20:47:44
嫌goto厨ってもしかして元N88ベーシッカーが多いのかねw

218:デフォルトの名無しさん
08/02/09 20:49:13
コンパイラ言語で goto を使っても問題ない。
どうせ機械語のジャンプ命令に置き換わるだけなんだから。

ところがインタプリタ言語にとっては goto はパフォーマンスを低下させるやっかいもの。
10 FOR I=1 TO 100
20   FOR J=1 TO 200
30     PRINT "うんこ"
40     IF J=50 THEN GOTO 70
50   NEXT J
60 NEXT I
70 FOR J=1 TO 100
80   PRINT "しっこ"
90 NEXT J
仮にこのようなコードを実行するとしよう(細かいツッコミは無しね)
インタプリタは 10行目で FOR 文に出会い、変数 I と 終了値 100 をスタックに積む
次に 20 行目で 変数 J と 終了値 200 をスタックに積む。
通常は NEXT に出会ったときに終了判定がなされ、終了値に達していれば
FOR をスタックから捨てられる。
ところが 70行目で FOR~NEXT ループの外に飛び出してしまったため
スタックには先ほどの2つの FOR 変数 I と J が積まれたままになる。
さらに 70行目で FOR に出くわしたインタプリタはどういう振る舞いをするか。
スタックに FOR J が既に積まれていないかを検査し、もしあればそれを捨てる作業が必要になる。
実はインタプリタは FOR に出会うたびに、スタックをすべて検査して、重複していないか
確かめているのだ。
GOTO 文さえなければスタックをすべて検査する必要がなくなりパフォーマンスがいくらか上がるはずだな。

java が goto を目の敵にしているのは、このせい。インタプリタにとって goto は大敵なんか長文つかれた
どうせ誰も読んでないだろなめんどくせぇもうやめたうんこちんちん!

219:デフォルトの名無しさん
08/02/09 20:52:59
>>207
こういう話ではないの?
別にどっち使ったからと言って使い勝手というかAPIが変わるとは思えない。
これだったら俺も1を選ぶけど。
//その1
void hoge() //外部に公開される関数
{
void *p = malloc(65536);
//ところどころでgoto END;
END_FUNC:
free(p);
}

//その2
static void hoge_impl(void *p)
{
//ところどころでreturn;
}

void hoge() //外部に公開される関数
{
void *p = malloc(65536);
if (!p)
  hoge_impl(p);
free(p);
}

220:デフォルトの名無しさん
08/02/09 20:57:27
うんこちんちん!
まで読んだ。

221:デフォルトの名無しさん
08/02/09 20:58:35
>>212 ポカーン 自分では全然的確な例も出さずに認定かい

222:デフォルトの名無しさん
08/02/09 20:59:29
>>218
まだJavaをインタプリタ言語と呼んでる人がいるんだね。
正直驚いた。

223:デフォルトの名無しさん
08/02/09 21:06:34
実際にバイトコードインタプリタだったとしても
機械語に翻訳されりゃasmリストのjmpと一緒じゃん。
jmp命令を使えないcpuって不便そう。

224:デフォルトの名無しさん
08/02/09 21:07:45
結論
goto議論に熱中する奴は生産性が低い

goto :eof

225:デフォルトの名無しさん
08/02/09 21:13:36
つーか、BASICのインタプリタと、
Javaのインタプリタのレベルを混同してるヴァカが現存してることに驚いた。

Javaのforでスタックなんか使ってねーっての。

226:デフォルトの名無しさん
08/02/09 21:24:38
>>219
その2のほうさ、管理するリソースが1つだけならまだマシだが、4つも5つも
管理している場合、そのためのサブ関数が4つも5つもできることに
なるわけだが・・・。まぁgoto毛嫌いしている人には、そっちのほうが
ウレピイのかもしれんが。

227:デフォルトの名無しさん
08/02/09 21:28:22
リソース管理なんてif文一発だろ。
お前らもっとでかいモニタ使えよ。
int ret = 0;
if(init1())
{
        if(init2())
        {
                if(init3())
                {
                        ret = execute();
                        fin3();
                }
                fin2()
        }
        fin1();
}
return ret;

228:デフォルトの名無しさん
08/02/09 21:45:05
>>227
そのコードは、俺の頭ではツライ。

229:デフォルトの名無しさん
08/02/09 21:54:45
意外にも java がインタプリタだという事を知らない人が複数いて驚いた。
「JIT」 について、もうすこし学びましょうね。

230:デフォルトの名無しさん
08/02/09 22:01:57
ほぉ。

Javaのバイトコードで、どういう風にforとスタックが関係するのか、
説明していただけますかね?

231:デフォルトの名無しさん
08/02/09 22:26:44
Code: Stack=3, Locals=2, Args_size=1
0: iconst_0
1: istore_1
2: iload_1
3: bipush 10
5: if_icmpgt 39
8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
11: new #3; //class java/lang/StringBuilder
14: dup
15: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
18: ldc #5; //String line
20: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: iload_1
24: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
27: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
33: iinc 1, 1
36: goto 2
39: return

public static void main(String args[])
{
for(int i=0; i<=10; i++) {
System.out.println("line " + i );
}
}
なんというひねりのないコード。

232:デフォルトの名無しさん
08/02/09 22:31:52
インタプリタなのはJVMの方でJavaはコンパイラだろ。

233:デフォルトの名無しさん
08/02/09 22:32:23
public static void main(String args[])
{
try {
for(int i=0; i<=10; i++) {
System.out.println("line " + i );
}
} catch (Exception e) {
System.out.println("boo.");
}
}
にすると
Exception table:
from to target type
0 39 42 Class java/lang/Exception
が追加されて、ジャンプ命令で例外処理の飛ぶ先が決まるんだな。
-ここまで同じ-
39: goto 51
42: astore_1
43: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
46: ldc #11; //String boo.
48: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
51: return
ただしキャッチしなければパレントクラスに飛ぶというのは例外の普通の使い方。
やってる事自体はあまり変わらないけど、言語が持ってる機構は有効に使ったほうが綺麗になるって感じなのかな?

234:デフォルトの名無しさん
08/02/09 22:40:13
で、どのように、
BASICインタプリタで起きるようなFOR-NEXTの対応のズレの
ようなことと、関係してくるんですか、と。

(BASICのFOR-NEXTは、FORを実行する時、NEXTにぶち当たったら
戻るためのポインタをスタックに積んでいるわけですが、それに
相当するコードはどこ?)

それに、
あるインストラクションを実行する時点での、スタックトップは
コンパイル時に確定できますよね?

仮にgotoで気ままに飛んだとしても、飛ぶ時に適宜調整すれば
問題ないわけで。

235:デフォルトの名無しさん
08/02/09 22:41:34
java byte code書いた人とスタック云々の人は別だよw

236:デフォルトの名無しさん
08/02/09 22:50:35
こりゃ失礼しました m(__

237:デフォルトの名無しさん
08/02/09 23:26:01
CPUが java のバイトコードを直接実行していると勘違いしている人が多いですね。
javac ⇒ バイトコード ⇒ インタプリタが実行

238:デフォルトの名無しさん
08/02/09 23:36:27
よくもまあこんな前世紀的話題を得々と・・・

239:デフォルトの名無しさん
08/02/09 23:37:55
今のSunのJVMってJITコンパイルしてないの?

240:デフォルトの名無しさん
08/02/09 23:40:09
>>238
まぁ、新しくプログラミングの世界に入ってくる人たちが、そういう疑問を持つことは
当然というか、ソウであって欲しいものナわけで。「先人達が行ってたから」といって
自分の思考を停止して妄信するよりははるかに良い。

241:デフォルトの名無しさん
08/02/09 23:40:59
ていうか、釣りだろw

釣りとしか思えないよこのインタプリタ厨。

242:デフォルトの名無しさん
08/02/10 12:29:30
釣りだ。
gotoのスレでパフォーマンスの話をして、釣れると思っているね

243:デフォルトの名無しさん
08/02/10 14:58:54
そもそも、大域変数しか使えない言語で「変数をスタックに積むって」ありえるのか?

変数宣言なし&局所変数なしの言語の場合、変数管理表と戻り先(jump先)管理表を使うのが普通だろ?

244:デフォルトの名無しさん
08/02/10 18:24:27
>>243
> そもそも、大域変数しか使えない言語で「変数をスタックに積むって」ありえるのか?
>
> 変数宣言なし&局所変数なしの言語の場合、変数管理表と戻り先(jump先)管理表を使うのが普通だろ?

BASICのFOR-NEXT制御の場合、変数名をタグとして、
FOR x IN ... ~ NEXT x を対応させる処理系がある。
(NEXTのあとの変数名はreminderで、処理系は無視するものもある)

>>218 が得意そうに解説してるBASIC処理系では、NEXT x の x の
変数名を見て、対応するFORの処理に戻るような処理系なんだろうが、
そのような場合、FORの場所だけでなく、変数名もフレームに覚えておく
必要がある。変数の値じゃなくて、変数名そのものか、ポインタかを
タグとして書いておくわけやね。

245:デフォルトの名無しさん
08/02/10 18:53:17
じゃあgotoを使うなって言われるのは、
単純にスパゲッティ化するのを防ぐだけじゃなく、
スタックを開放する作業を確実にやるためだったってことだな。


246:デフォルトの名無しさん
08/02/10 18:55:43
つか今時どうやったら制御構文完備な言語で
goto使ってスパゲッチなコードを書けるんだよw

247:デフォルトの名無しさん
08/02/10 19:02:49
完備ってほどでもないと思うけど。


248:デフォルトの名無しさん
08/02/10 19:04:48
gotoは悪だ!という宣伝がコレまで続けられてきて、普通のプログラマ
はgotoを使ったスパゲティコードに関して十分知っているわけでしょ。
そういう意味では、goto邪悪論の目標は達していると思う。

それなのに会社のコーディング規約でgotoを禁止するのは、どうみても
自社のプログラマを信用していないとしか思えない。

goto禁止したところで、do { if (hoge) break; } while(0)で、gotoに近いことを
やろうと思えば出来てしまうわけだぜ。そういう会社がやるべきは、社員の
教育であってgoto撲滅では決してない。

249:デフォルトの名無しさん
08/02/10 19:29:20
条件分岐とループで複雑に作ってもわけ分からんしな。

250:デフォルトの名無しさん
08/02/10 19:30:07
ゴトーさんが泣いているぞ

251:デフォルトの名無しさん
08/02/10 19:35:51
おまえは、BLASの後藤か、CINTの後藤か、パラメトロンの後藤か、
なんちゃって。

252:デフォルトの名無しさん
08/02/10 19:49:17
>>226
その2のほうさ、管理するリソースが1つだけならまだマシだが、4つも5つも
> 管理している場合、そのためのサブ関数が4つも5つもできることに
> なるわけだが・・・。

>>219の2のどこをどう考えればリソース毎にサブ関数が必要になると思えるのやら。
hoge()の中身が増えるだけだろ。
まさかhoge_implのほうがリソース管理してるとでも読んだのか?

253:デフォルトの名無しさん
08/02/10 19:51:00
>>248
goto邪悪論も有害だが、goto気軽に利用論はもっと有害だな。
あくまで汚ないことをやっているという自覚を持って使うべきだ。


254:デフォルトの名無しさん
08/02/10 20:06:09
相変わらず曖昧論ばっかりだな

255:デフォルトの名無しさん
08/02/10 20:16:53
>>252
いや、そうだな。だがしかし4つも5つもリソースがあるばあいはどうすんの。
そもそもその手法じゃダメやん。

256:デフォルトの名無しさん
08/02/10 20:25:56
つまり>>227のようになってしまうわけだし。依存関係あると。
そうじゃないなら、やっぱりサブ関数をわけて依存関係を
チェインさせる?正気の沙汰じゃないな。

257:デフォルトの名無しさん
08/02/10 20:30:00
//その2
static void hoge_impl(void *p)
{
//ところどころでreturn;
}

void hoge() //外部に公開される関数
{
void *p1 = malloc(65536);
void *p2 = malloc(65536);
void *p3 = malloc(65536);
void *p4 = malloc(65536);
if (p1 && p2 && p3 && p4)
ret = hoge_impl(p);
if (p1) free(p1);
if (p2) free(p2);
if (p3) free(p3);
if (p4) free(p4);
return ret
}

で何か?

258:デフォルトの名無しさん
08/02/10 20:34:55
>>257
mallocならいいが、

>例えば、ある処理が1,2,3,4の順番で実行することがきめられてる場合
>(1を実行しないと、2が実行できない場合)、実際に実行して3でエラーが発生したら、
>1,2を巻き戻す処理が必要だし。

この場合はどうする

259:デフォルトの名無しさん
08/02/10 20:38:03
hoge()の最後でretの中身に応じて必要な回復処理すればいいだけじゃねーの?

260:デフォルトの名無しさん
08/02/10 20:39:28
>>259
書いてミレヨ

261:デフォルトの名無しさん
08/02/10 20:41:43
>>260
おいおい、どんな巻き戻しが必要なのか具体的なコードを出すのが先だろw

262:デフォルトの名無しさん
08/02/10 20:45:17
hoge_impl()の返り値にどこまで進んだかの情報を入れ込んでおけばOK

263:デフォルトの名無しさん
08/02/10 20:47:47
>>261
  if (A_init() != 0) goto A_FAILED;
  if (B_init() != 0) goto B_FAILED;
  if (C_init() != 0) goto C_FAILED;
  if (D_init() != 0) goto D_FAILED;

  return 0;

D_FAILED:
  D_finish();
C_FAILED:
  C_finish();
B_FAILED:
  B_finish();
A_FAILED:
  A_finish();
  return -1;

264:デフォルトの名無しさん
08/02/10 20:49:18
>>263
それのどこが巻き戻しのコード?

265:デフォルトの名無しさん
08/02/10 20:53:08
盛り上がってまいりました

266:デフォルトの名無しさん
08/02/10 20:53:26
>>263
initが失敗したら、finishでまき戻せると思ってくれ。

267:デフォルトの名無しさん
08/02/10 20:54:00
//その2
static void hoge_impl(void *p)
{
  if (A_init() != 0) return A_FAILED;
  if (B_init() != 0) return B_FAILED;
  if (C_init() != 0) return C_FAILED;
  if (D_init() != 0) return D_FAILED;

  return 0;
}

void hoge() //外部に公開される関数
{
switch (hoge_impl(p)) {
case D_FAILED:
D_finish();
case C_FAILED:
C_finish();
case B_FAILED:
B_finish();
case A_FAILED:
A_finish();
return -1;
default:
return 0;
}

で何か?


268:デフォルトの名無しさん
08/02/10 20:57:00
もうこねーよ、ウワーン

269:デフォルトの名無しさん
08/02/10 20:58:18
そんなコード見たことねぇw
goto避ける為にがんばりすぎだなw
大体ローカル変数にアクセスできねぇし
いちいち引数で渡しますか。

C++厨のtry/finallyなんていらねぇ!
がんばればclassのコンストラクタ、デストラクタで何とかなる!みたいだなw

270:デフォルトの名無しさん
08/02/10 21:01:22
>>269 御託はいいから、>>226が筋違いだということは理解できたか?

271:デフォルトの名無しさん
08/02/10 21:02:23
>>269
回復に4つも別々の関数呼ばにゃならんコードな時点で糞ケテーイ

272:デフォルトの名無しさん
08/02/10 21:06:09
みんな、今271が良い事を言ったぞ!

273:デフォルトの名無しさん
08/02/10 21:09:51
がんばることある?
大抵のものは誰かがラッパー作っているし、
ないものは確かに作ることもあるけど、面倒ならboost::shared_ptrに任せられるし。

274:デフォルトの名無しさん
08/02/10 21:09:56
>>269 後出しイクナイ!
ローカル変数うんぬんを言うのなら、A_finishとかが無引数なのはおかしいだろ。

275:デフォルトの名無しさん
08/02/10 21:12:22
>>273
禿同。こんな事にgotoとか使ってる奴はboost時代に乗り遅れてる。

276:デフォルトの名無しさん
08/02/10 21:18:15
でも削除子指定できるscoped_ptrほしい。
と思ったらunique_ptrは削除子していできるのか?

277:デフォルトの名無しさん
08/02/10 21:50:35
>>267
それってさ、一連の処理を分割してしまってるわけだけど、initしてからfinishする
までの処理を。逆にメンテナンスせいが落ちそうじゃない。goto使うよりも。

278:デフォルトの名無しさん
08/02/10 21:52:09
アホが見ても分かるような用途にしかgotoは使わない。

279:デフォルトの名無しさん
08/02/10 21:55:02
>>278
アフォが見てもわかる用途って具体的には?

280:デフォルトの名無しさん
08/02/10 21:57:24
>>277
A_initって名前が悪いんじゃねーかな。
たぶん>>263はA_init()は何か実際に処理をさせたいから"巻き戻し"なんて言ってるんじゃ。
だとするとA_init()はA_proc()と読みかえたほうがいいだろ。
そうすれば>>267>>208が言うように処理とリソース管理の分離というデザインになる。

281:デフォルトの名無しさん
08/02/10 21:59:20
>>279
278じゃないけど多重breakとかかな?
多重breakできる言語が少しうらやましい。

282:デフォルトの名無しさん
08/02/10 22:01:20
それを言うとA_finishも変なネーミングだ

283:デフォルトの名無しさん
08/02/11 00:59:43
ファンクショントレースもgotoの話題にでてたけど、みなどうしてる?
ftraceコマンドとかあるみたいだけど、どうも共有ライブラリとかの
ファンクションコールをうまくトレースしてくんないのよね。

284:デフォルトの名無しさん
08/02/11 01:21:39
あぁちょっと調べてみたら、valgrindとか色々ありそうやね。

285:デフォルトの名無しさん
08/02/11 02:46:36

bool Init()
{
if (!InitHogeGraphics()) {goto FAILED_INIT_HOGE_GRAPHICS;}
if (!InitHogeAudio()) {goto FAILED_INIT_HOGE_AUDIO;}
if (!InitHogeInput()) {goto FAILED_INIT_HOGE_INPUT;}
return true;

FAILED_INIT_HOGE_INPUT:
UninitHogeAudio();
FAILED_INIT_HOGE_AUDIO:
UninitHogeGraphics();
FAILED_INIT_HOGE_GRAPHICS:
return false;
}

こういう使い方もダメなのか?俺的にはスマートな方法だと思ってる
初期化が重なる場合でgoto文を使わない方法って何があるのよ


286:デフォルトの名無しさん
08/02/11 02:57:07
>>285
やりすぎかもしれんが・・・w こういうのも出来なくはないかもしれない、
気もしないでもない。
InitUninitFunc funcs[] = {
  {InitHogeGraphics, UninititHogeGraphics},
  {InitHogeAudio, UninititHogeAudio},
  ...
};

bool Init()
{
  for (int i = 0; i < NELEMS(funcs); i++) {
    if (!funcs[i].init()) {
      for (int j = i; j > 0; j--) {
        funcs[j].uninit();
      }
      return false;
    }
  }
  return true;
}

287:デフォルトの名無しさん
08/02/11 03:22:22
>>285
gotoいらないじゃん

288:デフォルトの名無しさん
08/02/11 03:25:46
>>287
別にgotoなんて無くてもいいんだが、分かりやすいことが重要じゃない?
極論すればwhile()だけで全ての制御構造は書けるわけだし。非常に面倒くさくなるけど。

>>285で、InitHogeAudioの引数の一つがInitHogeGraphicsの結果だったりするみたいな感じで
からみあってたりすると結構面倒くさいんじゃない?

289:デフォルトの名無しさん
08/02/11 03:31:26
ほら、ここでもinit関数と、finish関数のAPI仕様の統一の必要性がでてきた。

「gotoは設計に関係ない」っていったやつでてこい。プログラムのアマチュア
が設計だけして、実装まるなげは本当に排除すべきだ。

290:デフォルトの名無しさん
08/02/11 03:41:18
>>287
いやまぁ、さきの例はそれぞれのinitとuninitが関数だからそうだけど、
たとえば単なる値の設定とそれをクリアするのに関数を用意するのはバカらしい。
それならgoto使うとかいう選択は十分にあると俺は思うな。

291:デフォルトの名無しさん
08/02/11 07:48:56
>>267で結論が出た話を蒸し返してる香具師がいるぞw

292:デフォルトの名無しさん
08/02/11 08:07:30
>290 のように後出しジャンケンばかりやっている奴のコードは仕事に使えん

293:デフォルトの名無しさん
08/02/11 08:15:32
>>285=>>263

294:デフォルトの名無しさん
08/02/11 08:51:09
半端なinit/finishを繰り返す時点でダメダメ

295:デフォルトの名無しさん
08/02/11 10:50:15
>>288
確かにまとめてひとつの関数にすれば数は少なくてすむが、
ラベルの数が多すぎるだろ。

>分かりやすいことが重要じゃない?
分かりにくいんだよ。
制御が入ると、その制御全部チェックしないといけないだろ。
それ、順番間違ったらそれだけでバグになるだろ。


296:デフォルトの名無しさん
08/02/11 11:05:02
gotoなしで実現しようとすれば、
ラベルの代わりにフラグ変数を使うことになるだけじゃないか?

--
int ret_code = 0;

ret_code = !(a_init() ? A_FAILED : 0) &&
ret_code = !(b_init() ? B_FAILED : 0) &&
ret_code = !(c_init() ? C_FAILED : 0);

switch(ret_code) {
case C_FAILED: c_rollback();
case B_FAILED: b_rollback();
case A_FAILED: a_rollback();
}

return ret_code;
--

かつ、何らかの事情でinit()やrollback()を同一関数内に
まとめて書く必要がある場合(式でなく文になる場合)
こういうコードは書けないのでgotoするしかない気がする。

297:296
08/02/11 11:10:43
見直すと意味不明なコードだが気にするなw

298:デフォルトの名無しさん
08/02/11 12:01:53
>>296
> かつ、何らかの事情でinit()やrollback()を同一関数内に
> まとめて書く必要がある場合(式でなく文になる場合)

どんな状況を言いたいのかサパーリわかりません。
ちゃんとした日本語か、仮でいいからCか、どっちかで書いてくれ。

299:デフォルトの名無しさん
08/02/11 12:02:31
>>288
これで「わかりやすい」と思うのは書いた本人だけだと思うぞ。

300:デフォルトの名無しさん
08/02/11 12:05:02
つーか、UnInitって未初期化のことじゃないか
オマエラ本当にマなのか?w

301:デフォルトの名無しさん
08/02/11 12:12:09
>296 たぶん君は10万行以上のコード書いたことないでしょ。
それにチームでコードを書いた経験もほとんど無いように見受けられる。
素人はgoto避けたほうが身のためだよ。

302:296
08/02/11 12:16:53
gotoの代替手段があってそれがgotoより優れているならそうするw

でも>>267>>286みたいに、goto回避を目的としたトリッキーなコードを書くくらいなら
イディオムとして理解できるgotoは素直に利用する方がよっぽどわかりやすい

303:デフォルトの名無しさん
08/02/11 12:19:41
>267をトリッキーと感じる感性でgotoを濫用されちゃ話になりませんな。

304:296
08/02/11 12:21:26
>>298

簡単な例で言えば>>267のコードで
hoge_implおよび*_initをインライン化する必要が出たら
フラグをreturnしてswitchで受けるっていうのは無理だわな、
そんときはどうする?ってこと


305:デフォルトの名無しさん
08/02/11 12:21:45
>>267はgoto回避のトリッキーなコードというよりも、
APIから抜ける前にチェックを「確実に」入れるための簡単なtipsなのだが。

306:デフォルトの名無しさん
08/02/11 12:23:14
>>300
Get:UnGetと書くマがこの世に実在してだな…

>>302
IDEでデバッグできる環境なら多少強引でもgoto回避したほうが追いやすいよ。

307:デフォルトの名無しさん
08/02/11 12:23:27
>>304 具体的に。

308:296
08/02/11 12:23:33
>>303
LABELを定義してgoto label するのと
フラグ定数をdefine してreturn -> switch するのと何が違うんだ?



309:296
08/02/11 12:29:49
こんな感じかな

for (int i = 0; i < 10; i++) {
 if (x[i] == 0) {
  goto A_FAILED;
 } else {
  a /= x[i];
}

for (int i = 0; i < 10; i++) {
 if (y[i] == 0) {
  goto B_FAILED;
 } else {
  b /= y[i];
}

return 0;

B_FAILED:
 something
A_FAILED:
 something
 return -1;


310:デフォルトの名無しさん
08/02/11 12:29:50
意図的に話をループさせて逃げようとしてますな
>>298>>304で答えたことになると思ってんの?

311:デフォルトの名無しさん
08/02/11 12:30:23
>>308 >>305

312:296
08/02/11 12:32:26
309をgotoを使わずに上手く書くのってどうする?


313:296
08/02/11 12:34:10
要望にこたえて>>309に具体的に書いたので、
そちらも具体的なコードでよろしく

関数分割は無しな。
「美しい設計」にしたがって自由にリファクタリングできる業務なら
議論の余地なくgotoなんていらないだろ。ってかそんな環境ならC使わないし。


314:デフォルトの名無しさん
08/02/11 12:35:43
>>309 いいかげん同じようなコード書くのに飽きてきたよ。

int foo_impl() {
for (int i = 0; i < 10; i++) {
 if (x[i] == 0) {
  return A_FAILED;
 } else {
  a /= x[i];
}

for (int i = 0; i < 10; i++) {
 if (y[i] == 0) {
  return B_FAILED;
 } else {
  b /= y[i];
}

return SUCCESS;
}

int foo() { //公開されるAPI
switch (foo_impl()) {
case B_FAILED:
 something
case A_FAILED:
 something
 return -1;
default:
return 0;
}

で何がこまる?

315:デフォルトの名無しさん
08/02/11 12:38:16
どこまで条件の後付けを続けるのかしら…(´・ω・`)

316:デフォルトの名無しさん
08/02/11 12:38:19
>>313
お前な、はっきり言わせてもらうと、馬鹿じゃねーのか?

「goto使わずに、関数分割してリソース管理と処理本体を分離する設計にしろ、
そのほうがgotoでスパゲッティにせずにリソースの解放を確実に実行できる。」
という主張に大して「関数分割はなしな」じゃ議論から逃げているとしか
受け取りようがない。

317:296
08/02/11 12:42:30
>>314
そのコードが実質的に>>309と何が違う?

318:デフォルトの名無しさん
08/02/11 12:46:08
>>317 過去ログ読んでろ。自分のレスだけでなく、相手のレスも真摯に読め。
話はそれからだ。

319:296
08/02/11 12:47:28
過去ログ嫁は逃げるときに便利な言葉だな。


320:デフォルトの名無しさん
08/02/11 12:48:32
正直、もう後出しジャンケンのワナビー初心者相手にするのは飽きた。

321:デフォルトの名無しさん
08/02/11 12:50:54
>319 条件の後付けで逃げてるのはキミのほうでしょ…(´・ω・`)

322:320
08/02/11 12:51:07
飽きたといいつつ、お前は次の奴も相手するよw

323:デフォルトの名無しさん
08/02/11 12:52:17
>>317 過去ログと言わず、自分のレスの1つ前のレスを読んでみたらどうだ?

324:315
08/02/11 12:54:59
>>321もしかして僕のレス見て言ってる…?
>>296へのレスだかんね(´・ω・`)

325:321
08/02/11 12:59:38
>>324
もちろん>>319=>>296へのレスだかんね(´・ω・`)


326:デフォルトの名無しさん
08/02/11 13:08:40
296はトンヅラを決め込んだようですwwwwwwwwwwwカコワリwwwwwwwwwwwww

327:デフォルトの名無しさん
08/02/11 13:11:22
誰もレスしていないが286が良い設計

328:デフォルトの名無しさん
08/02/11 13:33:25
>>267が良いコードとされた時代が懐かしいな

329:デフォルトの名無しさん
08/02/11 13:34:46
なんだ時代は後退してるのか

330:デフォルトの名無しさん
08/02/11 13:37:10
それを後退だと思うなら後退だ。

331:デフォルトの名無しさん
08/02/11 13:41:26
時代の最先端のコードは>>285です。

332:デフォルトの名無しさん
08/02/11 13:41:31
A_init()
A_FAILED
case A_FAILED
A_finish()

ソース上ばらばらなのに意味上は相変わらず密結合
メンテナンス性を悪化させる似非リファクタリングの典型

333:デフォルトの名無しさん
08/02/11 13:45:55
>>332 よく読むとわかるけど、ソース上の距離は>285も同じなんだよ。
文句があるのなら>285に言ってくれw

334:デフォルトの名無しさん
08/02/11 13:48:45
「処理とリソース管理の分離」を掲げた設計に対して
「ソース上ばらばら」は誉め言葉だよwww

335:デフォルトの名無しさん
08/02/11 13:53:31
hoge_impl()に処理を分割した分だけ距離が離れている
A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている

>>334意味不明

336:デフォルトの名無しさん
08/02/11 13:57:34
>>335
gotoであちこちのブロックから飛びまくるのに比べれば
> hoge_impl()に処理を分割した分だけ距離が離れている
> A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている
なんて取るに足らない瑣末な問題だな

337:デフォルトの名無しさん
08/02/11 13:59:07
>>332の日本語訳

意味上の結合を維持したまま、処理本体とリソース管理を分離できている。
メンテナンス性を向上させるリファクタリングの典型

338:デフォルトの名無しさん
08/02/11 13:59:47
勘違いしないでほしいがgoto版との比較で>>267が駄目だという事ではなく
goto版も>>267もどちらも駄目だということ

公開関数であるhoge()から内部一式全てを一人で管理するような小さなモジュールなら
goto版でも>>267でもどちらでも問題にならないだろう。
そうでない規模ならgoto版も>>267もどちらも簡単に破綻する

339:デフォルトの名無しさん
08/02/11 14:01:14
意味不明なのは>>267のコードの
どの部分が処理本体でどの部分がリソース管理なのかが意味不明ということ

340:デフォルトの名無しさん
08/02/11 14:03:33
>>339 それは296にしか答えられない質問では?

341:デフォルトの名無しさん
08/02/11 14:07:14
>>338
つまり、巻き戻し処理のためにgotoのほうが遥かに便利という、
大元の>>199の引用元の主張は×ね。

342:デフォルトの名無しさん
08/02/11 14:08:15
initしてrollbackするだけという、中身が何もない例題じゃあなあ

343:デフォルトの名無しさん
08/02/11 14:12:21
// static void hoge_impl(void *p) {
#define return goto
  if (A_init() != 0) return A_FAILED;
  if (B_init() != 0) return B_FAILED;
  if (C_init() != 0) return C_FAILED;
  if (D_init() != 0) return D_FAILED;
#undef return
  return 0;
// }
// void hoge() {
// switch (hoge_impl(p)) {
#define case label
case D_FAILED:
  D_finish();
case C_FAILED:
  C_finish();
case B_FAILED:
  B_finish();
case A_FAILED:
  A_finish();
  return -1;
#undef case
// default:
//   return 0;
// }

344:デフォルトの名無しさん
08/02/11 14:14:32
嫌goto厨は早く>>213の実例を全否定してまわる作業に戻るんだ

345:デフォルトの名無しさん
08/02/11 14:17:04
>>336
あちこちのブロックから飛びまくるのはgotoを無秩序に使う結果

>>267で何かgotoの重要な欠点が解決されたと思う人は
343と267で何が違うのか考えてみればよい

346:デフォルトの名無しさん
08/02/11 14:21:27
>>345
そうなんだよ。>>343の//で印(w)をつけてくれた部分が重要なんだよ。
あと、#defineの行もミソだね。

こんなつまらんgotoを使わなくても関数で出口を纏めることができるという好例だ。

347:デフォルトの名無しさん
08/02/11 14:22:29
>>344
嫌goto厨?濫用を嫌う人は何人かいるみたいだけど、
gotoを全否定してる人はいないんじゃない?俺も含めて。

348:デフォルトの名無しさん
08/02/11 14:31:06
そんなつまらん実装上の理由で関数分割をしなくとも
gotoさえ使えば綺麗にまとまる好例とも言えるな


349:デフォルトの名無しさん
08/02/11 14:39:18
最近関数内関数なるものの存在を知ったんだけど、
それがあれば「関数を勝手に作れないからgoto使う」って人も、gotoなしでいけるんじゃないかな。


350:デフォルトの名無しさん
08/02/11 14:44:26
>>347
定石的な使い方すら絶対に許さないと必死になっているように見受けられるがw

351:デフォルトの名無しさん
08/02/11 14:52:36
個人的にはgotoが全面禁止でない限り>>267のようなコードは絶対書かないけどな


352:デフォルトの名無しさん
08/02/11 15:09:11
適当に書いた。
関数化したくなければブロックで書けば。
処理続行可能フラグとか変かもしれないけど、
戻り値に成功と失敗を返すなら、それをそのままこのブロックの制御に使える。

>>351で参照

// 前処理
flg = true
while(flg){
if error{
flg = false;
break;
}
break;
}

// 主処理
while(flg){
if error{
flg = false;
break;
}
break;
}

// 後処理
return flg;


353:デフォルトの名無しさん
08/02/11 15:10:22
みす
>>352で参照。

まあ、専用ブラウザならレス番選択して右クリしたら見れる。


354:デフォルトの名無しさん
08/02/11 16:02:48
なんか必死なgoto厨房ががんばってるな。
実装上の都合と設計上の都合の区別もつかないとは。

まあ俺も>>267みたいなコードはまず書かないけどなw

355:デフォルトの名無しさん
08/02/11 16:11:33
>>352
breakの数が多いのはなんでなんだぜ

356:デフォルトの名無しさん
08/02/11 16:13:43
必死な嫌goto厨オツw

357:デフォルトの名無しさん
08/02/11 16:29:18
設計云々なら、俺ならgotoを使わないなら最低限こう書く。
hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。

int hoge_init(); // 略
void hoge_process(); // 略
void hoge_rollback(int r) {
 switch(r) { // 略
 }
}

void hoge() {
 int ret = hoge_init();
 if (!ret) {
  hoge_process();
 } else {
  hoge_rollback(ret);
 }
}

でも実際goto使うよ。イディオムだろこんなの。


358:デフォルトの名無しさん
08/02/11 17:02:46
>>357
>hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。

まぁハゲドウw

359:デフォルトの名無しさん
08/02/11 17:05:54
>>357
俺も
> hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。
に禿同。

こんなつまらんことにgotoを使ったりはせんが。
2重breakには使うけどな。

360:デフォルトの名無しさん
08/02/11 17:31:18
>>355
whileを、breakで好きな段階で抜けられるブロックとして使うため、2度目の実行をしないためにループの最後にbreakを入れる。
これはgotoの代替として普通使ってると思うけど。
まあ、ループしないのにwhile使うのはおかしいって言う人もいるけど。

んで、while 1として無限ループにしたほうが、breakで抜けますよってのを明示できるけど、
flgを入れてみたのは、全体の流れを制御するflgだと明示しつつ、
最後にbreak入れ忘れた場合でも途中でリソース不足とか2度実行のエラーになれば抜けれて安全かなと。


361:デフォルトの名無しさん
08/02/11 17:38:15
エラー終了と正常終了を分ける場合は、主処理のブロックの最後で、breakじゃなくreturnするかな。
配列から探して何番目かを返すようなのは、エラーとNULLが逆になる。
基本だよね。

参照は
>>361

// 主処理
while(flg){
if error{
flg = false;
break;
}
return flg; // 常にtrueが返される。
}

// エラー処理
return flg; // エラーなのでfalseが返される。


362:デフォルトの名無しさん
08/02/11 17:46:24
粘着同士のレベルの低い言い争い、おわった?

363:デフォルトの名無しさん
08/02/11 17:57:38
>>360
なんで do { ... } while (false) にしないんだぜ?


364:デフォルトの名無しさん
08/02/11 18:00:24
>>237
> CPUが java のバイトコードを直接実行していると勘違いしている人が多いですね。
> javac ⇒ バイトコード ⇒ インタプリタが実行

バイトコードを実行するのはインタプリタではなくてVM(仮想計算機)だ。
つまり、インタプリタじゃなくてエミュレータな。

365:デフォルトの名無しさん
08/02/11 18:01:48
バカ亀乙

366:デフォルトの名無しさん
08/02/11 18:07:01
大域脱出に限りgotoを使うという人はgotoの宛先は常にループ直後?

367:デフォルトの名無しさん
08/02/11 18:19:53
while (condition)
 while (condition)
  if (something_wrong)
   goto A_FAILURE;
  else something;

while (condition)
 while (condition)
  if (something_wrong)
   goto B_FAILURE;
  else something;

return 0;

B_FAILURE: something;
A_FAILURE: something; return -1;

368:デフォルトの名無しさん
08/02/11 18:23:45
大域脱出のときだけgoto使うよ派が書くとこうなる?

result = 0;
while (condition)
 while (condition)
  if (something_wrong)
   result = A_FAILURE; goto END_OF_A;
  else something;
END_OF_A:

if (result == 0)
 while (condition)
  while (condition)
   if (something_wrong)
    result = B_FAILURE; goto END_OF_B;
   else something;
END_OF_B:

switch (result)
case B_FAILURE: something;
case A_FAILURE: something; return -1;
default: return 0;

369:デフォルトの名無しさん
08/02/11 18:32:13
またコイツか・・・いいかげんウザ

370:デフォルトの名無しさん
08/02/11 18:43:16
コミュニケーション能力より技術力の方が大切だと思うので
こういう議論で野次馬からウザいと思われるかどうかは気にしませんw

371:デフォルトの名無しさん
08/02/11 18:56:38
>>363
ああそんなのもあったっけ。
doではじめるとwhileに書き換えられたことがあった。

それはともかく、
前処理に失敗したら主処理を飛び越して後処理ってするとき、
処理する前に判断しないとだめだろ。

それに、break忘れのリスクもあるが、戻り値の初期化忘れっていうミスを防ぐ効果もある。
どちらかというと正常か異常かを錯誤するほうが重大なミスだから
whileよりdoがよいということはないと思う。

あと、エラーなら抜けるっていうまったく同じ目的のためのブロックだから、
前処理も主処理も同じ構文使ったほうがわかりやすいしミスしにくい。

とにかく頭使わずにミスなく書くのが目的だから。


372:デフォルトの名無しさん
08/02/11 19:00:40
>>371
>とにかく頭使わずにミスなく書くのが目的だから。

そか。俺は頭使わずにミスなく読めるコードを書くのが目的だから
gotoで書く方が読み易い場面ではgotoを使うんだぜ

373:デフォルトの名無しさん
08/02/11 19:11:03
大域脱出の場合、pythonなら、breakでの脱出とfor文の判断での終了かが
はっきり分けられてるから簡単だよ。

UWSCってマクロならbreak 2っていう、2重ループ脱出命令がある。

結局自分で工夫しないといけない言語と、想定された言語があるんだよね。
そもそも、breakは内部はjmpつまりgotoなんだから受け側をswitchみたいに
自動で分けてくれてれば余計なif文でスペック落としたり、
スペックあげるためにアセンブラ使ったりしなくてすむのにな。

結局、どの言語でも共通の設計でいけるように最小限の文法にしてしまったから使いにくいんだよな。

>>372
それはいいけど>>285みたいなことされても困るんだよ。
あれは関数内でどうせリソースが有効かどうか判断する必要あるだろ。
if hoge { free(hoge); hoge = NULL }
とかな
だったらとび先は
FAILED_INIT_HOGE_INPUT:
FAILED_INIT_HOGE_AUDIO:
FAILED_INIT_HOGE_GRAPHICS:
とか全部いらなくて
FAILED: 一つで足りるんだよ。

飛び先が一つなのは分かりやすいだろ。
そもそも、gotoが分かりにくくなる理由は、飛び元と飛び先に同じラベル名が出てきてどっちからどっちに飛んでるかいちいち確認が必要だからだよ。


374:デフォルトの名無しさん
08/02/11 19:17:57
>>364
少なくともGNUはインタプリタと呼んでいるようだ。

URLリンク(gcc.gnu.org)
>gij is a Java bytecode interpreter included with libgcj.

375:デフォルトの名無しさん
08/02/11 19:18:04
>そもそも、gotoが分かりにくくなる理由は、飛び元と飛び先に同じラベル名が出てきてどっちからどっちに飛んでるかいちいち確認が必要だからだよ。

これは凄い

376:デフォルトの名無しさん
08/02/11 19:20:54
>>361
こんなコード書くやつがいたら、殴ってしまうかもしれない。ペシペシ

377:デフォルトの名無しさん
08/02/11 19:22:58
このスレってFizzBuzzすらパスしない奴がごろごろいそう・・・

378:デフォルトの名無しさん
08/02/11 19:25:23
中身のないコードで空虚な議論
お前らヒマだな

379:デフォルトの名無しさん
08/02/11 19:27:03
>>263をちょっと書き換え

  if (A_init() != 0) goto A_FAILED;
  if (B_init() != 0) 80+0; B_FAILED:
  if (C_init() != 0) goto C_FAILED;
  if (D_init() != 0) goto B_FAILED;

こっそりこういういたずらをしていく人がいるんだ。世の中には。
そういうやつと一緒に仕事しなかった人は幸せもん。

携帯開発の軍曹の話は有名らしいが、
あの戦場を生み出すのがこういうことをする人間なんだ。
本当に単なるミスであの地獄が生まれるとか思ってないよな?
ああいうのをやるやつっていうのは、
周りを引きずりおろすことで自分を立派に見せてのし上がろうとする暴力主義のやつら。特に福岡県出身のやつら。


380:デフォルトの名無しさん
08/02/11 19:30:26
goto肯定論者の俺でもこのスレのgoto厨には賛成できない

381:デフォルトの名無しさん
08/02/11 19:31:09
流れを読まずに横レス。

GOTO 使わず関数使えというのは、太古の昔、非構造化プログラミングから
構造化プログラミングへのパラダイムシフトが現在進行形だった時代の
いわば「スローガン」だと思います。

時代は移り、今は構造化プログラミングが当たり前の時代です。
そのような現在のプログラマが、私たちの先祖が使っていた GOTO 730 と
関数内部での goto FAILED; を同列に論じてしまうことに
私はいささかの疑問を感じるのです。


382:デフォルトの名無しさん
08/02/11 19:33:42
> 周りを引きずりおろすことで自分を立派に見せてのし上がろうとする暴力主義のやつら。特に福岡県出身のやつら。

なんだそのビ妙~な私怨はw

383:デフォルトの名無しさん
08/02/11 19:35:12
こっそりって。コミットログすら書かないのか携帯の開発は。

384:デフォルトの名無しさん
08/02/11 19:38:12
>>381
小さい関数ならいいが、ブクブク太った巨大関数の中でホイホイと飛ばれると
読むほうは疲れるんだよ。多重breakとか限定された状況ならまだ許せるけどな。
特に考えもせずにgoto多様する馬鹿にかぎって巨大な神関数をつくりたがる。

385:デフォルトの名無しさん
08/02/11 19:38:40
>>379
そういうやつと仕事したことないけど、そのコードだとコンパイラ警告
でるんじゃないか?B_FAILEDの行が意味を成していないとか何とか。
擬似コードにつっこむのもあれだが。

386:デフォルトの名無しさん
08/02/11 19:39:47
>>381
飛び先が一箇所ならいいと思うよ。
>>379みたいないたずらされても、ループするか飛ばすかのどっちかしかないから。
goto FAILED;とかは関数につき1回だし普通は最後に飛ぶだけだし問題になることはないからね。

>>383
証拠が残せるようなシステム使ってないから。

>>382
福岡はそういう地域なんだよ。
完成品チェックって横槍いれて完成してたら強奪。奪ったらパソコン初期化して証拠隠滅。
毎度毎度そればっかり。

完成してたら強奪→正社員
奪われるばっかりの人→派遣社員

いや、別に比喩してるわけじゃなくてね。
社員同士でもそうなんだよ。


387:デフォルトの名無しさん
08/02/11 19:41:27
それはgoto以前の問題だし因果関係が明らかに逆。

適切に関数分割できない馬鹿だから
巨大関数の中をgotoで飛び回るコードになる。

そういう馬鹿に言うべきは「処理のまとまりごとに関数に分けろ」であって
そいつに「gotoを使うな」と言ったところで
今度は巨大なネストをフラグで引き回すコードを書くだけ。

388:デフォルトの名無しさん
08/02/11 19:42:12
>>385
B_FAILED の後ろがセミコロンからコロンになっているのに注意。
君はだまされる方だな。

389:デフォルトの名無しさん
08/02/11 19:45:08
馬鹿?

390:デフォルトの名無しさん
08/02/11 19:52:16
>>388
きづかなかった・・・w

もしかしてあなたは、そういういたずらをチョコチョコやっているのではな
いかと、疑いたくなってきたなw

391:デフォルトの名無しさん
08/02/11 19:52:52
朱に交われば、なんとやら・・w

392:デフォルトの名無しさん
08/02/11 19:55:23
>>387
でもこのスレで出てきてるコード読むと、
神関数つくりそうな勢いのコードが目につくんだけど。

393:デフォルトの名無しさん
08/02/11 19:56:28
昔一緒に仕事したひとで、
「1関数にreturnは1つしか書かない」
という信念を曲げない人がいた。
その人の書いた関数は、最後にラベルがたくさんあってgotoの山盛りだった・・・

ってあれ?デスマーチスレじゃないのか、ここ。

394:デフォルトの名無しさん
08/02/11 20:02:25
>>393
そいつってオレジャネ?

395:デフォルトの名無しさん
08/02/11 20:12:00
まさかの運命の再会

396:デフォルトの名無しさん
08/02/11 20:29:31
でもさ、数行の排他を必要とする関数で

  lock();
  if (arg == NULL) {
    unlock();
    return E_PARAM;
  }
...
  unlock();

よりも下のほうが好みだなぁ。lock()とunlock()内を関数に分離するのも馬鹿馬鹿しい
ほどの小ささだと

  lock();
  if (arg == NULL) {
    result = E_PARAM;
    goto END_FUNC;;
  }
...
END_FUNC:
  unlock();
  return result;


397:デフォルトの名無しさん
08/02/11 20:38:38
一方、俺はfinallyを使った。

398:デフォルトの名無しさん
08/02/11 20:45:37
>>397
Cなんだよ、バーヤバーヤ

399:デフォルトの名無しさん
08/02/11 21:48:02
某スレより

569 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 16:46:29
>>566
try finallyは例外を捕まえるための機構であって、ファンクション
トレースのための機構ではない。

デストラクタでロギングするほうがよっぽどスマート。try finally
に依存したロギングよりも。そしてアスペクト指向のほうが
デストラクタロギングよりももっとスマートだといっているのだよ。


400:デフォルトの名無しさん
08/02/11 21:53:30
finallyって例外つかまえるための機構?
例外以外にもreturnとかでも呼ばれるんじゃないの?

401:デフォルトの名無しさん
08/02/11 21:57:43
C++厨かよ

402:デフォルトの名無しさん
08/02/11 21:59:16
gotoはダメだって言っているやつって、
ループ内break、continue、関数の途中のreturnとかもダメだと思ってるの?

403:デフォルトの名無しさん
08/02/11 22:01:34
>>402
少なくともこのスレではそんな主張をしているレスは見あたらないね。
で、それがどうしたの?

404:デフォルトの名無しさん
08/02/11 22:02:58
そもそもgotoはダメだという主張自体が見当たらないのだが。
できるだけ避けろ、とか、濫用するな、ってのはあるようだがな。

405:デフォルトの名無しさん
08/02/11 22:10:13
>402は脳内敵をプロファイリング中でーす

406:デフォルトの名無しさん
08/02/11 22:14:51
gotoを書く奴はスパゲティコードを書くという前時代の妄想で脳内敵を作り上げているのはどっちだか

407:デフォルトの名無しさん
08/02/11 22:15:56
重要なのはgotoを使うか使わないかじゃなくて
ちゃんとコードレビューしろよってことだ

408:デフォルトの名無しさん
08/02/11 22:21:14
>>400
> 例外以外にもreturnとかでも呼ばれるんじゃないの?

正確には、フレームが巻き戻されるのをトラップする機能。
それを利用して、例外のハンドリング(catch)や、後始末の処理(finally)の機構が
実装されている、という表現が正確。

409:デフォルトの名無しさん
08/02/11 22:24:36
その「できるだけ」とはどこまでなのかという議論をしていたんじゃ?



410:デフォルトの名無しさん
08/02/11 22:24:46
>>407
修正箇所だけのコードレビューとかなら確かにうまくいくけどさ、
何万行のソースコードをレビューで全部網羅するって、
全然うまくいったことがないな。みんなどうしてるのだろ。
ペアプロとかのがよさそうだけど、やったことないや。

411:デフォルトの名無しさん
08/02/11 22:28:34
ルール:gotoを使っている関数はコードレビューの対象とする


412:デフォルトの名無しさん
08/02/11 22:31:56
>>411
ごめん、俺「関数のreturnは必ず一箇所でやる」ポリシーもってるから、
全部レビュー対象となる^^

413:デフォルトの名無しさん
08/02/11 22:33:39
>>412
^^と書いているが俺が去年やってたプロジェクトだと笑い事じゃなくて実際そうなる。

414:デフォルトの名無しさん
08/02/11 22:36:42
具体的に言うと、gotoを使っている関数は
フローチャートおよび詳細な動作説明をドキュメントとして準備してコードレビュー。
もちろんそういうドキュメントを用意してレビュー会で説明するのは実装者。
承認となった場合もドキュメントは保管。

なので濫用する奴なんか自然といなくなる。
誰も濫用しないから何万行のレビューなんてのも実際は発生しない。
無問題。

415:デフォルトの名無しさん
08/02/11 22:41:30
goto使ってる関数だけって、、、
あほらし。

416:デフォルトの名無しさん
08/02/11 22:45:08
if と if and only if の区別も付かない奴か。

417:デフォルトの名無しさん
08/02/11 22:49:57
>>414
それだけだとgoto濫用防止だけだけど、ホカにはどんなルールをきめてるん?

418:デフォルトの名無しさん
08/02/11 22:52:23
>>414
それとさ、組み込み系だとファンクショントレース機能があるICEとか
結構効果なのだけどさ、それも全開発者に配布?

419:デフォルトの名無しさん
08/02/11 22:52:57
結構効果なのだけどさ→結構高価なのだけどさ

420:デフォルトの名無しさん
08/02/11 22:55:55
>>417
あれこれ言ったら個人特定されるでしょ

単純なのは、一関数が一定の行数を超えたらとか
for文で()の中に書く内容が「普通じゃない」とか

ちなみに>>412の理由だけでgotoを使った場合はレビューで却下だよ。


421:デフォルトの名無しさん
08/02/11 22:58:23
>>420
世の中にドレダケぷろじぇくとまねーじゃが存在しているのか考えれば、
あなたがやっていることと同じようなことをやっている人は無数にいるから、
特定なんてされないと思うぞw

422:デフォルトの名無しさん
08/02/11 22:59:17
>>421
じゃあ先に君の関わったプロジェクトで採用されていたルールを教えてくれ

423:デフォルトの名無しさん
08/02/11 22:59:32
>>420
「普通じゃない」とかの基準で、資料作成させられて説明させられる
プログラマかわいそすwww

もうちょいまともな基準作ったほうがイインジャナイ?

424:デフォルトの名無しさん
08/02/11 23:00:47
んーとね。いちいち説明しないとわからんかな。

何が「普通」かは実際には定義されているの。ここでは書かないけど。
簡単に言えばループ変数の初期化、終了条件、増分を普通に書くのが普通

425:デフォルトの名無しさん
08/02/11 23:01:39
>>423
説明するのが手間になるようなコードを書くほうが悪いと思うが。

426:デフォルトの名無しさん
08/02/11 23:01:56
>>424
「なにが普通か」の基準をきめるための努力は世の中に一杯あって、
基準めいたものもあるんじゃない?

427:デフォルトの名無しさん
08/02/11 23:02:46
>>425
え~だって、俺様基準で「普通じゃないから」っていわれて、「フローチャート」
まで用意させられるのだぜw

428:デフォルトの名無しさん
08/02/11 23:06:57
>>427
フローチャートはgotoの場合じゃないの?
forの場合には何かトリッキーな式を書いた場合に
そのトリッキーな式がなぜ必要なのかを説明する
ドキュメント+プレゼンとかそんな感じだと思うが。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch