2009年08月03日

return 文に括弧を付ける(た)理由

また pre K&R C の話です。

pre K&R C の時代は、return 文が取る式を () で囲むことが文法上必須でした。その時代の習慣を引きずったためか、K&R (第1版) でも return 文の後の式を括弧で囲っていたようです。(私は第2版しか所有していないので確認できないのですが。)

そのため、今でも括弧を付ける人もいるようです。一方、括弧を付けると return を retuan のようにタイプミスした時に関数呼び出しとして解釈されてしまい、コンパイルエラーにならない(リンク時にはエラーになる)ために良くないと主張する人などもいるようです。いずれにせよここらへんの話は、IDE やエディタがキーワードをハイライトしてくれるようになった現在では、好みの問題の範囲と言えるでしょう。

http://www.math.utah.edu/computing/compilers/c/Ritchie-CReferenceManual.pdf
return ;
return ( expression );

しかし、そもそも私には、この () が pre K&R C で必須だった理由がわかりませんでした。最後に ; が必須なのですから、この括弧があることにより、特にパーシングに対して有利ということもありません。

以下の質問サイトで、実際に UNIX v6 (v7 ?) の時代に、pre K&R C コンパイラ Richie-C でのプログラミング経験があるという方の回答を見て、少し疑問が氷解しました。

http://okwave.jp/qa575548.html

曰く、if/while/swtich のように、他の式を一つ取る構文は全て () が必須なのだから、return もある方が自然と考えたのではないか、とのこと。なるほど、説得力があります。

ただし、pre K&R C の時代は、実は goto もラベルだけではなく、任意の int * 型の式を一つ取れたんですよね。当時は void キーワードが存在せず、命令はワード (int = 2 byte = 16 bit) 単位で並んでいたので、ラベルの型も int へのポインタ型だったのでしょう。

goto expression;


もし goto も () が必須だったならば、少なくともコンパイラ実装者に取っては美しい言語仕様に感じられたのに、と少し惜しく感じます。(私は趣味で pre K&R C コンパイラを書いたりもしているのでなおさらです。)

この時代の C は、他にも文法上や意味上の不備がいくつかあり (例えば - の代入演算子が -= ではなく、=- だったため、- 単項演算子と区別するために x =- 1 のように空白が必須であった、など)、その後の標準化の過程で修正されていきました。(しかし、例えば & と == 演算子の優先順位などは修正されなかったようです。)

歴史を知ると、なぜ C がこのような(時に欠陥とも思える)仕様になっているのかが理解できるようになります。

トラックバックURL

コメントする

名前
URL
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード