• ベストアンサー

if文がbegin - endな訳は?

if 条件 > 0 then  begin   条件あり  end else  begin   それ以外。  end; Delphiでは、こうなるのですがなぜ{}を使わないのでしょうか? {}はコメントになるけど、//でも/* */ でもいいじゃないですか。 それに比べて、begin - end って面倒じゃないですか? 何かの本でif文が多いのは汚いプログラムだ、と読んだのですが、当時はPerl,PHPしか知らなかったので、それほど汚くないじゃん。と思ったのですが、Delphiを使ってみると、やっぱりif文が汚く感じます。 もちろん、コンパイルするので、書き方は開発者の自由なのは分かりますが、{}ではいけない明確な理由があるんでしょうか? 豆知識を持っている方、プログラム経験上分かった方、よろしくお願いします。

noname#17016
noname#17016

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

いけない理由は無いですね。DelphiはPascalの一種ですが、Pascalという言語を設計した人がそう決めたというだけです。「なぜwhenじゃなくてifなんだ」という疑問と同じです。 なぜ { } でないかというのを豆知識的に言うと当時のコンピューターは文字セットがメーカーごとに違い、必ずしも { } が存在しないという理由もあったでしょう。その場合、(* *) が代わりに使われました。 そうするとあなたの疑問は、「なぜ (* *) じゃなくてbegin endなんだ?」ということになります。 さらにbegin endはPascalが参考にしたAlgol60という言語から来ています。ということで、あなたの疑問は、「なぜAlgol60ではbegin endを使い、(* *) を使わなかったんだ」というところに帰着しますが、理由は冒頭に書いたとおり、「言語設計者がそうしたから」です。 begin,end.{,}等不要で、 if 条件 then 真のときの文1; 真のときの文2 else 偽のときの文1; 偽のときの文2 fi と書ける言語もあります。

noname#17016
質問者

お礼

やっぱり、豆知識を持っている方はいるんですねー。 正直、回答はなしか、開発者のかって、というのが予想でした。 プログラム的な制約や利点ではなくって、昔はパソコンの文字セットに{}がない場合というのがあったんですねー。それは予想外です。 if(条件)(* 処理 *) となっていれば、見栄えもよくすんだのに。>w<。クー begin-end直感的に分かりにくいと思うのは私だけ? 勝手な想像ですが、他のプログラムと差別化したかったのかなー、と。 例は、Linux等のシェルスクリプトですねー。 生き字引のような豆知識ありがとうございました。

その他の回答 (2)

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.3

#2の回答の補足になります 要はNicklaus Wirth先生の趣味と言うことになります。 ALgolもPascalもModula-2もwirthの貢献無しには誕生しませんでした。 で、もし、Wirthなかりせば、Cの登場も遅れ(無かったかも)、主力言語は未だに非構造化言語であるFORTRAN66やCOBOL74でとどまっていたかもしれません。 ひょっとすると、C&RやDjykstraも世に出ていない。 システム記述もアセンブラのまま、UNISYSは未だにUNIVACとBurroughsのままだったかも、というより、Burroughsなかったかも。 と、まあそのくらい、陰では影響のあった人です。 そういう意味では、begin-endくらいはご愛敬のうちでしょうね。この先生は、シンタックスやデータ型にも厳しい人で、宣言しないで変数を使うのも大嫌いです(BASICやFORTRANで宣言しなくても変数が使えるのは許せなかったのでしょう)、おそらくは、手続きの単位の前後をbegin-endと掻かないと気が済まなかったのでしょうね。 なお、{}が無いのはPCではなく、ホストやミニコン、オフコンでEBCDICやBCD(6ビットの文字コード)の場合です。FACOMだと(*、*)だったような(記憶が薄れているので)。

noname#17016
質問者

お礼

>要はNicklaus Wirth先生の趣味と言うことになります。 さすがに知らないプログラム言語が出てきましたが、根源は偉大なWirth先生ですか。(w 確かに、Delphiは型に厳格ですね。 時間の計算等をさせると、関数にしたくなるほど一行に収まりません。 PHPではグローバル変数や、宣言無しの変数は使わないようにしていたので、そういう考え自体は嫌いではないのですが、。 でも、せっかく開発の効率がいいのに書くのが面倒だし、なにより見栄えがよくない。 ifの中のifとか、ループ中のifも逆にどこからどこまでかが、文字同士なので埋もれてしまって。 回答が出ても1日は待つようにしているんですが、今回はそれで当たりでした。 さらなる豆知識ありがとうございます。

回答No.1

Delphiの発売元のBorlandは昔、pascal(パスカル)という言語を作っていました。 Delphiはこのpascalを元に作られているので文法などを引き継いでいるのです。

noname#17016
質問者

お礼

たまにDelphiではなく、ObjectPascalという書籍も見かけます。 その名残なんですねー。 回答ありがとうございますねー。

noname#17016
質問者

補足

元がpascalなのも知ってます。 が、なんでbegin - endなんですか? 毎回書くの面倒じゃないですか。{}の方が簡単なのに。 あ、それに昔はもっとメモリーにシビアで、バイト数も極力少ない方がコンパイルとかも楽だったのでは? 開発者の方が、 if(条件){処理} else{処理2} と作成してくれれば、毎回書く事もなかったのに、と思ったのですが。^^ 仕組みが違うのは分かりますが、Perl,PHPでは普通にできているので、コンパイルするプログラムではなにか、、、 Javaでも if(条件){処理} ですよねー。 ふと、そんな事を思ったのですが。

関連するQ&A

  • fortran77のend ifの個数について質問です。

    他人が作ったfortran 77のプログラムを使うことになったのですが、if文の数とend if文の数が合わずに混乱しています。コンパイルも実行も出来るのですが自分の中では納得いきません。具体的に言うと、 =============== if (aa.gt.bb) then  計算 if (cc.gt.dd) then  計算 else  計算 end if  計算 if (ee.gt.ff) then  計算 end if =============== と言った具合です。この場合1つめのif文に対応するend ifがないと思うのですが…なぜコンパイルがうまくいくのか教えてください。

  • End Ifは不要な場合もある?

    Excel2010使用で下記のVBAのコードを書きました。 Sub イフとエンドイフは組ではなかったのか()  Dim Flag As Boolean  Dim S As Worksheet   For Each S In Worksheets    If S.Name = "合計" Then Flag = True '   Else '    Flag = False '   End If   Next S   If Flag = True Then    MsgBox "「合計」というシートはすでに存在します"   Else    Worksheets(1).Copy after:=Worksheets(Worksheets.Count)    ActiveSheet.Name = "合計"   End If End Sub 前半の >' Else >' Flag = False >' End If の部分があると「Elseに対応するIfがありません」というエラーが出ます。 Elseに関する記述だけをコメントアウトすると「End Ifに対応するIfブロックがありません」というエラーが出ます。 この部分をコメントアウトすればきちんと動作するのですが、If文はちゃんと存在しているにもかかわらず、またほとんど同じ記述の後半ではエラーが出ないというのに、なぜこのようなエラーが出るのかわかりません。 なにか勘違いをしているのでしょうか。

  • if文について

    最近、C言語プログラムから、離れていて、久しぶりにここを覗いたのですが、 こんな質問を見ました。 質問 C言語初心者だが、学習用に良いサイトはないか? 最初の回答の方は、ある初心者用と思われるサイトを、紹介してらっしゃいました。 それに対して、他の回答者の方々は、そのサイトの一分を引用して、コンパイルできないし、間違っていると指摘されました。それは以下のようなものでした。 if(条件式) 文1; else 文2; その代わりに掲載されているのが次のようなものでした。 if(条件)条件が真のときに実行する1文; else 条件が偽のときに実行する1文; 私には、最初の回答がなぜ間違っているのか、何故コンパイルできないのか、判りません。何方か詳しく教えていただければ、嬉しいです。よろしくお願いします。

  • IF文

    (A)IF 条件 THEN 単純実行文1 ELSE 単純実行文2 (B)IF 条件 THEN 実行処理1 ELSE 実行処理2 Aの文では単純実行分なのになぜ改行すると(B)の文みたいに実行処理になるのでしょうか? 実行処理と単純実行文の違いを教えてください

  • End If に対応する If ブロックがありませ

    i = MsgBox("終了しますか?", vbOKCancel) If i = vbCancel Then End End If が、 コンパイルエラー End If に対応する If ブロックがありません。 になるのですが、なぜでしょうか? If もEnd If もあるのに・・・

  • If文の条件文の書き方

    お世話になります。 Excelでマクロを作成しております。 内容:  あるセルに、X<=300 というような条件を入れておきます。  ある値、たとえば、500 が来たときに、Xに代入して、  500<=300 という条件式を作り、それが、正しいか、正しくないか  の結果を求めたいと思っています。 このとき、if文の条件文は、値によって、変わらなくてはいけないので、 文字列の置き換え等をして、変数として条件文を作ると、「型が違います」 のエラーになります。 どのように条件文を作ればいいでしょうか?? hani = Cells(1,1).value 'セル1,1に、X<=300 が書かれています。 exp = Replace(hani, "X", 500) '"X"を500と置き換えます。 If exp Then Check = 0 Else Check = 1 End If よろしくお願いします。

  • VBA の if 文の質問です

    下記のようなif文を実行したのですが Or のあとの条件が無視されてしまっているようなのですが、このような書き方ではだめなのでしょうか? else if で地道に分岐させたほうがいいのでしょうか? If Cells(1, 1).Value <> "" Or Cells(1, 2).Value <> "test" Or Cells(1,3) <> 0 Then 処理内容 End If

  • if文からcase文への置き換え

    ピクチャボックスをクリックしたら、チェック ボックスがチェックされるメソッドを作りたいと 思っています。 Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click,PictureBox2.Click 'ここから If sender Is PictureBox1 Then If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If ElseIf sender Is PictureBox2 Then If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End If 'ここまで End Sub 上記のif文をCase文に置き換えたくて、 'ここから Select Case sender Case PictureBox1 If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If Case PictureBox2 If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End Select 'ここまで 上記のように書き換えたのですが、エラーが出てしまいます(ビルドは通るのですが)。 Case文の使い方が間違っているんだとは思いますが、どこがどう 間違っているのがよくわかりません。 ご教授いただけないでしょうか?

  • 長いIF文を短くしたい

    よろしくお願いします いつもgooのみなさんに大変お世話になっております マクロは2カ月ほど前から勉強しています お陰様で、私のマクロも日々進歩できています エクセルのバージョンは2013です 質問内容 長いIF文を短くしたい IF 条件1 and 条件2 and 条件3 and 条件4 and 条件5 Then   処理 End If このようにIF文が長いために、マクロ編集画面が見にくくなっています Select Case を使わずに短くする方法はないでしょうか?

  • 【SQLServer】何も処理しない場合の記述について

    【SQLServer】何も処理しない場合の記述について お世話になってます。 ご存知の方いらっしゃいましたら教えてください。 Oracleでは、IF文の中で何も処理したくない場合、明示的にNULLと書けば、コンパイルできます。 IF XXXXX THEN A = 100 ELSE -- 何もしない NULL END たとえ何も処理しない場合でも、明示的にELSE句を 書きたい場合は、 SQLServerの場合、何をかけばよいのでしょうか? 今のところ下記のように、ELSEの場合は意味の無い処理を記述しています。 IF XXX BEGIN A=100 END ELSE IF BEGIN -- 何も処理しない A = A END A=Aは意味の無い処理なのですが、削除するとコンパイルが通らなくなってしまうのでやむなく記述してます。 どなたかいいアイデアありましたらご教授くださいませ。 よろしくおねがいします。

専門家に質問してみよう