なぜ構造化プログラミング=gotoなしプログラミングという信仰が生まれたか?
ひとつには "Go To Statement Considered Harmful" のタイトルが一人歩きしたことによるものだろう。現代であればともかく、1980 年代には原文に当たる手段は大学図書館ぐらいしかなく、雑誌などで紹介される際は下手をするとリファレンスさえなく(ちなみに CACM Vol. 11, No. 3)そしてレターが書かれた時代(1968年)からはそれなりに時代が経っており正確な理解が難しくなっていた、という三重苦だったわけだ
そしてもうひとつは、クラシックな BASIC であきらかに必要な GOTO が、構造化言語ではあからさまに必要なくなる、という実例があることが、「構造化プログラミング=gotoなしプログラミング」という神話の源流となったのではないだろうか
(本当に goto のない Java には(一応予約語にはなってるけど)、ループ文にラベルを付けることができて、そのラベルを指定した break や continue があり、例外が言語仕様にある。もし仮にこれらの飛び道具なしに goto 撤廃をしていたら反発されただろう)
さて、まず以下のような C のコードと、それに相当するクラシックな BASIC のコードを考えてみる
if (cond) { 処理 A } else { 処理 B }
これはクラシックな BASIC では
10 IF !cond THEN GOTO 40 20 処理 A 30 GOTO 50 40 処理 B 50 ...
ジャンプが入組んでややこしいが、こう書くほかない
(一応マルチステートメントを使って以下のようにすっきり書くこともできなくはないが邪道っぽい)
10 IF cond THEN GOTO 20 : 処理 B : GOTO 30 20 処理 A 30 ...
これが例えば構造化 BASIC(確か PC-E650/U6000 の構造化 BASIC がこんな言語仕様だったと思うのだが)であれば
10 IF cond THEN 20 処理 A 30 ELSE 40 処理 B 50 ENDIF
のように GOTO を使わずに書ける。このような、構造化により GOTO が必要なくなるというわかりやすい例があったがために、「構造化プログラミング=gotoなしプログラミング」という神話が生まれたのではないかと思う
(はてなの構文ハイライトが ENDIF を認識せんなw)