@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- PR -

なぜ「GOTO文」を使っては、いけないのですか?

投稿者投稿内容
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-04-23 13:26
>Beatle様

確かにGOTO悪者論の黎明とBASIC言語の普及とは時期的に重なっていたと思いますが、しかしその当時はBASICはまだホビーとして使われることが多く、業務プログラムはアセンブリ言語、COBOLあるいはFORTRANで書かれていることが多かったと思います。

GOTO悪者論は、やはり処理の追いにくさが理由の第1位で、単にBASICにおける言語仕様に由来するものではなかったと記憶していますが。(昔のFORTRANも、GOTO 行番号です。)

※ちなみにCOBOLでは GO TO です。多くの言語でGOTOになっているのは、その方が構文解析がシンプルにできる、といった程度の理由ではないでしょうか。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-04-23 13:28
プログラムが続行不可能な状態では、GOTO 使って異常終了させるのは有効だと思いますね。
その後処理できる事といえば、メッセージ出力くらいでしょうから。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-23 13:36
グローバル変数より、早く終わる話と思ったのに...
1時間足らずで、予想が甘い事を痛感させられました。
処理制御の話だけに、「グローバル変数」より話が深いかも...

引用:

たーぞうさんの書き込み (2004-04-23 11:51) より:
あらゆる処理は、
 A.順次処理(処理の並び)
 B.分岐処理(if)
 C.繰り返し処理(while ・・・ 型のループ)

の組み合わせによって記述できるので、はにまるさんの提示された1〜6までの言語仕様を
満たしていないからといってgotoを使用してよいという説明にはならないと思うのですが、
はにまるさんがそのように仰られた意図をご説明いただけますでしょうか。


たーぞうさんの示された内容は、処理制御の最小単位を構成する話で、言語表現する場合は、
その構造をそのまま用いる事は少ないのでは無いでしょうか?

私のGOTO文を使って良いというのは、定義した6パターンの制御の代行としての御話です。
どちらかと言えば、GOTO文が基本で、GOTO文で良くあるパターンを
定義したのが、For文 While文、Break文、Return文と考えています。

実際にGOTO文を使わないと決めた場合の対策を考えると
下記の通りとなります。

 1.「指定回数まで繰返制御する」構文が無い場合。
   ・Do..Loop文+カウンター変数を用いる。
   ・Do..Loopが無い場合、、、無理では..

 2.「指定条件まで繰返制御する」構文が無い場合。
   ・無理では..

 3.「指定条件で分岐制御する」構文が無い場合。
   ・IF文の多重構成(あれ、GOTO関係ないか)

 4.「繰返制御を抜ける」構文が無い場合。
   ・繰返を抜ける条件を設定し
    エラーフラグを用いて、繰返内部の構文を個別に全てIF文で囲む。
   ・繰返内部をルーチン化して、Exit ルーチンを代行して使う。
    
 5.「繰返制御の開始位置に戻る」構文が無い場合。
   ・エラーフラグを用いて、繰返内部の構文を個別に全てIF文で囲む。
   ・繰返内部をルーチン化して、Exit ルーチンを代行して使う。

 6.「特定処理を呼出て戻す」構文が無い場合。
   ・とにかくコードをコピー&ペースト(そういう問題か?)

私は、GOTO文を使います...

はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-23 13:56
そういえば、昔は行番号指定でGOTO文記述していたんですよね...
ラベル指定で出来る言語見て感動しました。(ってVBだけど)

サブルーチン概念が無い時は、GOSUB文ってのもありましたね。

所で昔のC言語は、アドレス指定で処理をジャンプするんですか?
bubunya
大ベテラン
会議室デビュー日: 2003/01/16
投稿数: 124
投稿日時: 2004-04-23 14:02
私が思うに、一つのプログラム/関数/サブルーチン内で上へ下へ交差するように使う人が居たから嫌われたんだと思います。昔の Basic の「goto 行番号」が見づらいのは間違いないと思いますが?

># 冗談はともかく、longjmpとかどうなんだ、とか

これは Goto と同じくくりにしてはいけないような気もしますが。でも、使い方を間違えるととんでもない事になるのは間違いありませんね。

>プログラムが続行不可能な状態では、GOTO 使って異常終了させるのは有効だと思いま
>すね。
>その後処理できる事といえば、メッセージ出力くらいでしょうから

Basic に限って言えば、こういうパターンは、On error と error の組み合わせて try/catch みたいな形にしても良いかと思います。「Goto なんか使ってる!」とも言われないし

タモリのファン
会議室デビュー日: 2004/02/07
投稿数: 7
投稿日時: 2004-04-23 14:07
VBやVBScriptでループ中のbreack,continueを使いたいときに
コメントにゴメンって書いて使った覚えがあるなー。
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-04-23 14:14
引用:

はにまるさんの書き込み (2004-04-23 13:36) より:
グローバル変数より、早く終わる話と思ったのに...
1時間足らずで、予想が甘い事を痛感させられました。
処理制御の話だけに、「グローバル変数」より話が深いかも...


人それぞれですから^^;

引用:

はにまるさんの書き込み (2004-04-23 13:36) より:
たーぞうさんの示された内容は、処理制御の最小単位を構成する話で、言語表現する場合は、
その構造をそのまま用いる事は少ないのでは無いでしょうか?

私のGOTO文を使って良いというのは、定義した6パターンの制御の代行としての御話です。
どちらかと言えば、GOTO文が基本で、GOTO文で良くあるパターンを
定義したのが、For文 While文、Break文、Return文と考えています。

実際にGOTO文を使わないと決めた場合の対策を考えると
下記の通りとなります。

 1.「指定回数まで繰返制御する」構文が無い場合。
   ・Do..Loop文+カウンター変数を用いる。
   ・Do..Loopが無い場合、、、無理では..


i = 0;
while(i < 10) {
   :
 i = i + 1;
}
でできます。

引用:

はにまるさんの書き込み (2004-04-23 13:36) より:
 2.「指定条件まで繰返制御する」構文が無い場合。
   ・無理では..



実行文1
while(not 指定条件) {
  実行文1
}
でできます。同じ処理を2箇所に書かなければなりませんが。

#追記
#
# flag = true;
# while(flag or not 指定条件) {
#  実行文
# flag = false;
#}
#
#でもできます^^;

引用:

はにまるさんの書き込み (2004-04-23 13:36) より:
 3.「指定条件で分岐制御する」構文が無い場合。
   ・IF文の多重構成(あれ、GOTO関係ないか)

 4.「繰返制御を抜ける」構文が無い場合。
   ・繰返を抜ける条件を設定し
    エラーフラグを用いて、繰返内部の構文を個別に全てIF文で囲む。
   ・繰返内部をルーチン化して、Exit ルーチンを代行して使う。
    
 5.「繰返制御の開始位置に戻る」構文が無い場合。
   ・エラーフラグを用いて、繰返内部の構文を個別に全てIF文で囲む。
   ・繰返内部をルーチン化して、Exit ルーチンを代行して使う。


そうですね。

引用:

はにまるさんの書き込み (2004-04-23 13:36) より:
 6.「特定処理を呼出て戻す」構文が無い場合。
   ・とにかくコードをコピー&ペースト(そういう問題か?)


まぁこれはあった方がいいですよね^^;

引用:

はにまるさんの書き込み (2004-04-23 13:36) より:
私は、GOTO文を使います...


場合によっては、私もGOTOを使うことがあります。

skulkerさんが書かれたように、プログラムの途中でそのプログラムを抜け出てしまうようなコーディングはなんとなくいや(趣味の領域か?)なので、可能ならばGOTOでプログラムの最後まで飛ばしてしまう、ということは時々やります。

[ メッセージ編集済み 編集者: たーぞう 編集日時 2004-04-23 14:17 ]

[ メッセージ編集済み 編集者: たーぞう 編集日時 2004-04-23 14:40 ]
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2004-04-23 14:28
引用:

たーぞうさんの書き込み (2004-04-23 13:26) より:

GOTO悪者論は、やはり処理の追いにくさが理由の第1位で、単にBASICにおける言語仕様に由来するものではなかったと記憶していますが。(昔のFORTRANも、GOTO 行番号です。)



ですね。

かなり逆説的ですが、Forループ、Whileループ、Doループといった今時の
プログラムでは当たり前のループですが、すべてIF文とGOTO文で書けるんですねぇ...
※GOTO文恐るべし...

ってこんな何でもかんでもGOTOで書いてしまうような事するから、「使うな!」って
なるんでしょうね。

[ メッセージ編集済み 編集者: Beatle 編集日時 2004-04-23 14:30 ]

スキルアップ/キャリアアップ(JOB@IT)