C言語関係掲示板

過去ログ

No.1335 貧乏たらしい書き方

[戻る] [ホームページ]
No.18064

省略の書き方はスペースの為ですか
投稿者---先崎(2004/11/13 19:47:17)


古本(平成4年)を買ってきてパラパラめくっていた所
その本の中の危ないプログラミングという章の貧乏たらしい書き方
はやめるという項目がありました。著者いわく

[例1]配列の中でインクリメントなどしない
×c=a[i++]
○c=a[i],i++

理由:入れ子は論理的に追い難い。その上、実行プログラム、サイズ、
実行速度とも改善される保障はどこにもない。かえってデカくて遅く
なる処理系も多い

[例2] { の位置
×if(a>0){
○if(a>0)
{

理由:横にきては波括弧対応が追い難い。行数が増えスクロールが大変
という意見もあるが、行数の増加は数%のレベルに留まり、話にならない。
スクロール云々というのも問題にならない。今のエディタはスクロールは
至って高速なのである。
このダメな書き方が功を奏するのは黒板のみである。

[例3]制御式における代入
×if((fin=fopen(argv[1],"r"))==NULL)
○fin=fopen(argv[1],"r");
if(fin==NULL)

理由:1行に書けても何の得にもならない。丸括弧の入れ子が繁雑なだけ。ただし
while((c=getc(fin))!=EOF)
putc(c,fout);
の場合は別である。この代入を制御式の外でやると、かえって話が複雑怪奇になる。


と書いてあります。普段本や掲示板をみるとみんな貧乏たらしい書き方だと思うのですが、現場で実際書かれている方は例1や例3のような×な書き方はしないのでしょうか。スペースの関係上省略しているのでしょうか。
このままでは知らず知らず貧乏でダメな人間になってしまいそうです。
みなさんの意見お願い致します。m(_ _)m



No.18065

Re:省略の書き方はスペースの為ですか
投稿者---あかま(2004/11/13 20:45:01)


これはまたうそ臭い本ですね。
>と書いてあります。普段本や掲示板をみるとみんな貧乏たらしい書き方だと思うのですが、現場で実際書かれている方は例1や例3のような×な書き方はしないのでしょうか。スペースの関係上省略しているのでしょうか。
>このままでは知らず知らず貧乏でダメな人間になってしまいそうです。
掲示板だからスペース省略のためにこんな書き方をしている…というわけでは絶対無いです。
みんなこんな書き方をしているとあなたが見て思うのなら、おそらくそれがメジャーな書き方なのでしょう。
そうすると本がウソをついている…なんてことになるかもしれません。

なんて、ホントはどちらの書き方でも構わないのでどちらも正解です。
お好きなほうをどうぞ。

プログラミングスタイルは人それぞれですから気にしない。
ある程度慣れてくると勝手に自分の使いやすいスタイルが身につきます。
チームで開発しているときは、ある程度統一するところもあるそうですが、
個人でやる分にはどうでもいいでしょう。


>理由:入れ子は論理的に追い難い。その上、実行プログラム、サイズ、
>実行速度とも改善される保障はどこにもない。かえってデカくて遅く
>なる処理系も多い
こういう書き方は好きじゃないですね。
改善される保障がないなら、改善されない保障もないはずです。
つまりどっちもどっち。
自分の理論を正当化するために、それっぽく書いてるだけです。
メジャーな処理系ならどっちも同じコードを生成するでしょう。まぁ、やってみなきゃわからないけど。

>[例2] { の位置
>×if(a>0){
>○if(a>0)
>{
>このダメな書き方が功を奏するのは黒板のみである。
私が×の書き方を使っているのは見た目が綺麗だと思ったから。
{}の対応付けはインデントでわかるので、別行にする必要がないと思う。
ただ、関数の{}は別行に書いてもいいかなと思っている。書いてないけど。

>理由:1行に書けても何の得にもならない。丸括弧の入れ子が繁雑なだけ。ただし
一行に書くかは使い分け。

>×if((fin=fopen(argv[1],"r"))==NULL)
>while((c=getc(fin))!=EOF)
どっちも一般的に一行で書かれてるのでパッと見で分かるから問題なし。
分かりにくいときは複数行で。


No.18066

Re:私は見やすさを理由に選択してます
投稿者---秘密(2004/11/13 20:47:12)


 その本のタイトルと著者に興味があります。

 例1については状況に応じて(コード全体において重要な処理かどうか)選択しています。

 例2、3は×となってる書式で記述しています。
 理由は「プログラミング言語C」(B.W.カーニハン/D.M.リッチー、石田晴久訳)の書式に従うことにしているためです。
 テキストの書式に従うことが見やすいコードだと考えるからです。

 なお、何をもって「見やすい」かはそれぞれの主観だと思います。
 ですからこの発言は私の主観に基づいていることを念頭に置いて頂ければと思います。


No.18068

Re:省略の書き方はスペースの為ですか
投稿者---ぽこ(2004/11/13 21:21:11)


>古本(平成4年)を買ってきてパラパラめくっていた所

この本のタイトル是非知りたいですね。

例1に関して。
コーディングスタイルと性能(やサイズ)を結びつけること
自体ナンセンスと感じます。

例2に関して。
大抵の方は流れを追うときにインデントで見てると思うので、
どちらでも良いかと。

例3に関して。
複数行に書くメリットがなければ、どちらでも良いのではないかと。

私の意見としては、あるプログラムを書くときにコーディングスタイルに
一貫性を持たせることが重要だと思います。
一つのプログラムに例2の○と×の書き方が混在していると、「うげー」と思いますが、
どちらか一方に統一されていれば何の問題もないです。



No.18069

Re:省略の書き方はスペースの為ですか
投稿者---ぽへぇ(2004/11/13 21:22:23)


>現場で実際書かれている方は例1や例3のような×な書き方はしないのでしょうか。

 現場によって異なる場合が考えられますが、その現場内ではスタイルが統一
されていると思います(はずです)。よって「(その現場にあわせて)
どのスタイルでも読み/書きできるようにしておく」というのが無難な回答かと。

以下、私の感覚では、

>[例1]配列の中でインクリメントなどしない
>○c=a[i],i++
ケースバイケース。不明瞭になったり、副作用がありそうな場合は
分けて書くようにしています。この例に関して言えば「却って
気持ち悪くなった」。


>[例2] { の位置
>○if(a>0)
>{
>理由:横にきては波括弧対応が追い難い。
「波括弧の対応」を重視するのではなく、「制御構造」を重視すべき場面では。
ifと } をインデントで揃えたら問題ない。何が問題なのかよくわからない指摘です。

>[例3]制御式における代入
>if((fin=fopen(argv[1],"r"))==NULL)
>while((c=getc(fin))!=EOF)
必要なら書くし、必要ないなら書きません。
この例なら全然問題なしです。



No.18070

余談
投稿者---shu(2004/11/13 21:46:11)


>古本(平成4年)を買ってきてパラパラめくっていた所

インターネットが今ほど普及していない時代の本。
情報量が今と比べると圧倒的に少なかった時のものなので、
それを鬼の首を取ったようにつっつくのは、大人気無い。

そんな時代から、プログラムの本を書いてた人に拍手。

プログラムっていうのは、創造行為、日々進化しているものです。
int main(void)か、void main(void)かなんていうのも、
それぞれの言い分があって、良い部分があって、イーブンって感じです。
(最近、void main()が増えてきたような…)
大事なのは、どういう理由でそうなのかを理解して、
自分はどれを使いますか?って思います。

○○に書いてあったからってだけで、納得していない先崎さんの疑問は、
それだけで、たいしたもんだと思います。


No.18072

Re:参考になります
投稿者---RAPT(2004/11/13 22:49:42)


んー、配列内のインクリメントはケースバイケース。マクロだったら回避。
でも入れ子との関連ってのがよく分からない。

{ の位置については、関数宣言の場合は2行、if文などでは1行が多いです。
他の方がかかれているように、} の位置とブロック開始位置・インデントが
正しければ問題なし。

fopen()は二行で書くほうが好き。

return 0; と統一している。だってreturnは文であって、関数じゃないから。
でも、著者の「関数を意識したいという意図があるなら…」のくだりについて
は同意しかねる。関連性ないし。

とりあえず、読みやすければよいかと思っています。



No.18075

Re:参考になります
投稿者---ぽへぇ(2004/11/14 00:33:35)


shuさん:
>○○に書いてあったからってだけで、納得していない先崎さんの疑問は、
>それだけで、たいしたもんだと思います。
御意。

同じ著者の本なら(もう伏字は意味がないでしょう)
ANSI C/C++辞典
新ANSI C言語辞典
をお勧めします。

先崎さん:
>危ないプログラミングという項をわざわざ
>設けて書いているのでちょっとひっかかりました。

 プログラミングスタイルに関しては当時Practical C Programming
(現実的なCプログラミング)というのが出て、相当インパクトが
強かった記憶があります。なんせ、K&Rのコードを「汚い」という
ところからはじまりますから。プログラムの保守という点で、
よく考察されていると思います。
 現在は第3版になっており、翻訳で「C実践プログラミング」と
いうのが出ています。これは手元にないのでコメントできませんが
「こういう考え方もある」という例になるかもしれません。

Cの学習として、こちらもお忘れなく。
http://www9.plala.or.jp/sgwr-t/



No.18078

参考になります
投稿者---先崎(2004/11/14 09:45:28)


一晩考えて前に書いたのを削除しました。

この方の書いた本は好きで他にも3冊持ってます。
初心者のくせに調子に乗って余計なことを書きました。

ケースバイケースでその時の環境や状況で書き方を
変えてけばいいんですね。あとは好みと。

みなさま、ありがとうございました。


No.18145

Re:参考になります
投稿者---RAPT(2004/11/15 22:34:53)


でも、ANSI C言語辞典 にはお世話になった。感謝しています。