プログラミング言語C(K&R)邦訳のバージョン違いについて

プログラミング言語C(通称K&R)の邦訳版と言えば、

  • ANSI C対応以前のもの。白い表紙。
  • 第2版。ANSI C規格準拠。薄緑の表紙。
  • 第2版訳改訂版。訳だけ改められた。白い表紙。

 の3種類だと思っていたのですが、第2版訳書改訂版に、私が持っているのとは異なる(古い)バージョンがあるらしい、ということをある方から聞きました。

私が持っている、訳改定前(薄緑表紙)の奥付:

1989年6月15日 初版1刷発行

1992年2月20日 初版101刷発行

 

私が持っている、訳改定版(白表紙)の奥付:

1989年6月15日 第2版1刷発行

1997年5月1日 第2版211刷発行

 

この奥付を見るだけでも、1989年6月15日に出たのは初版なのか第2版なのか不安になりますが……

情報をくださった方が持っているものは、訳書改訂版の「初版156刷 1994年3月10日付」だそうです。時期的には、訳改訂版でありかつ私の持っているもの(211刷)よりは前のもの、とういうことになりますね。

で、気になるのは、拙著「C言語 ポインタ完全制覇」にも引用した(p.以下の箇所の訳です。

原文:

When an array name is passed to a function, the function can at its convenience believe that it has been handles either an an array or a pointer, and manipulate it accordingly.

時系列で並べると、

訳改定前(薄緑表紙) 1992年2月20日 初版101刷:

配列名が関数に渡されるときに、関数ではそれが配列として渡されたのかポインタとして渡されたのかが適当に判断され、それに応じた取り扱いが行われる。

情報をいただいたもの。1994年3月10日 初版156刷 :

配列名が関数に渡されるときに,関数ではそれが配列として渡されたのかポインタとして渡されたのかを適当に判断して,それに応じた取り扱いをしてよい.

訳改訂版(白表紙) 1997年5月1日 第2版211刷 :

配列名が関数に渡されるときに,関数ではそれが配列として渡されたのかポインタとして渡されたのかを都合のよい方に判断して,それに応じて操作が行なわれる.

普通は、増刷の度に誤訳等を直していくのだと思うのですが、ここに関する限り、3番目の「第2版211刷」は、「初版156刷」より、訳改訂版以前の「初版101刷」に先祖返りしているように見えます。

 

ところで、K&Rの訳書改訂版が出る前に松井潔さんにより作られた誤訳の一覧があり、今でもvectorからダウンロードできます。訳書改訂版はかなりこれに沿った修正が行われています。

K&R 2nd. 邦訳書の正誤リストの詳細情報 : Vector ソフトを探す!

 この正誤リストにおいて、上記の箇所は、以下のようになっています(後続の1文を前橋にて削っています)。

訳書 ・・それが配列として渡されたのかポインタとして渡されたのかが適当に判断され、それに応じた取扱いが行われる。

正 ・・それが配列として渡されたのかポインタとして渡されたのかを適当に判断して、それに応じた取扱いをしてよい。

どうも、訳書改訂版作成時に、松井潔さんの正誤リストを元に修正し、それをまた後に戻したように見えます。

訳としては、私は英語が苦手なのでアレなんですが、

『主語は「the function」であり、canの後に、believeとmanipulateが並列で続いている』

と考えると、松井潔さんの訳でよいように見えます(can believeとmanipulateが並列なら、初期訳でよいのかな)。ただ、「それに応じた取り扱いをしてよい.」という言い方だと、日本語ではこの部分の主語が「プログラマ」であるようにも読めます。そして、元々この文章は原文からして意味不明なのですが(ポインタ完全制覇にも「まるで意味不明」と書きましたが)、この部分の主語を「プログラマ」だと解釈すれば、なんだか意味が通じるような気がします。プログラマは、ポインタとして渡された引数sについて、*(s+i)のように書くこともs[i]のように書くこともできるからです。情報をくださった方も、そう解釈できるのでは、と考えたそうです。

しかし原文では主語はやっぱり「the function」なので、だから戻したのかなあ、とも思えます。その場合、やっぱり「まるで意味不明」であると私には思えるのですが。