[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 05/09 17:18 / Filesize : 89 KB / Number-of Response : 310
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

ぱっと見て「ヘタだなぁ」と思うコード その6



1 名前:デフォルトの名無しさん [2007/10/25(木) 03:35:55 ]
禁止ネタ(超既出)
・長い関数
・深いネスト
・グローバル変数
・goto
・memset
・malloc - free
・局所ブロック
・サンプルコードのtypo
・記述スタイル
・関数・変数名

過去スレ
その5: pc11.2ch.net/test/read.cgi/tech/1155315371/
その4: pc8.2ch.net/test/read.cgi/tech/1153312202/
その3: pc8.2ch.net/test/read.cgi/tech/1149986051/
その2: pc8.2ch.net/test/read.cgi/tech/1142741989/
初代 : pc8.2ch.net/test/read.cgi/tech/1141867015/

129 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:15:42 ]
80は、左に置きたいから置いているようにしか思えない。

コンパイルエラーになることを理由にしているようだが、
それは右に置いてもコンパイラの警告が出るので互角(散々既出)。

となると、ほかに理由を提示しない今、残る理由は各人の好み。
そこで80は左を選択したということだろう。



130 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:19:37 ]
>>123
・この警告は出るのが当たり前、気にするな
・この警告は出てもいいけど本当に大丈夫かチェック汁
・この警告出したバカは氏ね
みたいに警告のランク分けとかするよね。


131 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:20:02 ]
単に後に引けなくなってるだけだろ。

132 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:23:50 ]
>>129
> それは右に置いてもコンパイラの警告が出るので互角(散々既出)。

単にこれを知らないだけだと思うよ。

133 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:24:11 ]
私はコードチェッカというものをいままで使ったことがありません
そんなに有効なものですか?

有名なものではどんなものがありますか?

134 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:27:49 ]
OSと言語は?

135 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:30:19 ]
>>133
ttp://www.swtest.jp/tools.html

静的解析ツールでぐぐれ

136 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:32:31 ]
べつに必要としているわけではなくてどのようなものか知りたいので
何でもいいですが、自分の普段の仕事ではWindowsでC++です
Cygwinも常用しているのでUNIX系でも試せると思います

137 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:36:39 ]
どんなものか知りたいなら、Cygwinでcheckをインストールして、Cで怪しげなコードを書いてチェックしてみろ。



138 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:37:42 ]
間違えた。checkじゃなくて、splintだ。

139 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:41:10 ]
WindowsのC++なら、ここから体験版をゲットするんだ。
ttp://www.techmatrix.co.jp/products/quality/download/index.html

140 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:41:52 ]
ぱっと見て「ばかだなぁ」という奴を相手にしなくていいから、
「ヘタだなぁ」と思うコードを貼ってくれ。

141 名前:133 mailto:sage [2007/10/27(土) 00:42:06 ]
>>135
あ、QACとかのことですか
使ったことはないけどプレゼンは受けたことがあります

そのときは、馬鹿に使わせるのは怖いツールだなと思いました

142 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:43:28 ]
C++用のフリーな静的解析ツールは知らないなぁ・・・

143 名前:デフォルトの名無しさん [2007/10/27(土) 00:44:18 ]
ほれ。爆弾投下!

test.cpp
 if (a = 0) printf("x");

D:>bcc32 test.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.cpp:
警告 W8060 test.cpp 7: おそらく不正な代入(関数 main() )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

>>80
わざわざひねくれて if (0 == a) としなくても、ちゃんと警告出してくれるから。
ミスを防ぐため、というのは全然理由にならない。

「定数は左」って書き方って、15年以上も前に「Cマガジン」って雑誌が流行らせたんだよね。
当時の古いコンパイラは上のような警告は出していなかったかもしれない。
でも今は無料のタダのコンパイラでさえ警告出すようになって、「定数左」は意味の無いものになった。
15年も前に決着が付いて廃れたことを、いまだに「神の福音」のように信じ込んでいるヤツがいるんだな。
おまいは隠れキリシタンかw


144 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:47:00 ]
釣られるなよおまいら……。単に自作自演なのかもしれんが。
ところで、見てくれ、このコード。(実物はJavaで、本質的な部分だけ抜粋してるのだが)
おまいら、レビュー以外でこんなコードが涌いて出るのを防ぐ手段、知らないか?

void hoge(int a, int b) {
 bool result = false;
 for (int i = 0; i < 3; i++) {
  if (a == b - i) {
   result = true;
   break;
  }
 }
 if (result == true) {
  cout << "OK\n";
 } else {
  cout << "NG\n";
 }
}


145 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:47:21 ]
長文お疲れだけど、それみんなもう知ってるから・・・

146 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:55:08 ]
>>116
うん、君の会社が凄すぎるから、下民たちの為に会社名を教えてくれ。

> 警告は全部潰してるよ。
コンパイラの設定を変更して、特定の警告は表示させないようにしたのか?


147 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:56:08 ]
「みんな」 に 80 は含まれていないが。



148 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:00:53 ]
>>144
何を問題にしているのか分からないけど。
if (result == true)を気にしているのだとしたら、全員にメールでも出したら?
一番いいのは、タコなコードを書く奴は、片っ端からプロジェクト外に追放することなんだけど。
それをやったら、誰も残らなかったなんてのが笑い話じゃなくなるからな。


149 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:02:49 ]
>>144
b-a が0〜2ならOK,それ以外ならNGを出力ってこと?
不等号演算子とか教えるといいんじゃないかな。

150 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:05:15 ]
どうしようもなく汚いコードのところで仕事をしたとき、警告がでまくったけど、
ま、こんなもんかと思って、放置しておいたら、上のヒトの目にとまって、
警告が出てるじゃないかと注意されてしまった。

で、警告の原因を調べたら、そのコードを動かす環境にインストールされてる、その部署の
ライブラリがバージョン古くて、プロトタイプが、K&R方式になってやんの。

仕方ないので、makefileを書き換えて、警告を全部抑制した。

151 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:05:37 ]
つまり

if (b - a < 3)
OK;

ということでしょ
境界の辺が自信ないが

152 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:19:53 ]
>>151
b<aだとダメじゃね?

153 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:20:11 ]
プロトタイプ宣言はK&Rにはできないんじゃないだろうか

154 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:22:32 ]
それは当然 else 節を省略したのですけど
そういうことではない?
酒が入ってるので不安

155 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:26:07 ]
>>153
ああ、そうだっけ。

int hoge();

みたいに、戻り値だけで、引数のないプロトタイプだった。

156 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:31:26 ]
それは多分C言語的には完全に合法なので警告のほうがうざいと思う

先に宣言が

int f();

とあって後で定義が

int f(int a) { ... }

とANSIならばエラーエラーかな?
うろ覚えでごめん

157 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:33:18 ]
>>80の所属している会社を大胆予想。
仕事は来ていて技術力は無いという辺りから、
・富士通
・日立
・NEC
の関連会社を予想。

しかし、仕事を大量に受けているという記述から想像するに、
・人材派遣会社
に所属しているのではないだろうか。

こう考えると、技術力が無いのにそれに気が付かない理由も説明できると思う。

#JAVAのswingで画面を作っているんだけど、クラス図もイベントトレース図も存在しないって、此の先木大丈夫なんだろうか。




158 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:39:31 ]
> 80 名前: デフォルトの名無しさん [sage] 投稿日: 2007/10/26(金) 22:43:44
から3時間足らずで約70レスか。
このペースで行けば、39時間かからずに埋め立て完了か。
今までの過疎化が嘘のようだなw


159 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:41:01 ]
>>148
レビューしてすら、さくっとスルーされそうなことはわかりますた。
>>149
yes. 問題は、コレと同レベルのコードがと某社のおひさるなサイト上で動いてたってことなんだ。
さらに恐しいことは、a, bは日付を8桁の整数に変換したものだったりしたんだ……。
>>154
条件式が足りてないれす。こんな感じ?
int d = b - a; if (0 <= d && d < 3) ...


160 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:47:51 ]
というか、何をしたいコードなのか教えてくれないと、144のコードが正しいか間違っているかは判断できないぞ。


161 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:50:10 ]
正しいか間違ってるかの問題じゃなく
冗長すぎるのを問題にしていると思う

162 名前:144 mailto:sage [2007/10/27(土) 01:59:48 ]
>>159
あ、「日付を8桁の整数に」ってのは、20071027みたいなやつ(YYYYMMDD)のことね。為念。

163 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:02:36 ]
冗長かどうかも、何がやりたいのかが分からないと、何とも判断できないからね。
問題によっては、冗長に見えるやり方が最適解になったりすることもあるし。


164 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:05:19 ]
でもあれはさすがに型も明示されてるし言い逃れようがないでしょ

165 名前:144 mailto:sage [2007/10/27(土) 02:11:50 ]
>>161
です。冗長過ぎるというより、きっぱりはっきり無駄かつ無意味。
>>160>>163
一般論としてクソコードであると賛同を得られないことに絶望した。
つか、釣りか? 釣りなのか?

166 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:18:21 ]
>>165
このスレになじまない内容なので、あまり興味を持たれなかっただけかと

167 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:18:22 ]
お前が釣ろうとしてるのかと深読みしてしまったよ



168 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:24:40 ]
>>144はこのスレで希に見る良題だと思ったけど
あぁ、希だからか

ちなみに自分は144ではないです

169 名前:149 mailto:sage [2007/10/27(土) 02:29:03 ]
>>165
俺は賛同するぞ。
簡単な処理をあんなに難しく実装する才能はある意味凄いと思う。

170 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:32:58 ]
if (cond) for (;;) {
} else {
}
とか
for (;;)
 if (cond1)
 if (cond2)
{
}
ってありなの?

171 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:34:06 ]
>レビュー以外でこんなコードが涌いて出るのを防ぐ手段、知らないか?
これは質問じゃなくてただの皮肉だったのか

172 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:34:05 ]
つーか、条件式の定数を左に書くのは、代入文の検出とかいってる奴なんなの?
レベル低すぎてどうしようもない。ちげーだろ。

if( NULL == hoge_func(hoge_arg1, hoge_arg2, hoge_arg3, hoge_arg4, hoge_arg5, hoge_arg6, hoge_arg7, hoge_arg8) )
{
}

if( hoge_func(hoge_arg1, hoge_arg2, hoge_arg3, hoge_arg4, hoge_arg5, hoge_arg6, hoge_arg7, hoge_arg8) == NULL )
{
}

前者と後者、どっちが読みやすいかって話だ。
そもそも関数の引数が多すぎる、とか言われても困るぞ。
Win32APIとかだと、引数8個程度のなんてゴロゴロあるからな。
あと、後者だと、環境によっては==NULLがエディタの外に出てしまって、見えないことがあることも付け加えておく。

173 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:39:46 ]
>>172
関数より定数の方が長い場合もあるわけで

174 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:41:33 ]
>>170
文法的には間違っては無さそうだが、ひどく読みづらいな。

175 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:41:49 ]
>>173
その場合は定数を後ろに書けば良いだろ。

176 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:43:44 ]
>>172の言いたいことがケースバイケースであるなら正解
定数左が当然といってるのなら>>173が正解

177 名前:デフォルトの名無しさん [2007/10/27(土) 02:50:31 ]
ったくもう、まだ続ける気かよ。

>>172
こういう発想は無いの?

if( hoge_func(hoge_arg1
 , hoge_arg2
 , hoge_arg3
 , hoge_arg4
 , hoge_arg5
 , hoge_arg6
 , hoge_arg7
 , hoge_arg8) == NULL )
{
}



178 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:51:18 ]
だいたいさ、お前ら良く考えてみろよ。
疲労困憊のときに>>172の後者の文を見て、本当に==NULLを読み飛ばさない自信が有るか?
==NULLはエディタの外に出てしまっていて見えてないかもしれないんだぞ。
必ずスクロールして確かめる自身はあるか?
また、他人が読んだとき、必ずスクロールしてくれる自身はあるか?

そんなリスク背負うぐらいなら、場合によっては定数を先に書いても良いんじゃないか?
コーディングスタイルに拘るあまり、意固地になっちゃってどうするの。

179 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:57:03 ]
つか、Win32APIを使ってる時点で、何と比較するのか判っているのだから、定数が左にある必要は無いと思うが?

CreateWindowを使った後にHWNDを定数と比較する
その定数は何かなんて、誰だって判る問題だ
ファイルポインタを定数と比較する
その定数はなんなのか判らない奴は、Cで真面にプログラム組む事が出来るとは思えない

変な定数と比較するのなら、定数を前に持っていくより、何のためのテストかコメントを残す方が余っ程気が利いている


180 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:59:16 ]
>>177
どこで折り返すかって話になるが、
結局、自分のプログラムが何処で誰に読まれるか判らない以上、
「何列以上になったら折り返す」ということを語るのは難しい。
読み手のエディタのサイズを予測するすべは無い。

それに、どの様な書き方をしても、後に書くものは先に書くものに比べて
目立ちにくいということには変わりない。
条件式の場合は、関数の引数よりも条件そのものの方が大事だから、
大事なものを先に書いちゃおうという視点から、読み手のことを考えれば、
定数は自然と左に出てくる。逆に自分のスタイルを貫けば右に行く。

181 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:02:31 ]
>>179
なんでWin32API限定で話を進めるんだよ。
>>172のどこにもWin32APIに限定しますなんて書いてないだろ。
離散数学の基礎からやり直してください。

182 名前:デフォルトの名無しさん [2007/10/27(土) 03:02:42 ]
いや、昔は80桁越えたら折り返すってルールがあったんだが。

マウスの付いてるパソコンしか使ったことの無い世代が増えたなぁ。
・・・しみじみ。

183 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:04:58 ]
>>182
今の人だけど、常識としてちゃんと知ってるよ。受け継がれてるから安心して。

184 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:09:37 ]
それを強制したら老害だけどね

185 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:10:42 ]
>>181
別にWin32API限定でなくても、定数を比べる場合はif文以前に比べる定数は決まってるだろう
自分で作った関数だろうと、人の作った関数だろうと、定数で比較する時点で、どんな定数と比較するのか決まっているじゃないか


186 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:17:30 ]
そもそもさ、条件式の定数を右に書くか左に書くか、必ずどっちかに統一しろって言ってる人達は何なの?
繰り返し文は、かならずfor文で書くべきで、whileとかdo-whileを使うなとか言うのか?
(俺は繰り返し文は全部forで書くがな)
分岐は必ずifで行うべきで、switchは使うなとか言うのか?
(俺はswtich文嫌いだがな)
gotoだって、使うなといわれてはいるけど、例外処理に使うのならなんら問題ない。

どうして、場合場合によって使い分けようとしないの?

187 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:22:49 ]
>>172
「普通の感性を持っている人」は、そういう場合は次のようなコードを書くから、なんら心配することはありません。

void *p = hoge_func(hoge_arg1, hoge_arg2, hoge_arg3, hoge_arg4, hoge_arg5, hoge_arg6, hoge_arg7, hoge_arg8);
if (p == NULL) {
}

理解できましたか?




188 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:25:32 ]
>>185
全ての関数の仕様が頭に入ってる人なんて居ない。
他人の使っている関数の仕様まで全部事細かに覚えてる人なんて居ない。
比べる定数は決まっているが、それはあくまで仕様上での話。
今、バグを防ぎたいと考えているのだから、全てのプログラマが仕様を完全に網羅しているとは
考えるべきではない。そういう甘い考えがバグを生む。

それから、プログラマの集中力の問題もある。
先に書いたものの方が、高い集中力を持って読んでもらえる可能性が高い。
だから、条件式の条件は成るべく先に持っていったほうが良いだろう。
長い長い関数呼び出し部を読み終わったころには、集中力がなくなっているかもしれないから。

189 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:27:31 ]
>>144
おまえ自身が
> 本質的な部分だけ抜粋してるのだが
と言っているんだよな。

本来のコードだと
for (int i = 0; i < 3; i++) {
}
の中で重要な処理をしているかもしれない。
144は本質じゃないと切り捨てたかもしれないけど、その判断が間違っている可能性は高いわけだ。
だから、何をしようとしたコードなのか分からないと、冗長かどうかの判断は出来ないといっているのだが。
ここまで丁寧に説明してあげれば、144も自分のおろかさを理解してくれるかな?


190 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:28:23 ]
>>187
そう書くのが一番良いんだけど、書かない奴も居るだろ。

191 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:32:51 ]
とは言ったものの、わざわざ
int ret = strcmp(str1, str2);
if(ret == 0){}
なんて書く奴がどれだけ居るのか気になるが。

192 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:35:07 ]
>>191
その程度なら、
if (!strcmp(str1, str2)) {}
と書くのが一番分かりやすいから。


193 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:40:29 ]
>>192
つまり「程度」によるわけだよな。
だから、程度によっては定数を左に持ってきても良いだろ。

それから、
if (!strcmp(str1, str2)) {}
が許されるなら、
if (0==strcmp(str1, str2)) {}
も許されるだろ。
if ( strcmp(str1, str2) ! ) {}
と、後ろに「!」は書かないからな。

後、if (!strcmp(str1, str2)) {} は C langage FAQ では悪い例として取り上げられている。
こうかかれるぐらいなら、if (0==strcmp(str1, str2)) {} とかかれた方がまだマシだと
考える人も多いだろう。

194 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:42:30 ]
>>178
NULLとの比較は読み飛ばしにくくなるかもしれんが
hoge_arg8を読み飛ばす可能性はかなり大きくなるだろ?

引数8つもある関数を直接ifに入れるって事は
文脈上ifよりも関数呼び出し自体が重要って事だろ

それなら、エラー処理系であろうifの条件よりも
hoge_arg8が見えやすいほうが良くないか?

195 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:43:07 ]
あとさ、定数左禁止派はさ、do-whileはどうなのよ。あれは良いのか?
あっちのが色物に思えるが。

196 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:43:16 ]
つか、無闇矢鱈と左に定数を置きたがる奴は、出してくる例題を間違えとる

if ((LOW_AGE < age) && (age <= HI_AGE)) {}
こういう場合は、定数が左にあることに対して意味があるが

if (NULL == pointer) {}
この場合は、定数が左にあることの意味は無い
しいて言うならば、コードを何れだけ見づらくできるか位の意味はあるかもしれない
(我々は、NULLがポインタなのかを知りたいのではなく、ポインタがNULLであるのかを知りたいのだから)

197 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:50:28 ]
>>193
そもそもstrcmpって定数が右を想定した作りだと思う

  if (0<strcmp(str1, str2)) {}

どっちが大きい時ifの中に入るかすぐわかるか?



198 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:50:48 ]
>>193

C FAQより
----------
17.3:
ほら、このわざを見て。

if(!strcmp(s1, s2))

これはよい書き方?
とくによい書き方ということはない。ただし人気のある書き方ではある。このテストは、二つの文字列が同じときに成功する。しかしこの 形は等しくないことをテストしているようにみえる。

より優れた選択肢としては以下のようなマクロを使うことがある。


#define Streq(s1, s2) (strcmp((s1), (s2)) == 0)

コーディングスタイルに関する考え方は、宗教に関する考え方と同じ で、議論に終りがない。よい書き方は価値ある目標であるし、たいて いは見ればよいか悪いかわかるが、文章にすることはできない。質問 17.10も参照のこと。
----------

どこにもif (!strcmp(str1, str2)) {} よりif (0==strcmp(str1, str2)) {} の方がいいとは書いてありませんが?
より良い書き方としてあげている例も、
#define Streq(s1, s2) (strcmp((s1), (s2)) == 0)
と、定数は右側に来ていますよ。


199 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:50:53 ]
>>194
hoge_arg8は見えにくくなるが、引数が途中で切れている場合、プログラマは気づく。
だって構文的に変なところで切れているからね。
だけど、==NULLがあるかないかまでは想像が及ばないかもしれない。

・・・hoge_arg6, hoge_arg7, |エディタの端| hoge_arg8) )

・・・hoge_arg6, hoge_arg7, |エディタの端| hoge_arg8) == NULL)
は、エディタ上では同じに見えるからな。
実は後者だったのに、早とちりして、前者だと思い込んでしまうかもしれない。

200 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:51:32 ]
ケースバイケースなのはわかったから
どこまでが左でどこからが右なんだ

201 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:51:39 ]
ついでに、定数の左置きに対して。

--------------------------------------------------------------------------------
17.4:
どうしてif(x == 0)と書くかわりに、if(0 == x)と書く人がいるのか。
A:

これはよく以下のように書いてしまうことを防ぐためのコツである。
if(x = 0)

定数を==の前に持ってくる習慣を付けておけば誤って、
if(0 = x)
と打ち込むとコンパイラが文句を付ける
どうやら2回=を打ち込むことを覚えるよりは、テストのオペランドの順をひっくり返す ことを覚えることのほうがやさしい。
(訳注:本のほうには、これは特によい書き方というわけではないと書 いてある。実際これでは両辺が変数の場合のif(a = b)という誤りを 捉えることはできない。こんな技を覚える暇があれば、lintの使い方 を覚えること。)


202 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:53:55 ]
>>199
てゆうか、折り返しもできずに、右端がスクロールしないと見えないような腐ったエディタは使うなよ。。。


203 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:54:12 ]
>>196
だけど、NULLと比べてポインタがどうなのか? という考え方をすれば、NULLが先に来る。
逆に、ポインタと比べてNULLがどうなのか? とは言わない。
ポインタが先に来るときは、ポインタがNULLであるか? と言う。
つまり、どっちでもいいということだ。

204 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:55:19 ]
>>200
ケースバイケースで、比較の主体が左にきたり右にきたりするソースが、一番見難い(醜い)です。


205 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:57:02 ]
>>198

>>193のどこにも

>C lang FAQ に if (!strcmp(str1, str2)) {} よりif (0==strcmp(str1, str2)) {} の方がいいと書いてある

なんて書いてないだろ。本当に離散数学の基礎からやり直せ。
何を述べていて、何を述べていないのかの判断ぐらいつくようにしろよ。
じゃないと議論も糞も無い。

206 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:57:10 ]
>>199
ああ、確かに
つまりあなたは「{」の前に改行すべきではない、と俺に言わせ
別の論争を勃発させたいのだなw

207 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:00:11 ]
>>201
C langage FAQ なんてみんな一通り目を通してるんだよ。
一々貼り付けんでも良い。
今時定数を左に持ってくる人達は、>>201のような理由で左に持ってきているわけではない。
左に書いたほうが目立って言いと考えたから、左に持ってきているだけ。
それ以上でもそれ以下でも無い。目立つか目立たないか、ただそれだけ。

>>202
visual studio の初期状態ではそうですよ。



208 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:02:06 ]
>>204
ケースバイケースで、繰り返し文がforになったりwhileになったりdo-whileになったら
読めない人ですか?
ケースバイケースで、分岐がifになったりswitchになったりすると、読めない人ですか?

209 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:04:08 ]
>>206
改行しなくても一緒だよ。
・・・hoge_arg6, hoge_arg7, |エディタの端| hoge_arg8) ){

・・・hoge_arg6, hoge_arg7, |エディタの端| hoge_arg8) == NULL){
は、エディタ上では同じに見えるからな。
俺も通常は改行させないな。

210 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:04:58 ]
おまえら一晩中こんなくだらない論議してたのか?
夜はちゃんと寝なさい。

211 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:06:48 ]
だいたいさ、定数なんて右でも左でもどっちでも良いだろ。
それより、do-whileの方が気持ち悪くないか?
いやマジで。
do{
}while(exp); ← このセミコロンとか。
これは良くて、定数左は駄目とか言ってるやつって、どういう思考なのかわからん。

212 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:09:18 ]
>>209
「,」で終わってたらその後に続くのはいやでも解るでしょ
端を見ようとしないのはそいつの責任だよ

213 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:16:44 ]
>>208
そうだよな
繰り返し文なんていっぱいあるもんなー

#define loop(x) for(int iloop=0;iloop<(x);iloop++)
#define twice loop(2)
#define infinite for(;;)
#define never for(;0;)
#define strpatrol(s) for(char *strpatrolp=(s);*strpatrolp;++strpatrolp)

214 名前:デフォルトの名無しさん [2007/10/27(土) 04:16:58 ]
>>205
だんだん苦しくなってきたね。論理が破綻してきたよ、キミ。今夜が山だ。

>後、if (!strcmp(str1, str2)) {} は C langage FAQ では悪い例として取り上げられている。
>こうかかれるぐらいなら、if (0==strcmp(str1, str2)) {} とかかれた方がまだマシだと
>考える人も多いだろう。


215 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:17:24 ]
俺がなぜ定数が右にしているか考えてみた
a=1;は「aに1を入れる」と読むなら
if(a==1)は「aに1が入っているなら」と読むからであって
=と==を混同させたいんだよ
そもそも混同させたくて同じ記号を使ってるんじゃないかと思えてくるほどだよ

216 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:17:37 ]
>>212
続いていても、==NULLがあるかないかは、スクロールしてみるまで判らない。
引数がそれほど重要でない場合なら、スクロールを惜しむかもしれない。
実際、もうへとへとの状態でプログラムを読んでる場合だってあるわけで。
他人の責任だから関係ない、とは言っても、プロジェクトが停滞すると、
結局自分も巻き込まれるわけで。誰の責任かは正直どうでも良い。

217 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:19:59 ]
>>205
おいおいw

それじゃあ、>>193が全くの主観で何の根拠も無いって事を白状しているだけじゃないかw
で、より良い例として挙げられているコードでは、定数が右側に来ているのは、軽くスルーですか?
FAQを根拠に!strcmp()を否定するなら、よりよい書き方についてもFAQを根拠にしたほうがいいんじゃないかね?




218 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:20:57 ]
>>214

>後、if (!strcmp(str1, str2)) {} は C langage FAQ では悪い例として取り上げられている。
>こうかかれるぐらいなら、if (0==strcmp(str1, str2)) {} とかかれた方がまだマシだと
>考える人も多いだろう。

のどこをどう読んだら、

>C lang FAQ に if (!strcmp(str1, str2)) {} よりif (0==strcmp(str1, str2)) {} の方がいいと書いてある

という意味になるの?
ねぇねぇ教えて。中学生とか? 日本語読める?
「〜の方がまだマシ」という表現を使っているわけだから、よりベターな方法があることも
暗に示しているのだが。

219 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:21:09 ]
NULLとかなら見りゃわかるからいいけど
変数っぽい面して実はconstでしたみたいなのが右や左にいるとうざいから
ある程度統一するのはいいんじゃないの?

220 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:21:41 ]
>>216
だから、単体テストをすればちゃんとエラーは検出できますよ。
テストをやらないって企業文化なら、仕方ないかもしれませんが。


221 名前:デフォルトの名無しさん [2007/10/27(土) 04:21:52 ]
あした早起きして遠足だってのに・・・

こんなくだらない事で眠れなくなっちまった・・・

222 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:23:30 ]
>>203
だから、なんでNULLとポインタを比較するのかが問題なんだろ
ポインタが有効なのか無効なのかを知りたいんであって、NULLと比較してポインタがどうなのかを調べたい人は誰一人居ない

定数が左にあって、唯一読みやすいのは、変数が一定の値の範囲内にある事を知りたい場合のみだろ
それ以外で、定数が左にあっても、読みにくいことはあれ、読みやすく感じることは有り得ない(そのコードを書いた奴だけは、読みやすいのかも知れないが)


223 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:26:28 ]
>>208
例えば、10回処理を繰り返す部分で、
for (i = 0; i < 10; i++) {}

i = 0;
while (i < 10) {
i++;
}
の両方が適当に使われたとしたら、読む人は苦労するだろうな。
forとwhileの使い分けにどんな意味が隠されているのか悩むだろうか。


224 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:26:29 ]
==の話ばかりするからダメなんだ
一時的に条件式を無効にしたくなったらどうする?
誰だってif(0&&condition)って書くよな?
定数0を左に書いた方がいいことは分かり切っている

225 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:27:25 ]
>>217
>>193 の 後半は余談だよ。
if (!strcmp(str1, str2)) {} なんて書いちゃう奴のいうことなんて信用できないね、てこと。
それならまだ定数左派の方が信用できるよねって。
ロジカルに何か述べているわけではなくて、単に人格批判です。

だけど、if (!strcmp(str1, str2)) {} なんてコードをシレっと書いちゃうやつの言うことなんて、
信用できないよね。読みやすいコードを書くためのスタートラインにも立ってない。

226 名前:デフォルトの名無しさん [2007/10/27(土) 04:28:03 ]
>>218
もうヤケクソ?

>>193 「〜の方がまだマシ」

そりゃ確かに、「〜の方がいい」 とは書いてないけど。
「いいとは書いてない、マシと書いた」ってアンタ、小学生の喧嘩レベルやんw
眠いの?

227 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:28:33 ]
>>224
書かないよ。




228 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:29:43 ]
>>220
何いってんの?
だったら初めからコーディングなんて拘らなきゃいいだろ。
どうせ単体テストするので、好きにやればいいじゃないという話になる。


229 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:29:50 ]
つーかさ
もうif(0 == a || a == 0)でよくね?
右にも左にも定数が来てて完璧だろう






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<89KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef