[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/22 04:06 / Filesize : 243 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

gotoを恐れず使う兵共がfinallyや多重breakを語るスレ



1 名前:デフォルトの名無しさん [2005/08/11(木) 11:18:15 ]
前スレ pc8.2ch.net/test/read.cgi/tech/1021364372/

267 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:57:00 ]
もうこねーよ、ウワーン

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

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

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

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

272 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:06:09 ]
みんな、今271が良い事を言ったぞ!

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

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

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



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

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

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

279 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:55:02 ]
>>278
アフォが見てもわかる用途って具体的には?

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

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

282 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:01:20 ]
それを言うとA_finishも変なネーミングだ

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

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

285 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:22:22 ]
>>285
gotoいらないじゃん

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

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

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

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

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

291 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 07:48:56 ]
>>267で結論が出た話を蒸し返してる香具師がいるぞw

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

293 名前:デフォルトの名無しさん [2008/02/11(月) 08:15:32 ]
>>285=>>263

294 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 08:51:09 ]
半端なinit/finishを繰り返す時点でダメダメ

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

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




296 名前:デフォルトの名無しさん [2008/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 [2008/02/11(月) 11:10:43 ]
見直すと意味不明なコードだが気にするなw

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

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

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

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

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

302 名前:296 [2008/02/11(月) 12:16:53 ]
gotoの代替手段があってそれがgotoより優れているならそうするw

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

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

304 名前:296 [2008/02/11(月) 12:21:26 ]
>>298

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


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



306 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:23:14 ]
>>300
Get:UnGetと書くマがこの世に実在してだな…

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

307 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:23:27 ]
>>304 具体的に。

308 名前:296 mailto:sage [2008/02/11(月) 12:23:33 ]
>>303
LABELを定義してgoto label するのと
フラグ定数をdefine してreturn -> switch するのと何が違うんだ?



309 名前:296 [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:29:50 ]
意図的に話をループさせて逃げようとしてますな
>>298>>304で答えたことになると思ってんの?

311 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:30:23 ]
>>308 >>305

312 名前:296 [2008/02/11(月) 12:32:26 ]
309をgotoを使わずに上手く書くのってどうする?


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

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


314 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:38:16 ]
どこまで条件の後付けを続けるのかしら…(´・ω・`)



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

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

317 名前:296 [2008/02/11(月) 12:42:30 ]
>>314
そのコードが実質的に>>309と何が違う?

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

319 名前:296 [2008/02/11(月) 12:47:28 ]
過去ログ嫁は逃げるときに便利な言葉だな。


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

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

322 名前:320 [2008/02/11(月) 12:51:07 ]
飽きたといいつつ、お前は次の奴も相手するよw

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

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

325 名前:321 mailto:sage [2008/02/11(月) 12:59:38 ]
>>324
もちろん>>319=>>296へのレスだかんね(´・ω・`)




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

327 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:11:22 ]
誰もレスしていないが286が良い設計

328 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:33:25 ]
>>267が良いコードとされた時代が懐かしいな

329 名前:デフォルトの名無しさん [2008/02/11(月) 13:34:46 ]
なんだ時代は後退してるのか

330 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:37:10 ]
それを後退だと思うなら後退だ。

331 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:41:26 ]
時代の最先端のコードは>>285です。

332 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:41:31 ]
A_init()
A_FAILED
case A_FAILED
A_finish()

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

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

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

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

>>334意味不明



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

337 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:59:07 ]
>>332の日本語訳

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

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

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

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

340 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:03:33 ]
>>339 それは296にしか答えられない質問では?

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

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

343 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:14:32 ]
嫌goto厨は早く>>213の実例を全否定してまわる作業に戻るんだ

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

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



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

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

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

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


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


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

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


352 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん [2008/02/11(月) 15:10:22 ]
みす
>>352で参照。

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


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

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

355 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:11:33 ]
>>352
breakの数が多いのはなんでなんだぜ



356 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:13:43 ]
必死な嫌goto厨オツw

357 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:02:46 ]
>>357
>hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。

まぁハゲドウw

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

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

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

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


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

参照は
>>361

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

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


362 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:46:24 ]
粘着同士のレベルの低い言い争い、おわった?

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


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

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

365 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:01:48 ]
バカ亀乙



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

367 名前:デフォルトの名無しさん mailto:sage [2008/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;






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<243KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef