1 :
デフォルトの名無しさん :
2007/10/25(木) 03:35:55
余裕の2GET
3 :
デフォルトの名無しさん :2007/10/25(木) 03:52:31
そして、1乙。
アホが群がって自分の趣味をぶつけ合うだけの糞スレイラネ
6 :
デフォルトの名無しさん :2007/10/25(木) 10:50:46
if(0 == a) はでメリットがない上に明確なメリットがある以上 やらない奴は低能。
・memset ・malloc - free の禁止ネタって何だ?
KENT-WEBのスクリプト全般
if( a == 0 ){} と if( 0 == a ){} では、同じコードになる保証は何処にもない 判りやすく、C++で解説するならば 前者は if ( a.operator==( 0 ) ){} // オブジェクトaの==メソッドの呼び出し であり 後者は、 if ( operator==( 0, a ) ){} // グローバルな==関数の呼び出し となるからである
ヘタな実装前提にして叩くなよw
>>8 > ・memset
char* p = malloc(1024);
memset(p, 0x00, 1024);
とするのは是か非かという話題。
・必要ないのになんでヌルクリアするの?派
・したってそれほど実害ないじゃん派
の二派に分かれる。
[私見] 前者が妥当
> ・malloc - free
main()が終了する前に、free()は必要なのかという話題。
・自分でmalloc()したんだから、free()するのは当然派
・OSが回収する資源だからしなくても良い。free()が難しいデータ構造だってあるじゃん派
過去に何度かfj.lang.cでも長大なスレッドになったことも有名。
[私見] 後者が妥当
>>13 > 過去に何度かfj.lang.cでも長大なスレッドになったことも有名。
ありがとううう!! そういう具体的な情報は嬉しいね。
俺の私見:
char *pの事前のmemsetは不要なのでしない。
(ただしcalloc(1, sizeof(hoge));は多用する)
main終了前のfreeは不要なのでしない。
↑禁止ネタにこういうレスしたらダメでしょうか?わかりません><
決め付けたら、余計荒れるだろ
暗黙の宣言は利用しないと言う原則から行けば memsetはした方がいいし、できる限りfreeする方がいいだろう しかし、定数は右に置くべきだろう
何かやっておきたいのならchar *p;*p = '\0';で充分では。
char *p = malloc(size);*p = '\0';な。突っ込まれるまえに。
>>18 その書き方なんか気持ち悪いんだけど...
char *p = malloc(size);
strcpy(p, "");
の方が好き
スルー力が試される昨今、みなさんいかがお過ごしですか
スルーするくらいなら居ないほうがマシだぞ
>>22 【審議中】
∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U ( ´・) (・` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u'
【結果発表】
パッ パッ パッ パッ パッ パッ
[チラ] [シの] [裏に] [書き] [やが] [れ!]
‖∧,,∧ ‖∧,,∧ ‖∧,,∧ ‖∧,,∧ ‖∧,,∧ ‖∧,,∧
∩・ω・`) ∩・ω・`) ∩・ω・`) ∩・ω・`) ∩・ω・`) ∩・ω・`)
( ). ( ). ( ) ( ) ( ) ( )
`u-u´ `u-u´ `u-u´ `u-u´ `u-u´ `u-u
悪くないスレの出だしだ。
Win32APIの糞でかい構造体の全てのフィールドにいちいち0だの'\0'だのを突っ込んでる奴はマゾ
ダメだ、我慢ができないw
>>19 無駄な関数呼び出しをして、処理速度を遅くしたい人ですね?
コンパイラの最適化で*p='\0';と同じコードを吐いてくれるようになるのかな??
>>13 > 過去に何度かfj.lang.cでも長大なスレッドになったことも有名。
fj.lang.cの時は、プロセス終了時にmallocで確保したメモリを開放しない(できない)OSもあるから、main()終了直前でもfreeしたほうがいい、って結論だった記憶が。
今でもwindowsだと信用ができない。
そんなOSあっていいの?w 特殊な環境?
>>27 いや、*p='\0';だと、馬鹿な奴が、*p="Init Strings";とかやってくれそうで...
char month[] = "Jan\0Feb\0Mar\0…Dec\0"; Decの後の\についてはスルーするとして、こういうのってどうよ
>>32 埋め込むなら、
char *month[] = {"Jan", "Feb", ・・・, "Dec"};
でいいじゃねえかと言いたくなります。
>>29 仮想記憶の無いOSもある
ex.DOS
ex.ITRON
アプリケーションが死ぬ時にOSも道連れなら別にかまわんが、違うだろう?
つーか最近の若いもんはそんなことも知らないんだな。
>>34 そういうばか者は、要らない工夫をするから怖いよ〜♪
しなくていい工夫はするのに、しなきゃいけない工夫をしないんだ...orz
>>37 コーディング規約でいくら縛っても縛っても、とんでもないコード書いてくるよな。
逆に言えば、コーディング規約でどうにかなる程度の問題なんて、初めからどうでも良い。
つまり、コーディングスタイルなんて、どうだっていいって事だな。
縛ろうと思えば、いつでも縛れるんだから。
>>38 >縛ろうと思えば、いつでも縛れるんだから。
いつでも縛れるからといっても、単体試験も終わろうかという時にコーディング規約を
変更するのは無しだろ、、、
だから、いくら人手不足とはいえ、使えないカスはプロジェクトから追い出したほうがいいんだよね。
>>39 そりゃ途中で変更は出来んだろうな。
だけど、コーディングスタイルは縛ろうと思えば縛れるんだから、全然いいんだよ。
むしろ問題は、どうやっても縛ることのできない、糞コードの方。
網の目をかいくぐるように余計なことをする。
strcpyで初期化すれば、NULL以外で初期化しなければならなくなったときに、最小限の変更で済むし
自分以外がその変更をする場合でも恐らく大丈夫だろうと思われる
*p = '\0';では、
>>31 みたいな変更をされた挙げ句、
>>37 な奴で、結果mallocした領域を駄目になって謎のエラーに悩むはめに...
猫の手を借りるためには、猫に理解できるコードを書かなければならない...orz
猫用マクロセットが必要だな
>>42 NULLと'\0'(NUL)は違うっていうのはわかってるよね?
いちよう。
コーディングスタイルにこだわらない奴は、下手
>>44 たぶん、判ってるよぅ(^-^;
NULLは、ナルっとしてて
NULは、ヌルっとしてるんだよね!
*p = '\0';にしてんじゃん...
判ってなきゃ、*p = NULL;にするし...
ひとりだけ、超絶低レベルな奴が紛れ込んでる
ストリコンペ!
今来た。 もう終わったけど、if (定数 == 変数)の話がC FAQに載ってることに誰も言及しなかったのが不思議。 三田テンゲンは、C FAQから持ってきたか、comp.lang.cをwatchしてたかのどっちかじゃないかな。
こんなところで必死に10年前のネタ戦わせてる奴はもっと充実した趣味を探せといいたいね。 何もないならWiiFitでも買ってたるんだ腹でも引っ込めたらどうだw
if (定数 == 変数)はいろんな本に載ってるぞ
その本は買うべきじゃないという、良い指針になる
Wiiはありえない
良い本かどうかを見分けるのは実に簡単。 ASSERTの説明が入っているかどうか。
ASSERTの説明がなくても良い本はあるだろ、常考
代入防止に使うと言うのは、変数同士だと意味がなくなるので、==で比較する癖をつけることが望ましい 変数を何と比較しているのか判りやすくするってのは、当該関数の中で、その定数が比較対照になることは決まりきっているので、態々定数を先に持ってくる意味はない 当該関数で、比較に用いられる定数がなんなのか判りにくいのであれば、それは、関数が適切に作られてはいないことを意味するのでは無いだろうか? また、どうしても定数を最初に出さなければ何を調べてるのか判らないような場合は、if文ではなく、switch文を使用する方が適切なのではないだろうか?
え、まだやる気?
まあ大盛況だからなww
>>57 だからクビになるんだよ
はやく次の仕事見つけろよ
> 代入防止に使うと言うのは、変数同士だと意味がなくなるので、==で比較する癖をつけることが望ましい これの意味がさっぱり分からない…。何の話をしようとしているのかさえ分からない。
代入防止ってのは if(a=1) とかの事だろ ほんとは if(a==1) と判定したかった でも if(1=a) こうすればコンパイル時に忘れてても分かる ところが変数同士の比較 if(b=a) はどうしようも無い というお話
64 :
デフォルトの名無しさん :2007/10/26(金) 18:08:23
(定数左にする癖をつけるよりは)==で比較する癖をつけることが望ましい ってこと? し、しかし比較は癖も何も==なわけで。 > ところが変数同士の比較 if(b=a) はどうしようも無い そんなのは既出どころかスタート地点であって、その上で、 「せめて定数の場合の代入だけは検出できるようにしよう」 ってのが定数左派の主張では? いつも役に立つ、ではなくて、役に立つ場合があるから左に書く、と。
というより、 > ところが変数同士の比較 if(b=a) はどうしようも無い これは、そもそも左も右もねぇ!
てかこのレヴェルのバグを防ぐのに四苦八苦してる奴って何やってる人?
左へ受け流す〜
左定数は、==を=と記述ミスした場合に検出できる利点あり。 右定数が左定数より優れている点って何?
operator のオーバライドが中途半端なときに死ねる
google code search でググってみると.。 "== NULL" lang:c 約1,240,000件 "NULL == " lang:c 約56,800件 特に利点もないのに、圧倒的少数派のスタイルを選んでる時点でヘタクソ臭が。
>>50 C FAQに載っているけど、それは定数左置きにダメ出ししているってことを理解できてるか?
>>72 デブ専、ブス専、フケ専、ハゲ専なんかと同じ人種なんだろう。
自分の感覚が世間とずれていることを認めたがらない。
雀の涙ほどのどうでもいいメモリを節約するために テンポラリ用の奇怪な共用体を使い回したりダミーデータの隙間を拝借したりするような奴にはどう言ってやればいいと思いますか メモリ節約すること自体は大切だし
そんなしょぼい省メモリ化と可読性、開発効率とのトレードオフは成立しないといってやれ。
配列とかで大量にデータを取ったりしてるわけじゃなくて、タダの作業用のローカル変数とか 引数をshortにしてるコードとかもあるな。 よっぽど気をつけてコードを書かないと、すぐintへ変換するコードがはいるから、それで、節約した 2バイトなんて簡単にとぶ。 アライメントの問題もあるな。
いつも他人のコードを見ては『このコードだと遅い』とか文句つけるジジイと一緒だな そのくせプロファイラの使い方すら判らないとか
入力がshortの範囲なら引数の型をshortにするのは普通じゃね? 数バイトでも節約したいとか実行速度がシビアだったりしなければ。
>>72 "== NULL"
"NULL =="
こんなの多数決で考える頭はもうちょっと働かせたほうがよい
if(変数 = NULL)
が引き起こすバグをどうやって見つけるのか考えた事がある?ない?
難しい正規表現でも作る?`NULL'以外の場合もあるよ。
それより定数を左辺にもってくる方法を身につければいいだけじゃない?
自分がグループリーダーになったとき、部下のミスを見つけられるレベルになれる?
これはただの忠告。
>>72 はそれでいいならいい。私に累が及ばなければどんなコーディングでも結構。
プログラミングの先生だって×は出さないだろうしなw
>>80 ええ? そのバグを防ぐ方法を知らないの?
こういう話のときには必ずでるのに。。。
基礎の基礎だよ。
>>80 そんなもんコードチェッカーにかければすぐ見つかるだろ。
まさかコードチェッカー使ってないのか?
Pythonを使えばよい
>>82 フツーに警告出ないようにコードを書いてるだけで防げるな。
警告出さないようなコンパイラはコードチェッカを使うか、捨てるべきか、悩むこところ。
>>80 > こんなの多数決で考える頭はもうちょっと働かせたほうがよい
コーディングスタイルなんて、よっぽどのセンスと見識があるやつ以外は、自分で考えたりしないで、
一般的なものに従うほうがいいよ。
(どうしてそういうスタイルになっているか、それ以外ではいけないか、考察したりするのは勉強になるけど)
てか、=と==を間違うや奴って、そんなに多いのか?
> これはただの忠告。
>>80 はそれでいいならいい。私に累が及ばなければどんなコーディングでも結構。
> プログラミングの先生だって×は出さないだろうしなw
しかし、これは真実w
>>79 実行速度なら、shortよりintの方が有利のはず。
>>80 警告を無視する習慣があることはよく分かった
その悪習を直すほうがよっぽどいいよ
88 :
79 :2007/10/26(金) 23:06:04
>>86 >実行速度なら、shortよりintの方が有利のはず。
だからそう書いてるだろ。よく嫁。
89 :
80 :2007/10/26(金) 23:26:14
ごもっとも。ちなみに、コードチェッカー自体忘れてたよw ちなみに、ウチ(60人ぐらいかな?)にはコードチェッカーを使う人は滅多にいない。 先人の知恵を借りれば、文字間違いのエラーぐらいしか出てこないし、そんなのはコンパイルエラーで出てくるから。 コードチェッカーに頼る前にコーディングスタイルに気を配る方がよっぽどよいよ。 その方が、コードレビューやバージョン管理に割く時間が増えるからね。 もっとも、バージョン管理はCVSで一瞬で済んでしまうが
90 :
80 :2007/10/26(金) 23:28:40
>>87 は?警告は全部潰してますが。
どこを縦読みした?wwwww
> 数バイトでも節約したいとか実行速度がシビアだったりしなければ。 ん? 「数バイトでも節約したい」とか「実装速度がシビアだったりしなければ」{shortを使う}って読ませたいのか? (「数バイトでも節約したい」とか「実装速度がシビアだったり」)「しなければ」{int}って読めるぞ。 人のことを言う前に、ちゃんとした分かりやすい日本語を書け。 設計書や資料を作るときの基本だろ?
gcc (GCC) 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)で #include <stdio.h> int main(int argc, char *argv[]){ int a = 2; if(a = 1) printf("%s\n", argv[0]); return 0; } というプログラムを-Wall付きでコンパイルしてみたら、 test.c:6: 警告: 真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします という警告が出た。まあこれで何か起こってることはわかるだろう。
93 :
デフォルトの名無しさん :2007/10/26(金) 23:30:23
80はどこの社員だ? そこだけには仕事は頼まないようにするから、教えてくれ。
制御文の代入で警告でないってどこのコンパイラ使ってるの?
>>89 アホなコンパイラ使ってるなら、せめてlintとか使えよ。
こわー。
「プログラミングの先生」とか言っちゃってる時点で、学生確定
97 :
79 :2007/10/26(金) 23:38:15
>>91 ・普通はshortを使う。
・数バイトでも節約したい場合は
>>77 のようにintを使った方がよい場合もある。
・実行速度がシビアならintを使った方がよい。
という意味のつもりで書いたが分かりにくかったか。
>>80 > が引き起こすバグをどうやって見つけるのか考えた事がある?ない?
最悪、ホワイトボックスの分岐網羅カバレッジ100%のテスト段階で見つかるわけだが。
それより早く見つかったほうがコストが安いから、どうしようという話。
で、ちゃんとしたコンパイラかlint使えって結論。
99 :
80 :2007/10/26(金) 23:41:10
>>92 何のデモか知らないけど、わざわざ-Wallで例示するなんてヒマなんだね。
>>93 いや、もう遅いかもしれんよwww
>>94 警告は全部潰してるよ。
そもそも、コーディングスタイルで蹴ってるからそんな警告があること自体知らなかった。
君ら無駄な努力払ってるね。
>>96 妄想強すぎ
>>89 コードチェッカの類を使ったことないだろ。
101 :
デフォルトの名無しさん :2007/10/26(金) 23:41:48
∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | J
/ ∩ノ ⊃ ヽ
>>80 ( \ / _ノ | |
.\ “ /__| |
\ /___ /
>>97 ループ変数に、いつもshort iとか書いてるのか?
いやすぎる。
>>99 > そもそも、コーディングスタイルで蹴ってるからそんな警告があること自体知らなかった。
どんだけ情報弱者なんだよ・・・
104 :
デフォルトの名無しさん :2007/10/26(金) 23:45:03
105 :
79 :2007/10/26(金) 23:46:50
>>99 おまえの、定数を左にもってくるってのも、コーディングスタイルじゃなくて、コンパイラに頼って
バグを見つけるって発想だろ。
>>80 警告出るから、そんなことしなくていいってがコンセンサスになってるから
>>72 みたいな結果になるわけよ。
if (定数 == 変数)と書くコーディングルールがある会社、ということで、技術力が低い会社だと レッテルを貼られるリスクを考えたことがないようだ。
このスレにぴったりのネタ会社だ
109 :
80 :2007/10/26(金) 23:54:01
>>100 コードチェッカーの類?最近は全くないね。
VC++6、VS2005、gcc3.4.4などまあ常識の範囲内のコンパイラ
最近はやむを得ずSDCC使ってるけど、エンバグすら直ぐ分かっちゃうのでlint通す意味ナシ。
>>80 if (0 = a)はコンパイラに任せるのに、その他の複雑なバグが簡単に見つかるコードチェッカーは使わないと?
わけわからん
>>109 コードチェッカの意義とか理解してないっぽいな。。。
言い訳するにしてももうちょっと熟考すればいいのに
>>80 なんか必死だけど、どれだけ言葉を重ねても、レベルが低いことを証明することになるだけだぞ。
>>107 ほう、そんなリスクがあっても引く手あまたのウチの会社って凄すぎるってこと?wwww
>>106 どういたしまして。負け犬の遠吠えと受け取っておきますm(_ _)m
>>112 コードチェッカが無意味なくらい完璧にコードを書けるなら、定数を左にもってくるとか、
姑息なテクニックを使わなくてもいいよな。
コードレビュー文化があって、コードチェッカーが使える環境なら、最初は使ってて 使わなくなるなんて考えられない。 ライセンスの関係で全員がコードチェッカーを使えないとしても、レビュアーがコードチェッカーを 使うことで、レビューの工数をかなり減らせる。なので、以前使ってて、使わなくなるなんてやはり考えられない。 つまり、部下のミスを見つけてなんかいないってこった。 あ、部下がいないという線もあるな。
タコなコードチェッカーだったからうざくて使うのやめたってならわからなくもない
コードレビューなんてしてないんだろ
右定数を見つけると最高レベルの警告を出す80謹製コードチェッカだったら使わなくなるかもしれない
コンパイラがどういうときに警告出すかとか知らないってのもどうかなぁ。 コーディングルールを守ってるから、警告でなくて知らないって話だけど、 そういうのは教条的に守るんじゃなくて、どうしてそうなってるかとか考えたほうがいいよ。
>>121 自分がレベル低いなんて夢にも思ってなかったから、現実を突きつけられて自我の危機に陥ってる。
定数が左ってのは、警告を出してくれるコンパイラやまともなコードチェッカーが無かった時代の名残だよな。 今ではまるで意味が無い。
if (定数 == 変数)なんて、いわゆる「バカよけのテクニック」だからね。 それを使っているからといって、声高に自慢するようなことではない。
前スレだかで馬鹿にしすぎたからムキになっちゃったんだろ。 お前ら自重しろ。
袋叩きwww
80は、左に置きたいから置いているようにしか思えない。 コンパイルエラーになることを理由にしているようだが、 それは右に置いてもコンパイラの警告が出るので互角(散々既出)。 となると、ほかに理由を提示しない今、残る理由は各人の好み。 そこで80は左を選択したということだろう。
>>123 ・この警告は出るのが当たり前、気にするな
・この警告は出てもいいけど本当に大丈夫かチェック汁
・この警告出したバカは氏ね
みたいに警告のランク分けとかするよね。
単に後に引けなくなってるだけだろ。
>>129 > それは右に置いてもコンパイラの警告が出るので互角(散々既出)。
単にこれを知らないだけだと思うよ。
私はコードチェッカというものをいままで使ったことがありません そんなに有効なものですか? 有名なものではどんなものがありますか?
OSと言語は?
べつに必要としているわけではなくてどのようなものか知りたいので 何でもいいですが、自分の普段の仕事ではWindowsでC++です Cygwinも常用しているのでUNIX系でも試せると思います
どんなものか知りたいなら、Cygwinでcheckをインストールして、Cで怪しげなコードを書いてチェックしてみろ。
間違えた。checkじゃなくて、splintだ。
ぱっと見て「ばかだなぁ」という奴を相手にしなくていいから、 「ヘタだなぁ」と思うコードを貼ってくれ。
141 :
133 :2007/10/27(土) 00:42:06
>>135 あ、QACとかのことですか
使ったことはないけどプレゼンは受けたことがあります
そのときは、馬鹿に使わせるのは怖いツールだなと思いました
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
釣られるなよおまいら……。単に自作自演なのかもしれんが。 ところで、見てくれ、このコード。(実物は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"; } }
長文お疲れだけど、それみんなもう知ってるから・・・
>>116 うん、君の会社が凄すぎるから、下民たちの為に会社名を教えてくれ。
> 警告は全部潰してるよ。
コンパイラの設定を変更して、特定の警告は表示させないようにしたのか?
「みんな」 に 80 は含まれていないが。
>>144 何を問題にしているのか分からないけど。
if (result == true)を気にしているのだとしたら、全員にメールでも出したら?
一番いいのは、タコなコードを書く奴は、片っ端からプロジェクト外に追放することなんだけど。
それをやったら、誰も残らなかったなんてのが笑い話じゃなくなるからな。
>>144 b-a が0〜2ならOK,それ以外ならNGを出力ってこと?
不等号演算子とか教えるといいんじゃないかな。
どうしようもなく汚いコードのところで仕事をしたとき、警告がでまくったけど、 ま、こんなもんかと思って、放置しておいたら、上のヒトの目にとまって、 警告が出てるじゃないかと注意されてしまった。 で、警告の原因を調べたら、そのコードを動かす環境にインストールされてる、その部署の ライブラリがバージョン古くて、プロトタイプが、K&R方式になってやんの。 仕方ないので、makefileを書き換えて、警告を全部抑制した。
つまり if (b - a < 3) OK; ということでしょ 境界の辺が自信ないが
プロトタイプ宣言はK&Rにはできないんじゃないだろうか
それは当然 else 節を省略したのですけど そういうことではない? 酒が入ってるので不安
>>153 ああ、そうだっけ。
int hoge();
みたいに、戻り値だけで、引数のないプロトタイプだった。
それは多分C言語的には完全に合法なので警告のほうがうざいと思う 先に宣言が int f(); とあって後で定義が int f(int a) { ... } とANSIならばエラーエラーかな? うろ覚えでごめん
>>80 の所属している会社を大胆予想。
仕事は来ていて技術力は無いという辺りから、
・富士通
・日立
・NEC
の関連会社を予想。
しかし、仕事を大量に受けているという記述から想像するに、
・人材派遣会社
に所属しているのではないだろうか。
こう考えると、技術力が無いのにそれに気が付かない理由も説明できると思う。
#JAVAのswingで画面を作っているんだけど、クラス図もイベントトレース図も存在しないって、此の先木大丈夫なんだろうか。
> 80 名前: デフォルトの名無しさん [sage] 投稿日: 2007/10/26(金) 22:43:44 から3時間足らずで約70レスか。 このペースで行けば、39時間かからずに埋め立て完了か。 今までの過疎化が嘘のようだなw
>>148 レビューしてすら、さくっとスルーされそうなことはわかりますた。
>>149 yes. 問題は、コレと同レベルのコードがと某社のおひさるなサイト上で動いてたってことなんだ。
さらに恐しいことは、a, bは日付を8桁の整数に変換したものだったりしたんだ……。
>>154 条件式が足りてないれす。こんな感じ?
int d = b - a; if (0 <= d && d < 3) ...
というか、何をしたいコードなのか教えてくれないと、144のコードが正しいか間違っているかは判断できないぞ。
正しいか間違ってるかの問題じゃなく 冗長すぎるのを問題にしていると思う
162 :
144 :2007/10/27(土) 01:59:48
>>159 あ、「日付を8桁の整数に」ってのは、20071027みたいなやつ(YYYYMMDD)のことね。為念。
冗長かどうかも、何がやりたいのかが分からないと、何とも判断できないからね。 問題によっては、冗長に見えるやり方が最適解になったりすることもあるし。
でもあれはさすがに型も明示されてるし言い逃れようがないでしょ
165 :
144 :2007/10/27(土) 02:11:50
>>161 です。冗長過ぎるというより、きっぱりはっきり無駄かつ無意味。
>>160 >>163 一般論としてクソコードであると賛同を得られないことに絶望した。
つか、釣りか? 釣りなのか?
>>165 このスレになじまない内容なので、あまり興味を持たれなかっただけかと
お前が釣ろうとしてるのかと深読みしてしまったよ
>>144 はこのスレで希に見る良題だと思ったけど
あぁ、希だからか
ちなみに自分は144ではないです
169 :
149 :2007/10/27(土) 02:29:03
>>165 俺は賛同するぞ。
簡単な処理をあんなに難しく実装する才能はある意味凄いと思う。
if (cond) for (;;) { } else { } とか for (;;) if (cond1) if (cond2) { } ってありなの?
>レビュー以外でこんなコードが涌いて出るのを防ぐ手段、知らないか? これは質問じゃなくてただの皮肉だったのか
つーか、条件式の定数を左に書くのは、代入文の検出とかいってる奴なんなの? レベル低すぎてどうしようもない。ちげーだろ。 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がエディタの外に出てしまって、見えないことがあることも付け加えておく。
>>172 関数より定数の方が長い場合もあるわけで
>>170 文法的には間違っては無さそうだが、ひどく読みづらいな。
>>173 その場合は定数を後ろに書けば良いだろ。
>>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 )
{
}
だいたいさ、お前ら良く考えてみろよ。
疲労困憊のときに
>>172 の後者の文を見て、本当に==NULLを読み飛ばさない自信が有るか?
==NULLはエディタの外に出てしまっていて見えてないかもしれないんだぞ。
必ずスクロールして確かめる自身はあるか?
また、他人が読んだとき、必ずスクロールしてくれる自身はあるか?
そんなリスク背負うぐらいなら、場合によっては定数を先に書いても良いんじゃないか?
コーディングスタイルに拘るあまり、意固地になっちゃってどうするの。
つか、Win32APIを使ってる時点で、何と比較するのか判っているのだから、定数が左にある必要は無いと思うが? CreateWindowを使った後にHWNDを定数と比較する その定数は何かなんて、誰だって判る問題だ ファイルポインタを定数と比較する その定数はなんなのか判らない奴は、Cで真面にプログラム組む事が出来るとは思えない 変な定数と比較するのなら、定数を前に持っていくより、何のためのテストかコメントを残す方が余っ程気が利いている
>>177 どこで折り返すかって話になるが、
結局、自分のプログラムが何処で誰に読まれるか判らない以上、
「何列以上になったら折り返す」ということを語るのは難しい。
読み手のエディタのサイズを予測するすべは無い。
それに、どの様な書き方をしても、後に書くものは先に書くものに比べて
目立ちにくいということには変わりない。
条件式の場合は、関数の引数よりも条件そのものの方が大事だから、
大事なものを先に書いちゃおうという視点から、読み手のことを考えれば、
定数は自然と左に出てくる。逆に自分のスタイルを貫けば右に行く。
>>179 なんでWin32API限定で話を進めるんだよ。
>>172 のどこにもWin32APIに限定しますなんて書いてないだろ。
離散数学の基礎からやり直してください。
182 :
デフォルトの名無しさん :2007/10/27(土) 03:02:42
いや、昔は80桁越えたら折り返すってルールがあったんだが。 マウスの付いてるパソコンしか使ったことの無い世代が増えたなぁ。 ・・・しみじみ。
>>182 今の人だけど、常識としてちゃんと知ってるよ。受け継がれてるから安心して。
それを強制したら老害だけどね
>>181 別にWin32API限定でなくても、定数を比べる場合はif文以前に比べる定数は決まってるだろう
自分で作った関数だろうと、人の作った関数だろうと、定数で比較する時点で、どんな定数と比較するのか決まっているじゃないか
そもそもさ、条件式の定数を右に書くか左に書くか、必ずどっちかに統一しろって言ってる人達は何なの? 繰り返し文は、かならずfor文で書くべきで、whileとかdo-whileを使うなとか言うのか? (俺は繰り返し文は全部forで書くがな) 分岐は必ずifで行うべきで、switchは使うなとか言うのか? (俺はswtich文嫌いだがな) gotoだって、使うなといわれてはいるけど、例外処理に使うのならなんら問題ない。 どうして、場合場合によって使い分けようとしないの?
>>172 「普通の感性を持っている人」は、そういう場合は次のようなコードを書くから、なんら心配することはありません。
void *p = hoge_func(hoge_arg1, hoge_arg2, hoge_arg3, hoge_arg4, hoge_arg5, hoge_arg6, hoge_arg7, hoge_arg8);
if (p == NULL) {
}
理解できましたか?
>>185 全ての関数の仕様が頭に入ってる人なんて居ない。
他人の使っている関数の仕様まで全部事細かに覚えてる人なんて居ない。
比べる定数は決まっているが、それはあくまで仕様上での話。
今、バグを防ぎたいと考えているのだから、全てのプログラマが仕様を完全に網羅しているとは
考えるべきではない。そういう甘い考えがバグを生む。
それから、プログラマの集中力の問題もある。
先に書いたものの方が、高い集中力を持って読んでもらえる可能性が高い。
だから、条件式の条件は成るべく先に持っていったほうが良いだろう。
長い長い関数呼び出し部を読み終わったころには、集中力がなくなっているかもしれないから。
>>144 おまえ自身が
> 本質的な部分だけ抜粋してるのだが
と言っているんだよな。
本来のコードだと
for (int i = 0; i < 3; i++) {
}
の中で重要な処理をしているかもしれない。
144は本質じゃないと切り捨てたかもしれないけど、その判断が間違っている可能性は高いわけだ。
だから、何をしようとしたコードなのか分からないと、冗長かどうかの判断は出来ないといっているのだが。
ここまで丁寧に説明してあげれば、144も自分のおろかさを理解してくれるかな?
>>187 そう書くのが一番良いんだけど、書かない奴も居るだろ。
とは言ったものの、わざわざ int ret = strcmp(str1, str2); if(ret == 0){} なんて書く奴がどれだけ居るのか気になるが。
>>191 その程度なら、
if (!strcmp(str1, str2)) {}
と書くのが一番分かりやすいから。
>>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)) {} とかかれた方がまだマシだと
考える人も多いだろう。
>>178 NULLとの比較は読み飛ばしにくくなるかもしれんが
hoge_arg8を読み飛ばす可能性はかなり大きくなるだろ?
引数8つもある関数を直接ifに入れるって事は
文脈上ifよりも関数呼び出し自体が重要って事だろ
それなら、エラー処理系であろうifの条件よりも
hoge_arg8が見えやすいほうが良くないか?
あとさ、定数左禁止派はさ、do-whileはどうなのよ。あれは良いのか? あっちのが色物に思えるが。
つか、無闇矢鱈と左に定数を置きたがる奴は、出してくる例題を間違えとる if ((LOW_AGE < age) && (age <= HI_AGE)) {} こういう場合は、定数が左にあることに対して意味があるが if (NULL == pointer) {} この場合は、定数が左にあることの意味は無い しいて言うならば、コードを何れだけ見づらくできるか位の意味はあるかもしれない (我々は、NULLがポインタなのかを知りたいのではなく、ポインタがNULLであるのかを知りたいのだから)
>>193 そもそもstrcmpって定数が右を想定した作りだと思う
if (0<strcmp(str1, str2)) {}
どっちが大きい時ifの中に入るかすぐわかるか?
>>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)
と、定数は右側に来ていますよ。
>>194 hoge_arg8は見えにくくなるが、引数が途中で切れている場合、プログラマは気づく。
だって構文的に変なところで切れているからね。
だけど、==NULLがあるかないかまでは想像が及ばないかもしれない。
・・・hoge_arg6, hoge_arg7, |エディタの端| hoge_arg8) )
と
・・・hoge_arg6, hoge_arg7, |エディタの端| hoge_arg8) == NULL)
は、エディタ上では同じに見えるからな。
実は後者だったのに、早とちりして、前者だと思い込んでしまうかもしれない。
ケースバイケースなのはわかったから どこまでが左でどこからが右なんだ
ついでに、定数の左置きに対して。 -------------------------------------------------------------------------------- 17.4: どうしてif(x == 0)と書くかわりに、if(0 == x)と書く人がいるのか。 A: これはよく以下のように書いてしまうことを防ぐためのコツである。 if(x = 0) 定数を==の前に持ってくる習慣を付けておけば誤って、 if(0 = x) と打ち込むとコンパイラが文句を付ける どうやら2回=を打ち込むことを覚えるよりは、テストのオペランドの順をひっくり返す ことを覚えることのほうがやさしい。 (訳注:本のほうには、これは特によい書き方というわけではないと書 いてある。実際これでは両辺が変数の場合のif(a = b)という誤りを 捉えることはできない。こんな技を覚える暇があれば、lintの使い方 を覚えること。)
>>199 てゆうか、折り返しもできずに、右端がスクロールしないと見えないような腐ったエディタは使うなよ。。。
>>196 だけど、NULLと比べてポインタがどうなのか? という考え方をすれば、NULLが先に来る。
逆に、ポインタと比べてNULLがどうなのか? とは言わない。
ポインタが先に来るときは、ポインタがNULLであるか? と言う。
つまり、どっちでもいいということだ。
>>200 ケースバイケースで、比較の主体が左にきたり右にきたりするソースが、一番見難い(醜い)です。
>>198 >>193 のどこにも
>C lang FAQ に if (!strcmp(str1, str2)) {} よりif (0==strcmp(str1, str2)) {} の方がいいと書いてある
なんて書いてないだろ。本当に離散数学の基礎からやり直せ。
何を述べていて、何を述べていないのかの判断ぐらいつくようにしろよ。
じゃないと議論も糞も無い。
>>199 ああ、確かに
つまりあなたは「{」の前に改行すべきではない、と俺に言わせ
別の論争を勃発させたいのだなw
>>201 C langage FAQ なんてみんな一通り目を通してるんだよ。
一々貼り付けんでも良い。
今時定数を左に持ってくる人達は、
>>201 のような理由で左に持ってきているわけではない。
左に書いたほうが目立って言いと考えたから、左に持ってきているだけ。
それ以上でもそれ以下でも無い。目立つか目立たないか、ただそれだけ。
>>202 visual studio の初期状態ではそうですよ。
>>204 ケースバイケースで、繰り返し文がforになったりwhileになったりdo-whileになったら
読めない人ですか?
ケースバイケースで、分岐がifになったりswitchになったりすると、読めない人ですか?
>>206 改行しなくても一緒だよ。
・・・hoge_arg6, hoge_arg7, |エディタの端| hoge_arg8) ){
と
・・・hoge_arg6, hoge_arg7, |エディタの端| hoge_arg8) == NULL){
は、エディタ上では同じに見えるからな。
俺も通常は改行させないな。
おまえら一晩中こんなくだらない論議してたのか? 夜はちゃんと寝なさい。
だいたいさ、定数なんて右でも左でもどっちでも良いだろ。 それより、do-whileの方が気持ち悪くないか? いやマジで。 do{ }while(exp); ← このセミコロンとか。 これは良くて、定数左は駄目とか言ってるやつって、どういう思考なのかわからん。
>>209 「,」で終わってたらその後に続くのはいやでも解るでしょ
端を見ようとしないのはそいつの責任だよ
>>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)) {} とかかれた方がまだマシだと
>考える人も多いだろう。
俺がなぜ定数が右にしているか考えてみた a=1;は「aに1を入れる」と読むなら if(a==1)は「aに1が入っているなら」と読むからであって =と==を混同させたいんだよ そもそも混同させたくて同じ記号を使ってるんじゃないかと思えてくるほどだよ
>>212 続いていても、==NULLがあるかないかは、スクロールしてみるまで判らない。
引数がそれほど重要でない場合なら、スクロールを惜しむかもしれない。
実際、もうへとへとの状態でプログラムを読んでる場合だってあるわけで。
他人の責任だから関係ない、とは言っても、プロジェクトが停滞すると、
結局自分も巻き込まれるわけで。誰の責任かは正直どうでも良い。
>>205 おいおいw
それじゃあ、
>>193 が全くの主観で何の根拠も無いって事を白状しているだけじゃないかw
で、より良い例として挙げられているコードでは、定数が右側に来ているのは、軽くスルーですか?
FAQを根拠に!strcmp()を否定するなら、よりよい書き方についてもFAQを根拠にしたほうがいいんじゃないかね?
>>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)) {} の方がいいと書いてある
という意味になるの?
ねぇねぇ教えて。中学生とか? 日本語読める?
「〜の方がまだマシ」という表現を使っているわけだから、よりベターな方法があることも
暗に示しているのだが。
NULLとかなら見りゃわかるからいいけど 変数っぽい面して実はconstでしたみたいなのが右や左にいるとうざいから ある程度統一するのはいいんじゃないの?
>>216 だから、単体テストをすればちゃんとエラーは検出できますよ。
テストをやらないって企業文化なら、仕方ないかもしれませんが。
221 :
デフォルトの名無しさん :2007/10/27(土) 04:21:52
あした早起きして遠足だってのに・・・ こんなくだらない事で眠れなくなっちまった・・・
>>203 だから、なんでNULLとポインタを比較するのかが問題なんだろ
ポインタが有効なのか無効なのかを知りたいんであって、NULLと比較してポインタがどうなのかを調べたい人は誰一人居ない
定数が左にあって、唯一読みやすいのは、変数が一定の値の範囲内にある事を知りたい場合のみだろ
それ以外で、定数が左にあっても、読みにくいことはあれ、読みやすく感じることは有り得ない(そのコードを書いた奴だけは、読みやすいのかも知れないが)
>>208 例えば、10回処理を繰り返す部分で、
for (i = 0; i < 10; i++) {}
と
i = 0;
while (i < 10) {
i++;
}
の両方が適当に使われたとしたら、読む人は苦労するだろうな。
forとwhileの使い分けにどんな意味が隠されているのか悩むだろうか。
==の話ばかりするからダメなんだ 一時的に条件式を無効にしたくなったらどうする? 誰だってif(0&&condition)って書くよな? 定数0を左に書いた方がいいことは分かり切っている
>>217 >>193 の 後半は余談だよ。
if (!strcmp(str1, str2)) {} なんて書いちゃう奴のいうことなんて信用できないね、てこと。
それならまだ定数左派の方が信用できるよねって。
ロジカルに何か述べているわけではなくて、単に人格批判です。
だけど、if (!strcmp(str1, str2)) {} なんてコードをシレっと書いちゃうやつの言うことなんて、
信用できないよね。読みやすいコードを書くためのスタートラインにも立ってない。
226 :
デフォルトの名無しさん :2007/10/27(土) 04:28:03
>>218 もうヤケクソ?
>>193 「〜の方がまだマシ」
そりゃ確かに、「〜の方がいい」 とは書いてないけど。
「いいとは書いてない、マシと書いた」ってアンタ、小学生の喧嘩レベルやんw
眠いの?
>>220 何いってんの?
だったら初めからコーディングなんて拘らなきゃいいだろ。
どうせ単体テストするので、好きにやればいいじゃないという話になる。
つーかさ もうif(0 == a || a == 0)でよくね? 右にも左にも定数が来てて完璧だろう
>>225 > if (!strcmp(str1, str2)) {} なんて書いちゃう奴のいうことなんて信用できないね
根拠は?
単に俺が気に食わないだけ、なんて言わないよねw
もしかして、==とか<とか>=なんかが書いてないと、条件文が理解できない人ですか?
>>224 //if (condition)
if(0)
>>216 引数よりも==NULLの方が重要ならifの中に
関数呼び出しを丸ごと入れたりなんてしないでしょ
人からコードを引き継いで改修箇所付近のコードを切れてるからって見ないなんて
そんな人のケアをする自信なんて、俺にはないな
>>222 ポインタが有効か無効かを知りたい、と考えることも出来るし、
逆に、有効なポインタなのか、無効なポインタなのか、と考える人も居るかもしれない。
どっちで考えてもいいし、何の問題も無い。
>>228 単に、「プロジェクトが停滞する」に対する反証をしただけですよ。
こんなことも読み取れないなら、ひとまず睡眠を取って、頭をクリアさせたらどうですか?
え、クリアさせても今と変わらない?
それは、もう、どうしようもないかな。
ゴガギーン ドッカン m ドッカン =====) )) ☆ ___________ ∧_∧ | | / / おらっ!出てこい ( )| |_____ ∧_∧ < Cマガジン ●田 「 ⌒ ̄ | | || (´Д` ) \ おまいのせいで、こんだけ・・・ | /  ̄ | |/ 「 \  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | | | | || || /\\ | | | | | へ//| | | | | | | ロ|ロ |/,へ \| | | | | ∧ | | | |/ \ / ( ) | | | |〈 | | | | / / / / | / | 〈| | | / / / / | | || | | / / / / =-----=-------- | |
こんな醜い争いが二度と起こらないように C++0xでは定数をLvalueにしてもらうしかないな
>>233 無効なポインタがどれかを調べたいなら、
if (NULL == xxx)って書いたほうが分かりやすいかもね。
>>223 後者のケースだと、for文を使うべきだよ。
whileを使う時は主にカウンタ変数がいらない時だな。
forとwhileを使い分ける人が居るように、
定数を右に書いたり左に書いたりする人が居ても良いだろ。
そして、定数が左だからってそんなに怒るほどのものでもない。
239 :
デフォルトの名無しさん :2007/10/27(土) 04:40:31
電車の座席に座るヤツが居るように 電車の床に座ってもいいだろ! 公園のベンチに座るヤツが居るように コンビニの駐車場に座り込んでもいいだろ! そんなに怒るほどのものでもない。
>>226 眠いのはお前だろ。眠くてしょうがないお前が勝手に勘違いしただけだろ。
「AよりBの方がまだマシ」という言い方をした場合、
「Bが良い」と主張しているということには決してならないよ。
糞と尿、どっち食うかと言われて、
「糞より尿の方がまだマシ」と答えた場合、
「尿が良い」と言うことにはならないだろ。
要はお前が勝手に勘違いしてるんだよ。
お前みたいなおっちょこちょいが居るから、文句言われようとも、
わざわざ定数を左に書かざるを得なくなる。その辺わかれ。
もう「比較演算子の左オペランドに定数を置く奴は死ね」スレでも立ててそっちでやってくれんかね
>>240 おまえ、実は
>>80 だろ?
もう、定数を左に置いても苛めないからさ、どこの会社かだけは教えてくれ。
お前を真人間に教育するよりも、関係を持たないようにする方が、遥かに安上がりだわ。
寿司食いたいフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ
if (0 == a) ↑ ↑ 糞 尿
245 :
デフォルトの名無しさん :2007/10/27(土) 04:49:43
俺なら尿を選ぶ。糞はちょっとな・・・
>>230 230は単に釣りだと信じたいのだが・・・。
strcmpはあくまで整数を返す。boolを整数で代用しているわけではなく、
正真正銘、整数としての戻り値を返す。
だから整数と比較するべき。
意味上も型上も正真正銘整数なものを、
ただ偽が0だからという理由だけで、あえてboolとして比較する、なんてのはナンセンスだよ。
逆に、if (!strcmp(str1, str2)) {} が OK な人なら、他は何やってもOKでしょ。
Cの禁じ手全部 OK じゃね?
定数が左にきたぐらいでごちゃごちゃ言う立場に無いね。
やばい、真性のキ印だったのか。
>>246 そもそも、Cにはboolなんて型は存在しないぞ。
ifとかの条件式は、単に0か非0かを見ているだけ。
248 :
デフォルトの名無しさん :2007/10/27(土) 05:01:44
>if (!strcmp(・・・)) と書くのが一番わかりやすい てのは、いくら何でも間違いだろ。 勢いで書き込んだ後、おっといけね、strcmp だった〜orz ってとこだろね。
>>232 >引数よりも==NULLの方が重要ならifの中に
>関数呼び出しを丸ごと入れたりなんてしないでしょ
そうとは限らんよ。関数として見れば、関数が大事だし、
if文として見れば、条件が大事だ。
>人からコードを引き継いで改修箇所付近のコードを切れてるからって見ないなんて
>そんな人のケアをする自信なんて、俺にはないな
改修するならしっかり読むが、さらっと目を通すだけという場合も有るだろ。
おっちょこちょいなやつは何処にでも居るもので、そういう奴が変な勘違いを起して、
面倒を起したら困る。
実際、このスレにも自分の反論しようとしている相手の文章すら、
まともに読まない奴が居るわけで。
んで、自分のミスなのに、「お前の書き方が悪い」と開き直る。
だから、自分から相手が読みミスらないような書き方をする必要が出てくる。
結局こっちにも火の粉は飛んでくるからね。
250 :
デフォルトの名無しさん :2007/10/27(土) 05:05:45
最高にド低脳な発言してください in ム版(XVII)
http://pc11.2ch.net/test/read.cgi/tech/1179424842/ 125 名前:デフォルトの名無しさん[sage] 投稿日:2007/10/27(土) 05:00:40
strcmpはあくまで整数を返す。boolを整数で代用しているわけではなく、
正真正銘、整数としての戻り値を返す。
だから整数と比較するべき。
意味上も型上も正真正銘整数なものを、
ただ偽が0だからという理由だけで、あえてboolとして比較する、なんてのはナンセンスだよ。
逆に、if (!strcmp(str1, str2)) {} が OK な人なら、他は何やってもOKでしょ。
Cの禁じ手全部 OK じゃね?
定数が左にきたぐらいでごちゃごちゃ言う立場に無いね。
↑最高にド低脳な発言!
>>250 ワロタ
自分で「ド低脳」って認めてどうするw
>>234 だから好きにやれば良いじゃん。
ウマいコードってのは、プロジェクトが停滞しづらいコードだろ。
逆にヘタなコードってのは、プロジェクトを停滞させるコードだろ。
あなたにウマいコードは必要ないじゃない。
253 :
デフォルトの名無しさん :2007/10/27(土) 05:10:09
オチがついたところで、また明日。おやすみなさい。
>>242 違う。
この議論は前スレから永遠と続いている。
というか、このスレは今現在俺だけで持ってるようなものなんだけど、
前スレからの流れを見てもらえれば、俺が
>>80 でないことは分かる。
物事への認識のレベルが違いすぎるからすぐ判るはず。
>>247 boolが無いから整数で代用しているんだろ。
>>247 の2行目に、
>boolを整数で代用している
という文がちゃんと入ってるだろ。
単に整数値といっても、C言語の場合は、意味の上では、整数だったりboolだったりするから、
その辺は使い分けるべきだろ。
その程度の意識も無いのに、ウマいもヘタも無いね。
そういうやつは定数が左にきたぐらいでグダグダいう立場に無い。
糞食いながら、「しょんべんマズー」と言ってるようなものだ。
つーかもう今日は寝る。
返事はまた明日気が向いた時に返すかも。
今日は張り合い無かったなぁ。
if (!strcmp(str1, str2)) {} が 汚いって事すらもわからないような奴では、
ちょっと流石に相手にならないよ。
そういうやつが、他人のコードを綺麗汚いと、いきり立ってるのかと思うと、泣けてくるね。
身の程をわきまえるべき。
>>250 が
>>125 をド低脳スレに貼ったらしいが、この始末どうつけるつもりなんだろうな。
他の右派(というか、単なるアンチ俺、もとい、暇つぶしの友)が可愛そうだ。
仮にif (!strcmp(str1, str2)) {}がif (0==strcmp(str1, str2)) {}に劣るとしても、 if (0==strcmp(str1, str2)) {} がif (strcmp(str1, str2)==0) {} に劣ることには変わりないのに。
腹減った
if (!strcmp(str1, str2)) {} は綺麗 *dst++ = *src++ と勝るとも劣らないくらい綺麗
while(*dst++ = *src++);
264 :
デフォルトの名無しさん :2007/10/27(土) 08:24:17
英語ができると、if (!strcmp を、if not string compare と読んでしまうので 等値性をテストしているとは認識しにくいな。 !をnotと読まない人は気にならないんだろうけど。
if (!strcmp(str1, str2)) {} の何がいけないのか分からない
if(str1 == str2) {} だろ上官
・・・なんでこんなことを議論しているのかがよく判らない。
おまいらおはよう。未だに左定数の話をしていて正直がっかりだ。
>>169 賛同ありがとう。「簡単なことをこんなに難しく書くやつがいるんだぜ」「頭
痛いよなぁ」で済むと思ったら、予想外の展開になって別の意味で頭が痛かっ
たよ。
>>171 皮肉? いや、いたってマジだぞ? だってソース見たとき本気で頭かかえたもの。
ちなみにこういうコードへの対策は、「10行以上書いたらレビューしろ。毎日
レビューしろ。動いてからレビューするな」以外に知らないんだ。(そういう
意味でペアプログラミングはすげー有用だと思うんだが、まだ実現できたこと
がない)
>>189 > の中で重要な処理をしているかもしれない。
それだったら「本質の抜粋」にならないでしょーが。
for文の中は、変数名と定数値以外、「そのまんま」だ。
違う点は、オリジナルはC++じゃなくてJavaなこと、関数(メソッド)のシグネチャ、
書いた処理の前にもコードがあること、最後のif文のブロックの中身。
>>269 補足しておくと、ここで言ってる「本質」とは、
「b-N<a≦b (a, b, Nは整数) を判定する、ただそれだけのために、大小比較じゃなくてループを使ってる」
ってことだと書けば理解してもらえるか?
>>189
ぱっと見て「ヘタだなぁ」と思うスレ
くだらねー議論してんなぁ。
定数を左に置くか否かなんてとっくの昔に結論でてるだろうが。
>>196 のような例外を除いて定数を左において可読性落としたり、
スクロールしないと全部が見渡せないような条件式なんか書くな。
コンパイラが警告出さない時の数十年前に編み出された小手先を
未だに神の一手が如く崇拝してんじゃねぇよ、ボケ。
これを知ってる俺って技術力たけぇなんて思ってたかもしれんが、
ド低脳の証明だ。玉石混交の石のほうだ、カス。
おまえら、何度も同じことをくりかえすならfor文の中にでも入れとけよ
>271 禿同
275 :
デフォルトの名無しさん :2007/10/27(土) 10:18:23
おはよう。しつこいがもう一度爆弾投下!
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
>275 if文の中身間違えてない?
>>269 あまりにもスレタイトルに沿ったコードだったからレスつけるまでもないと思った。
>>275 コンパイラによっても違うな。さすがゴミクズ撒き散らすマイクロソフトって感じだ。
C:>bcc32 test.cpp 【borlandのコンパイラ】
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.cpp:
警告 W8060 test.cpp 5: おそらく不正な代入(関数 main() ) 【警告が出る】
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
C:>cl test.cpp 【マイクロソフトのコンパイラ】
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.cpp
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.
【警告は出ない】
/out:test.exe
test.obj
279 :
276 :2007/10/27(土) 10:55:07
間違った;ごめん
>>278 cl は /W4 で使うもんだ。
gcc は最低でも -Wall で使うもんだ。
おれ定数左派だけど定数を左におく場合の欠点って何? 可読性落ちる? でも落ちるか? 慣れてないとえっ?って思うかもしれないけど別にそれぐらい大丈夫でしょ。 javaでも "hoge".equal(var); ってイディオムあるぐらいだし。 lintなんて毎回通さないし、コンパイラの警告も丸カッコついてるとスルーされるし。 (論理式で繋がってたり、マクロが絡んだりすると丸カッコつく場合があるよね) あとたまたま警告を見過ごしてオブジェクトファイルになってしまうと、次にファイル更新しないと警告でないよね。 おれ注意散漫だから1年に2、3度ぐらいは==と=の間違いやってしまうけど定数左のおかげで早期発見できてるよ。 もちろん定数右でもコンパイラの警告で見つかってるかもしれないけど 定数左にして損はなしと思うから昔から今までずっとそのスタイル。
ソースファイル内でそのスタイルで統一されてるなら、別に定数が右だろうが 左だろうが、個人の好みだからいいと思うけどなあ。 会社とかで、規約がちゃんとある場合は別で。
C:\test>cl /W4 test.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.c
c:\test\test.c(7) : warning C4706: 条件式の比較値は、代入の結果になっています。
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.
/out:test.exe
test.obj
>>278 clでもちゃんと警告出るじゃねぇか
gccも-Wallつけないと警告でないね。 まあ、普通は付けてると思うけど。
>>282 スタイルには単に好みの問題と、実際にメリットのあるものとがある。
前者は ifの条件式の後に中カッコつけるか、改行してからつけるか、など。
後者はif のあとには必ず中カッコをつける、など。
定数左は後者だと思う。(可読性に問題はないと思うので)
>>282 「統一されてればいい」ってことなら、あえて少数派のスタイルを選ぶことはないんじゃないの?
>>72
>>285 定数左は確かに代入によるバグを防げるときもあるけど、
その反面、慣れないとぱっと見てわかりづらいよね?
例えば、代入文は
x = 0;
などと書くわけで、大抵の文は左から右に読んでいく。
そして、定数は右にある。これへの慣れが強いので、
if(0 == x)などと書かれると、ここで思考が停止してしまう。
ソースコードの理解しやすさ(可読性?)も考えると、トレードオフで
どちらを選ぶかは個人の趣味レベルになるのかなあと。
上で議論されてるように、コンパイラとかで容易にチェックできるわけだし。
コーディングスタイルに拘りすぎる奴はヘタクソ コーディングスタイル論争に突入する奴はさらにヘタクソ
>>286 少数派ではあるけれども、
>>285 の言うようにチェッカとかを使わなくても
ミスに気づくことができるという利点があるので選ぶんだろうね。
ちなみに漏れは定数は右派。
右におくソースがほとんどだし、慣れてるし。
漏れが見たオープンソースなソフトウェアのソースは定数が右にあった。
もし、定数が左にあることにもっと優位な点があるなら、とっくに
ほとんどのソースが定数左になってると思うんだけど、いかがだろう。
とヘタクソ厨がもうしております
>>281 主語と目的語の区別がつかないアホには
自然言語からやり直せといいたい。
読む分にはどっちでもいい。何の違いもない。 書くときはsubject == compareの方が流れ的に書きやすい。
288の書いたコードは汚そうだな。
おまえら…。 【審議中】 ∧,,∧ ∧,,∧ ∧ (´・ω・) (・ω・`) ∧∧ ( ´・ω) U) ( つと ノ(ω・` ) | U ( ´・) (・` ) と ノ u-u (l ) ( ノu-u `u-u'. `u-u' 【結果発表】 パッ パッ パッ パッ パッ パッ [チラ] [シの] [裏に] [書き] [やが] [れ!] ‖∧,,∧ ‖∧,,∧ ‖∧,,∧ ‖∧,,∧ ‖∧,,∧ ‖∧,,∧ ∩・ω・`) ∩・ω・`) ∩・ω・`) ∩・ω・`) ∩・ω・`) ∩・ω・`) ( ). ( ). ( ) ( ) ( ) ( ) `u-u´ `u-u´ `u-u´ `u-u´ `u-u´ `u-u
if(*dst++ = *src++){ hogehoge } みたいなとき警告でないようにしたいのですが
if((*dst++ = *src++) != 0){
もうね、コーディングスタイルスレでも立ててそこでやれと
しかし、無茶苦茶な低能が居たものだな... if (!strcmp(str1, str2)){} は、知らない者に対して、文字列が等価で無いこと比較しているような誤解を与えることがあるので好ましくは無いだろう では、 if (strcmp(str1, str2) == 0){} これはどうだろうか? この場合、!strcmp()よりも悪化していると言える 本質的な問題を解決していないからである しかも、余分に入力した上で、知らない者に対し更なる誤解の種をまいていると言えるからである 故に、C FAQでは、 #define Streq(s1, s2) (strcmp((s1), (s2)) == 0) と言うマクロを用意することで if (Streq(str1, str2)){} と記述させる事により、文字が等価であることを比較している事を判りやすくしましょうと書いているのだ つまり、定数を左に置く正当の理由とは言えない その上、彼の主張の一つである、定数を左に置くことで、何と比較しているのか判りやすくなると言う弁からすると "文字列が等価では無いことを調べている"ように強調されてしまった駄目なコードの例と化しているのである 彼は、これを大まじめに、こちらの方が判りやすいと言っているが、どう考えても、判りにくなっていると思われる
わかったから月曜になったらちゃんとハロワ池よ
;`;:゙;`(;゚;ж;゚; )ブフォッ!
301 :
デフォルトの名無しさん :2007/10/27(土) 16:04:59
strcmpでの定数の右左に関して言えば、圧倒的に右だろう。 if (strcmp(str1, str2) < 0) を読むとき、不等号が見たままの形として利用できる。 つまり、 str1 < str2 として直感的に理解することができる。 同様の条件を右定数で書くと、 if (0 > strcmp(str1, str2)) となって、見たままの直感と反してしまう。 そのつどリファレンスを引いたりしたくないし、 機械的に右へ書いてしまう習慣は役に立つ。
できる奴ほどスタイルにこだわる
大きいほうを右に配置したいし、常にそうするから、 結果的に不等号の「>」は不要だと思うんだよなぁ。 勿論、流儀の問題でぶつかったりする心配はあるけど、 そうじゃなくて自分ひとりで「>」無しでやっていくうえで、 どうしてもでてくる不都合ってあるのかな? 「<」じゃ困ってしまうような事態があるのかな? チラシの裏にでも書いておけって? すまんね。
304 :
デフォルトの名無しさん :2007/10/27(土) 16:31:17
だれか、288を日本語に翻訳してくれ。 で、実際のところ、定数は左に置けとか頑張ってるのって、一人だけだろ?
>>301 それは「定数を左辺に」と主張している派の本質と話題をそらせて釣りだと思うけど
ぱっと見て「バカだなぁ」と思うコード
スレスピードがきもいよお前ら
いまム板で一番勢いがあるスレだぜここは
昨夜から今朝にかけての速度はもう、ある種の祭りだった。
お前ら・・・まだ祭るつもりか・・・? (・∀・)イイヨイイヨ-
キティガイが一人でも出てくると、スレのスピードが上がるからな。
今、顔真っ赤にして力説してるのは、前スレで「if (a >= 0)はその語順じゃ読めない」と 恥をさらした奴に違いない。
break;
goto 80;
>>80 ええ? そのバグを防ぐ方法を知らないの?
こういう話のときには必ずでるのに。。。
基礎の基礎だよ。
このスレは無限ループに入りました。
>>80 そんなもんコードチェッカーにかければすぐ見つかるだろ。
まさかコードチェッカー使ってないのか?
iPod touch買ったよ
誤爆
初音ミクを Amazon で注文した 早く来ないかな wktk wktk
定数を右辺に書いていてうっかり「=」で比較してしまうバグよりも それ以外の原因で起こるバグの方が100000000倍くらい多いと思う
発生頻度はそうだろうけどさ 仮にコンパイラのwarningすり抜けた場合、==と=の間違い見つけるの結構きついよ 同様に!=と=!の間違いも見つけるのもきつい 実際はまった経験があると見方が変わると思う
そこでconcept checkingですよ
80の人気にshift
うちの女社員がこんなコード書いて遊んでるだけどどうしたらいいの? if/* ∧∧ */ /*〜*/(*b == '-')/*<ニャー */ /* >> >> */ /*=====================*/
>>329 コードレビューで、「このコメントは何ですか?」って真面目に質問する
>80も>80を徹底的に叩いてる奴も、どうでも良い事までルールで縛って 生産性落とす奴等と同列に見えるのは気のせいかな。 こーいう奴等が権力握ると、ifと括弧の間に空白を入れろとかいう どーでも良いルールを作るのだろうな。
>>331 その程度の事ならコード整形ツールを使いましょう
>>329 下手に見えるコードではないな
問題は人間性なのでなるべく遠ざけましょう
権限があるのなら閑職を与えてそっとしておきましょう
>>329 そういう遊びは大事だと思う。
ちゃんと仕事してんならそれくらいは大目に見てやれ。
>>331 どこにスペースを入れるかは、コーディングルールに入れるよ。
入れないと、if(a==0){}とか書く奴いるし。
コーディングスタイルにこだわりがない奴ってなんなの?
人のソースはおろか、自分のソースすら読むことが無い奴らなんでしょ。
「なに、このコーディングルール。ストレス溜りまくりだわ」とかボヤキながらコーディングしてるとしたら、 それを守らないときに、お前のコードを読む、数倍の人間がストレスが溜まるのだ。
コスト感覚に優れた奴だと思う
そう思った時期が漏れにもあったが 数多く他人のソース読んでるうちに そういうことはいちいち気にならなくなる 君は経験が足りないようだね
>Any professional programmer can easily read and write code >that is formatted a little differently than they're used to.
書き換えるなら ヌルポ しかない
>>342 プロフェッショナルプログラマーならそうかも知れんが、それを底辺コーダーに要求しちゃだめだろw
だけど、プロフェッショナルなほどコーディングスタイルに拘ると断言しちゃってるやつが居るよ。
自称プロフェッショナルだから
定数の位置を意識するより、 正しい条件式を書けるように意識したがいいよ
てかさ、もう分かっただろ。 コーディングスタイルに拘ってる、とか偉そうに言ってるが、 if( !strcmp(str1, str2) ){} とかシレっと書いちゃったりするのが現実なんだよ。 結局、コーディングスタイルってのはある種のエゴみたいなものだからな。 逆に、コーディングスタイルには拘らないよ、といってる奴は、 つまりこれは、私はあなたにとことん合わせます、といってるわけで、 実際には、こういう協調性のあるやつの方が良いコードを書く。 要はこのスレにたむろしている連中なんてのは、単なるオナニストであって、 プロフェッショナルとは程遠いところに居るって事だよ。 真のプロなら、「どんなコードでも書きます!!」と言うはずさ。 それからもう一つ分かったことは、 このスレは俺が居ないと進まないって事だ。
プロフェッショナルなら if( !strcmp(str1, str2) ){} ごときにそこまで粘着しない
プロフェッショナルなやつは、どんなコードでも読めるから if (!strcmp(str1, str2)) {} ぐらいなんでもないだろう。 だけど、コーディングスタイルに拘ります!!とか言ってるやつが、 if (!strcmp(str1, str2)) {} なんて書いてたら、そりゃ滑稽だろう。 「拘ってそれですか?」と言いたくなる。
> それからもう一つ分かったことは、 > このスレは俺が居ないと進まないって事だ。 これは恥ずかしい。 また昨日みたいな祭りを繰り返すつもりか?
if (!strcmp(str1, str2)) {} に粘着しているわけではなくて、 自分はこんなコード書いといて、他人のコードにつべこべ難癖つけてる姿を滑稽に思い、 そこに粘着しているんだよなー。 「おれウンコ大好きです」と言いながらウンコだべてるなら、ご自由にと思うし、 「たまには尿もいいよね」と言いながら尿を飲んでるなら、まぁ仕方ない。 だけど、「尿のんでるやつプギャー」とバカにしながら自分はウンコ食ってるなら、 もう笑うしかないじゃない。
if(strcmp(s,s2) == 0){} よりも if(!strcmp(s,s2)){} の方が読みやすいと思うけど、結局どっちでもいい
>>352 事実だろ。
お前らみたいな自分勝手で我侭で、我が強く、多感で、
自分の価値観を犯されることを心底嫌う奴らをおちょくると、
すぐ発狂するから面白い。
おれが「好きにすりゃ良いじゃん」って言ってるのに、
「いや、好きにするべきではない」とかわけ分からんこと返してくるし。
好きにすりゃ良いじゃんって言ってるんだから、好きにすりゃ良いのに。
自分だけ気づいてないって滑稽だよね
このスレのやつらは
所詮
>>354 の レベルだってことだよ。
>>355 だから、お前は好きなようにコーディングしていいよ。
ただ、お前のスタイルが一番優れていると、回りに宣伝するのだけはやめてくれ。
360 :
デフォルトの名無しさん :2007/10/28(日) 01:32:33
尿と糞に例えているけど、実際のところはミネラルウォーターと下水くらいの違いがあるだろ。
if (!strcmp(str1, str2)) {} 別に読みづらくない いつも、"!"を「0じゃない」って読んでるから
ここはルールスレではない。 自分が「下手だ」と思うならどんどん貼って、議論したい奴が議論するスレだろ。
おめーらはプロジェクトのコーディング規約にあわせてりゃ良いんだよ こだわり見せるのは自分のオナニープログラムだけにしとけ それなら誰も文句言わんから
>>342 恣意的に引用するのは止めような。
C++ Coding Standards
Tried-and-true guidelines for C++ programmers
ttp://www.ddj.com/architect/184401863 >Don't sweat the small stuff. (Or: Know what not to standardize.)
>
>Don't enforce matters of personal taste. Don't enforce obsolete practices.
>
>Issues that are really just personal taste and don't affect correctness or readability don't belong in a coding standard.
>Any professional programmer can easily read and write code that is formatted a little differently than they're used to.
>
>Do use consistent formatting within each source file or even each project, because it's jarring to jump around among
>several styles in the same piece of code. But don't try to enforce consistent formatting across multiple projects or
>across a company.
なぁ、どこかに自分が何派だとか書いた方が良くないか? どの立場で言ってるのか分からんレスが多すぎる。 #正直そんなレス書く奴はコードも…
368 :
クレハ :2007/10/28(日) 02:25:33
そのくらい、書かれた内容から読み取れよw
>>367 君には違って見えなくても、違った解釈したレスしてる奴いるじゃん
規約/ルールの話はスレチガイだ派 PGにはプロフェッショナルもコーダーもない。PGはPGだ。
なあ、自作自演がひどいと感じるのは俺だけか?
372 :
るくは :2007/10/28(日) 02:31:36
そんなにむごいか? 自作自演しているのって、80くらいしかいなさそうだけど。
>>341 お前の会社は、新人君を野放しにするのか?
まあ、一番大事なのは >Don't sweat the small stuff. (Or: Know what not to standardize.) だね
>>372 お前、前スレでif a <= 0が読めないとか言ってたやつだろ。
いい加減に粘着やめろよwww
376 :
ヤマハ :2007/10/28(日) 02:36:37
コーディングルールって、チームで作業するときに使うものってわかってるんだろうか?
スタイルなんてこだわらなくていいじゃんって奴、ひとりしかいない気がする。
自分はこだわらない派だけど他に3〜4はいると思う
return "もうそろそろ終われ";
こだわらないが従いはする でも、従うことがあまりにもコスト高なら代案を提案してみたりはする
で、ヘタなコードはどこにあるんだ。 if (条件) { 1000行くらいのコードA 3行くらいのコードX 500行くらいのコードB } else { 1000行くらいのコードA(上のAと全く同一) 3行くらいのコードY 500行くらいのコードB(上のBと全く同一) } なんて素敵コードは見たことあるが。
あー「こだわらない」の定義が違うことがわかった。
>>378 一番素敵なのは、拘らないといいつつ、定数を左辺に置くことに拘りまくり
Cの文法が自分の趣味に合わないと言い続けてる人が居ることだけどね
>377 ルールでスタイルまでガチガチに縛るのはナンセンス。 比較式の書き方や空白の入れ方とか、そんなルールを決めても デメリットの方が大きい。 一番怖いのはルールが細かすぎるあまり徹底し切れず、 最も重要なルールも守られない事。 ルールは必要最低限に留めて、その分徹底させた方がいい。
プロならreadability、保守性に気を使う。 これに反論する奴はいないだろう。 気を使った結果、if (0 == a)と書けというコーディング規約を作るかもしれんが。
>>386 慣れれば、そのスタイルで自然に記述できるようになるだろ?
>>386 インデントをタブにするとか空白4文字にするとか、カッコをどこにおくかなんて、どうでもいいんだよ。
大抵の開発だとCVSなんかにチェックインするだろうから、チェックインの前にインデント変換ツールに通すだけだから。
スタイルが統一されているコードがチェックインされているなら、個人で開発中のコードはどんなに汚くても、周りの人には影響なし。
390 :
プラハ :2007/10/28(日) 02:58:51
ところで、
>>366 はどこに行ったんだ?
提案だけしておいて逃げるとはなさけなや。
初めからわかっていたことだが、つまりは、コーディングルールなんて、どうだって良いってことだ。 拘るのはオナニー野郎だけ。
放置プレー
boost無いとプログラミング出来ませんという奴
>388 if(定数==変数)とか強制されたい? >389 なぜ漏れに反論するのか分からない。 同じ意見なのだが。 >390 名前見て下さい
本当に、あんまり詰まらないことに拘るのは学生までにしておけよ。
>>393 shared_ptrだけは許してください
strcmp(str1, str2)は、 str1とstr2が等しければ0を返し str1がstr2より大きければ正を返し str1がstr2より小さければ負を返す つまり、関数名通りに文字列を比較する関数と見た場合 比較した文字列が等しければ偽を返し、比較した文字列が等しくなければ真を返す関数である 故に、文字列が等しいことをテストしたければ、not演算子で真偽を逆転させるのが正しい比較となるが それでは、おっちょこちょいが、文字列が等しくないことをテストするのだと勘違いする可能性があるため #define StrEq(s1, s2) !strcmp(s1, s2) とでも定義して、文字列が等しいことを調べているのだと主張する方がいいだろうと言うのがC FAQの趣旨だ それを、 if (!strcmp(s1, s2)) {} なんて事を書くのはおかしいと書くのがおかしいのでは無いのだろうか? 定数を左辺に置く以上に恥ずかしい発言だと思うのだが
もっと大局を見ろ strcmpなんてifで使うためにあるんじゃないんだよ qsortの引数に渡すためにあるんだよ
こういうの何て言ったっけ、自転車置き場議論?
>>397 >つまり、関数名通りに文字列を比較する関数と見た場合
>比較した文字列が等しければ偽を返し、比較した文字列が等しくなければ真を返す関数である
なんで、わざわざそう「見る」必要があるんだ?
>strcmp(str1, str2)は、
>str1とstr2が等しければ0を返し
>str1がstr2より大きければ正を返し
>str1がstr2より小さければ負を返す
と自分でも書いている通り、strcmpは真偽ではなく、あくまで整数値を返すわけだが。
等しい時0になるってだけで、真偽は関係ない。
等しい時にたまたま0が返って、それがたまたま偽だってだけだ。
0歳かどうか調べるのに、わざわざ if( !age ){} なんて書く奴は居ない。
str1 > str2かどうか調べる時は strcmp(str1, str2) > 0 と書き、 str1 < str2かどうか調べる時は strcmp(str1, str2) < 0 と書き、 str1 >= str2かどうか調べる時は strcmp(str1, str2) >= 0 と書き、 str1 <= str2かどうか調べる時は strcmp(str1, str2) <= 0 と書くのに、 等しいかどうか調べる時は、!strcmp(str1, str2) と書くのは不自然じゃないか? また、if( !strcmp(str1, str2) ){} と書く奴は、等しくないかどうか調べる時には、 if( strcmp(str1, str2) ){} と書くのか?
>>397 は本当にどういう思考なんだろう。
例えば、年齢をあらわす整数型の変数ageが有ったとする。
この場合、ageは年齢を表す、と考えるのが普通だろう。
それをどうしてわざわざ、
ageは0歳の時は偽を表して、0歳でないときは真を表します、
と考えなければならないのだろう。
if ( !age ){ /* 0歳のとき */ }
else if( age == 1 ){ /* 1歳のとき */ }
else if( age == 2 ){ /* 2歳のとき */ }
とか書くのかい?
ageは元々整数を表しているのに、わざわざ真偽を考え、0歳の時だけ特別扱いする意味はあるのかい?
そして、そういうことをして、一体どういうメリットが有るの?
それ自体として観取されるのだから、もはや原義に遡及する根拠性はない。
まだやってるよw
C言語はboolを整数型で代用しているので、 同じ整数型でも、真偽として扱っている場合と、整数として扱っている場合がある。 例えば、int isdigit(int c) は 「cが10進数なら真の値を返す」 と有り、 これの戻り値は整数型だが、整数型で真偽を代用して返している。 一方、int strcmp(const char *cs, const char *ct) は、 「文字列 cs と 文字列 ct を比較する. cs > ct なら 0より大きい数, cs < ct なら 0未満の数, 等しければ 0 を返す.」 とあり、「数」と言う言葉を使っていることからも分かるとおり、あくまで整数値を返す。 整数と真偽の区別も出来ないなんて、分別なさすぎ。味噌も糞も一緒なんだね。 そういう奴が、他人のコードに文句言ってるのがこのスレの実態なんだよね。 必ずしも分別が必要とは思わんが、物事の分別もつかないレベルのくせに、 他人のすることをいちいち評価しようとするなよな。
>>408 Cの標準関数の定義にも、整数型における整数と真偽の区別があるので根拠性はある。
isdigit は真偽を返すと明記してあり、strcmp は数を返すとしっかり明記してある。
むしろ、わざわざ、それに従わないようにする事に対する根拠やメリットの方が無い。
コーディングスタイルについては、それらはC言語の定義の範疇には無いが、 一方、strcmpに関しては、C言語の定義に「数を返す」と書いてある以上、 数として評価すべきだと思うが、どうだろう。 どうして「数」をわざわざ真偽値とみなして評価する必要がある?何のメリットも無いのに。
>何のメリットも無いのに。 ==0よりも!のほうが2文字少ないとか思ってたりして。 何も知らない初心者なら、たぶんstrcmp(a,b)==0と書くはずで、!strcmp(a,b)とは書かないだろう。 Webで見たか、本で読んだかわからないが、どこかで!strcmpという書きかたを見つけて これがC流のやりかただと思いこんじゃったんだろうねえ。 定数を左におく書き方もおそらく同じだろう。
漏れはアセンブラで書いてた時期が長いから if(!age) に全く抵抗がない
>>413 JZ と JE を区別しないほうですか?
JEがなかった頃から使ってますから
strcmpは数を返すと定義してあるのに、わざわざそれを真偽値として評価し、
その結果、
>>403 に書いた、記述に一貫性が無くなるというディメリットを生んで、
一体何がしたいの?
それはつまり・・・・ヘタって事じゃないの?
お前らの嫌いな、わざわざ余計なことをしてディメリットを生む、いわゆる冗長性ってやつだろ。
これの場合はコードの冗長性というわけじゃなくて、思考の冗長性のことだけど。
>>416 >その結果、
>>403 に書いた、記述に一貫性が無くなるというディメリットを生んで、
一貫性はある
バカにはそれがわからないだけ
>>403 str1 > str2かどうか調べる時は strcmp(str1, str2) > 0 と書き、
str1 < str2かどうか調べる時は strcmp(str1, str2) < 0 と書き、
str1 >= str2かどうか調べる時は strcmp(str1, str2) >= 0 と書き、
str1 <= str2かどうか調べる時は strcmp(str1, str2) <= 0 と書くのに、
その通り
等しいかどうか調べる時は、!strcmp(str1, str2) と書くのは不自然じゃないか?
不自然じゃないです
また、if( !strcmp(str1, str2) ){} と書く奴は、等しくないかどうか調べる時には、
if( strcmp(str1, str2) ){} と書くのか?
はい
>>418 どうして?
strcmpは「数」を返すと定義してあるのに、
どうしてわざわざ真偽値とみなして評価する必要があるの?
数が返ってくるのだから、数として評価すれば良いのでは?
わざわざ数を真偽値とみなして評価することが、どう不自然でないか説明してください。
あたりめーじゃん
>>418 あともう一つ聞きたいんだけど、
等しいかどうか調べる時は、!strcmp(str1, str2) と書くくせに、
str1 >= str2かどうか調べる時は、どうして
!(strcmp(str1, str2) < 0)
と書かずに、
strcmp(str1, str2) >= 0
と書くのですか?
strcmp(str1, str2) >= 0 と書くのなら、
等しいかどうか調べる時も、
strcmp(str1, str2) == 0
と書いた方が自然ではないですか?
あたりめーじゃん
>>418-419 おれは
strcmp(str1, str2) > 0 や strcmp(str1, str2) < 0 を使うケースは
if(strcmp(str1, str2) > 0){
hage
}else if(strcmp(str1, str2) < 0){
hoge
}else{ // !strcmp(str1, str2) == 0
huga
}
のときしかありえんからな
そもそも上のような議論の発生の余地がない
>>423 実行速度を考えればそうだが、
>}else{ // !strcmp(str1, str2) == 0
はコメントがバグってる。
整数と論理値を区別しない言語ってC/C++の他にある? !strcmpがOKな人は、C/C++しか使わない人じゃないかと思うんだけど。
>>421 str1 >= str2かどうか調べる時は、どうして
!(strcmp(str1, str2) < 0)
と書かずに、
strcmp(str1, str2) >= 0
と書くのですか?
どっちも使うよ
文脈に沿ったものを使う
>>426 (strcmp(str1, str2) < 0)
が真偽値である以上、!(strcmp(str1, str2) < 0) は正しいんだけどね。
!strcmp(str1, str2) は相変わらず変だが。
>>425 Perlも使ってるけどあっちのほうがめちゃくちゃ破綻してるだろ
実際に書くかどうかはともかく !strcmp(str1, str2) の意味を瞬時に出来ない奴は素人か頭悪いだろ。
いや、言語とか関係なく、C言語のstrcmpは「数」を返すと定義されている以上、 数として評価すべきでは? ちなみに、isdigit は真偽を返すと定義してある。 こっちは if( !isdigit(c) ){} で問題ないが。
432 :
デフォルトの名無しさん :2007/10/28(日) 08:01:31
こういう細部の趣味レベルの話でグダグダいってる奴の1万行くらいのプロジェクトのソース見てみたい。 もっと根本的な部分でおかしなソース書いてそう。
>>432 些細なことを
些細なこととして切り捨てる人と
些細なことなので、優先順位の低い問題として考慮する人との差は
結構でかいよ
これは「些細でかつ優先順位の低い問題」なんだよ
そしてもっと優先順位の低い問題が、コーディングスタイルだ。
436 :
381 :2007/10/28(日) 08:56:28
俺は無視されてたのか…orz
>>434 些細でかつ優先順位の低い問題だからこと
討論する場所は2chでいいんじゃないか?
439 :
デフォルトの名無しさん :2007/10/28(日) 10:05:30
f
「コーディングスタイルなんて些細なことにはこだわらない」という奴に限って、 お前のコーディングスタイルはおかしいと言われると、こだわりまくってファビョる件について。
/* 正常終了のときはNULL、異常終了のときはエラーメッセージを返します。 */ char* Func() { }
このスレの勢いを見ると、ここに参加してる奴でこだわってない奴なんていないと思うが。 本当にこだわってないなら、アホらしくて書き込みすらしないはずだ。
「俺は拘ってない」と発言することで、何かが得られると勘違いしてるだけ
GNU indentをデフォルトで通したスタイルが最高。 異論は認めない。
実際何人いるんだろうね ここ
!strcmp()を理解できないバカが暴れまくってるね。 Cではboolの代わりに整数を使うとか、電波流しまくり。 ifとかwhileなんかの条件判断はboolではなくて、0か非0かを判断しているだけ。 あくまでも数値でしか判断してないの。 そこを理解できないから、頭が悪いと言われているのに。 バカの賛同者が誰もいないのがいい証拠。
_Bool
>>446 strcmp関数の仕様が「戻り値として0か非0を返す」となってたら別に問題なし
それ以外なら下らん自己満足のハックでしかないよ
>>397 strcmp(str1, str2) は文字列に対する str1 - str2 の結果を整数値で
返しているのであって真偽を返している訳ではない。
で、(str1 - str2 == 0) は (str1 == str2) であり、str1 - str2 < 0 は str1 < str2 であるから
#define StrEq(s1, s2) !strcmp(s1, s2)
なんかより
#define STRCMP(S1,EQ,S2) (strcmp((S1), (S2)) EQ 0)
として、 if( STRCMP(s1, ==, s2) ) とか if( STRCMP(s1, <, s2) とか書くほうが良い。
いずれにせよ左辺値に定数を持ってくる奴はバカ。
>>448 同意。
>>446 !strcmp() が理解できないのではなく、お前の思考回路が理解できない。
文字列 p の i 番目の要素にアクセスするときに
p[i] ではなく i[p] を使えとか言われても「バカか、こいつ」って思うだろ?
左辺に定数を絶対に書くべきだ!と主張する奴と、 左辺に定数を絶対に持ってきてはいけない!と主張する奴は、 同程度にウザい
>>409 !str.. は 整数比較の系ではないということだよ
str..がどうこういうより、 ifが0か非0要求してんだろ 0==0は戻り値を返してることに気づけよ
自分は書くときは、 if(strcmp(s,s2) == 0){} だけど、人のコード読んでいても if(!strcmp(s,s2)){} を、ぱっと頭の中で切り替えることはできる。 でも、等しくない場合の if( strcmp(str1, str2) ){} これはダメ。コーディングミスと思って読み直してしまう。 (そして意図と合っていたことが判って愕然としてしまう) #define StrEq(s1, s2) !strcmp(s1, s2) はギリギリOKだけど、 #define STRCMP(S1,EQ,S2) (strcmp((S1), (S2)) EQ 0) これはどうかと。 あまり俺様マクロを大量導入するとソースを引用するとき困るような。
こだわりまくってる奴が多すぎてワロタ
なんにも考えていない奴よりはマシだけどね。
そうやって、STRCMPなんていう糞マクロを量産すると。
どう考えても、 if (strcmp(s1, s2) == 0)とか、 if (strcmp(s1, s2) != 0)とかの方がreadabilityに優れてる。
>>456 いいや、こだわりすぎの奴と何にも考えてない奴は、同等にクズ
bool型が無いCが悪い C++なら if ( s1 == s2 )だけでいいのに
ifがbool受け取るってのが固定観念 Cのifが0か非0受け取るのは、意図してやってることだし
>>458 漏れもそう思って、そういうスタイルに戻した。
前は
if(!strcmp(s1, s2)
とか
if(!fp)
とか書いてたけど。
議論があまりにも高度すぎて眩暈がしてくる
ちょっと待て、strcmpは"0"か"正"か"負"を返すのであり、"数"を返すわけでは無い strcmpの返す値を、"0"より"大きい"のか"小さい"のか"等しい"のかで比べる以外に使用するのはナンセンスだろ また、Cの場合、intが整数型だから、返ってくる値が、整数だなんて思うのはとんでもない誤解 Cにはboolenは無く、bool値の定義は、「0以外は真である」となっている 故に、文字列が等しいのか等しくないのかを判断するのに、not演算子を使うのは妥当(数に意味が無いのであれば、boolと同じ)
議論があまりにもループし過ぎてて目が回った。
while で無限ループを表現したい場合はどう書くの? 「0か非0」ということに拘るのであれば while (-1) { } なんてのは -1 に意味がないから駄目で、 あくまで while (! 0) { } と書くべきという主張?
-1、!0どっちにしたって whileの仕様知ってなきゃ可読性も糞もねえな ifも然りだ
468 :
デフォルトの名無しさん :2007/10/28(日) 15:34:23
と、何も考えていない
>>459 は自己正当化を頑張るのでした。
どんとはらい。
-1をtrue(=非0)として扱うことは問題ないと思うのでOKかと。 もちろん逆は駄目なので、 #define TRUE -1 とか問題外だが。 個人的に無限ループは for(;;){ が好き。
>>466 ...正気か?
「0以外は真」であると定義されている
whileは、条件が真の間ループする
で、-1は真なの偽なの?
>>458 readabilityは上がるだろうけど
if (!strcmp(s1, s2))が読めるものにとっては
読みやすさは下がると思うのよ
単語全てを日本語に頑張って翻訳している技術書の翻訳本みたいな
472 :
466 :2007/10/28(日) 15:52:40
ん、最初に立場を書いておかないと誤解を招くかな。 自分は if (!strcmp(s1,s2)) で構わないと思う派。 これが不自然だという人は、while の時にどう書くのだろうと。
473 :
466 :2007/10/28(日) 15:53:54
>>449 >strcmp(str1, str2) は文字列に対する str1 - str2 の結果を整数値で
これ本当ですか?たとえば
strcmp(s1, s2) = -1 * strcmp(s2, s1)
って仕様で保証されているの?
while (1) {...}は、Cではイディオムだろ・・・
>>471 readabilityと読みやすさはどう違うんだ?
>>464 if (strcmp(s1, s2) != 0)と書くのはナンセンスで、
ret = strcmp(s1, s2);
if (ret < 0 || ret > 0) {}
と書けということだね。
>>471 あのさー、if (!strcmp())は、知らない人間でもちょっと考えれば読めるけど、
誰でもノーストレスで読めるように書きましょうっていうのが、可読性を上げましょうってことなんだけど。
480 :
466 :2007/10/28(日) 16:06:35
>>479 !strcmp(s1, s2) と
strcmp(s1, s2) == 0
で読みやすさに違いがあるってのは鈍いだけでは?
strcmp(s1, s2)
strcmp(s1, s2) != 0
これだったら上の方がノーストレスで読めたりとか。
「否定演算」の理解に 1 クロックを要する人ってだけな気がする。
ちゃんとしたコーディングスタイルでかかれてないコードって、正しく ・ぱっと見て「ヘタだなぁ」と思うコード だと思うけどね。 なんで、このスレで話す内容であっている。 コーディングスタイル以外の話がしたければ、自分でネタを振ればOK。
strcmpって意味からしてpredicateの一種だと思うんだけど、それなら if (strcmp(s1,s2)) だけで正確な動作が保証されてしかるべき
なにか有益な議論を交わしていると勘違いしている奴は 絶対誘導されないし意地でも居座り続けるの法則。
C/C++の組み込みキーワードに高い抽象性を求めても 一貫性がないだろって話
しかし、せっかく作られた向こうのスレは早くもネタ化してるしな・・・
strcmp なんて使ってるやつはバカです
2ch のスレは free できないのだから プログラマならスレ立てに慎重であってしかるべき。
ともかく晒すだけでなく突っ込んで議論(笑い)したい奴はあっちでやりなよ。
同じような処理を何度も書いてる冗長なコードは一目見て「下手だなぁ」と思うよね。 まるでこのスレのような。
スタイルにこだわる奴よりも痔地中の奴のほうがキモイな。
キモいとか言ってるやつが一番キモい
>>1 によると
禁止ネタ(超既出)
・長い関数
・深いネスト
・グローバル変数
・goto
・memset
・malloc - free
・局所ブロック
・サンプルコードのtypo
・記述スタイル
・関数・変数名
らしいよ
492は自分がキモイことを認めたのか。 偉いな。 491も自覚しろよw
現実で見た奴だと、 ・main関数しかない ・変数名がa,b,c,... だな ちなみに、zまで逝った後はaa,ab,ac,...な
難読化だね
>>496 言っとくが仕事で見たんだぜ?
半端ねぇよ
コボラーにはよくあること
>>498 まあ、だから、構造化プログラミングってのが考え出されたんだけどな...
肝心のコボラーに伝わってないんだよな...
領域の初期化で data[0]=0; data[1]=0; ・ ・ ・ data[1022]=0; data[1023]=0; ってのがあった。これは酷い、と思ったらもう1箇所初期化処理があって data[1024]=0; ・ ・ ・
それを std::fill(data, data+N, 0); とか修正すると data[238] = 4; を見落としたりするんだろうか
>>495 は自分しかメンテできないようにして仕事を確保。
>>500 は行数を稼いで売上げアップ。
を狙ったのかな?
503 :
結局 :2007/10/28(日) 17:15:20
比較での右定数には利点がない でおk?
>>503 比較での左定数にはなんの意味もないが正解
505 :
500 :2007/10/28(日) 17:23:34
>>502 作った人によると、処理の高速化を狙ったんだそうです。
>>505 それは面白い!
その人に座布団一枚やってください
>>503-504 hoge==0だろうが0==hogeだろうが大して見易さ変わらないんだから
どっちでもいいんじゃないかと思うんだが
>>507 貴様が一人でコーディングして、自分だけで使うプログラムなら、その通り好きにしたらしい。
509 :
デフォルトの名無しさん :2007/10/28(日) 17:38:00
if (strcmp(str1, str2) > 0) { hage } else if (strcmp(str1, str2) < 0) { hoge } else { huga }
>>505 次からは、その様なコードを見つけたとき、作った人を最大限に褒め称え
自分にはこの様な天才的コードを保守する自信は無いと辞退しましょう
恐らく作った本人が鼻高々で保守してくれることでしょう
そして、その様にすれば、その様な天災的コードが他のプロジェクトに出現しにくくなります
天災的コードの保守は天災的コードを書いた本人が保守するのですから...
>>500 俺ならそのコードを生成するのに使うPerlなんかのスクリプトのコードをコメントに残しておくな。
これで保守性がかなり高まる。
512 :
500 :2007/10/28(日) 17:43:03
>>510 >作った本人が鼻高々で保守
プロジェクト全体のことを考えるとそれはそれで困るw
513 :
デフォルトの名無しさん :2007/10/28(日) 17:46:24
○見やすい ○醜い・・・じゃ無かった、見難い これは主観によるものが大きいだけに、論争しても決着は付かない気がする。 例えるなら、ツートップ横のじゃんがらラーメンは美味しいか?不味いか? くらいバカげている。そんなの、好みやん! 「見やすい」「見難い」 というのでは無く、「メリット」「デメリット」 「○○防止のため」 などのような、主観に影響されない事で論争して頂きたい。
>>512 違う違う、その様な天災的コードが、無限に増殖することよりもマシだと考えるんだ
>>513 いつまで引っ張ってんだよ。
一人でやってろ、クズ
>>513 まぁ、左右定数の「見やすさ」に関しては似たり寄ったりだしな
「左に定数持ってくればコーディングミス防止になる」が最近の開発環境じゃ
意味がないって言うなら、いくら熱弁したところで好みの問題でしかない
>>513 それぞれについての、客観的なメリット・デメリットを語ってください。
だからそのメリットデメリットがないから議論自体が不毛だと言っとんじゃゴルァ いつまで定数で引っ張るじゃモルァ
じゃ、去れ
前スレで、if (a >= 0)が読めないとか言ってたやつ、よっぽど悔しかったんだろうなぁ。 お前、何レスしてんだよwww
if(!(pFilePointer=fopen(strhogehoge,"r"))){puts("ちょうおま");}みたいなのは邪道か
>>517 左定数だと=と間違えたときにどんなコンパイラでもエラーになるYO
なんで、if ((p = fopen()) != NULL) {}と書かないのかがわからない。
524 :
デフォルトの名無しさん :2007/10/28(日) 18:07:15
>>509 それ、ビミョーだね。
int cc = strcmp(str1, str2);
if (cc > 0) {
hage
} else if (cc < 0) {
hoge
} else {
huga
}
こう書けば strcmp は1回しか評価されない。
シビアな面ではパフォーマンス改善につながるかもしれない。
だが1行増える、捨て変数が1個増える。書くのメンドクサイ。
トレードオフだね。
たまたま strcmp が例だけど、副作用のある関数ならアウトかも。
ケースバイケースだね。
それ本気で言ってんの?
このスレはもう手の施しようがないかもしれない
そこで関数のメモ化ですよ
こんなのC初めて三日の知識で参加できちゃうからなぁ
>>509 がビミョーとかいう奴は、プログラマ辞めちゃってください。
記述スタイルに拘らない奴って、プログラマの資質が無いと思う。
定数の話は、あえて言うならプロジェクト内で統一しとくと読みやすくなるかもしれない そこまでする必要があるかは疑問だが
「今日はつかれてるから左に置いてみるわ」とかはかんべんして欲しい
>>524 副作用のある関数ってこういう事?
if (read(fd, buf, 80) > 0) {
通常処理
} else if (read(fd, buf, 80) < 0) {
エラー処理
} else {
クローズ処理
}
さすがにこんなマヌケなコードを書くヤツはおらんと思うが
変な悪いクセをつけないためにも、普段から
>>524 みたいな
書き方をしとくべきだろうね。
俺は定数を左に書く、とかいう困ったちゃんが一人二人いるかもしれないから、 コーディング規約があるんだよ・・・
そういや、空行は嫌いだって奴がいて、一切の空行を入れなかった奴がいたなぁ・・・
>>532 if(0==a)なんて書いて悦に入るアホが出てきたら明文化すればいいよw
うちの会社、なんとかかんとかっていう変数の頭にnだのlだのcだのつける 書き方が規約になってる Cのときはまだいいんだが、クラスが基本のJavaとかになるとどうするよって感じになる
540 :
デフォルトの名無しさん :2007/10/28(日) 18:27:41
「彼」が飽きるまで放置するもよしかまってやるもよし。好きにしれ
543 :
デフォルトの名無しさん :2007/10/28(日) 18:29:12
>>538 java には java の規約がありますよ。
C には C の規約。
なになに? 次は版画利案の是非をやりたいの?
lplplplpszMachineName(笑
>>543 うちもある
だが、何を考えたのかなんとかかんとかをJavaでも使えと書いてある
if (...) { ・・・ } else { ; }
このスレの人がvoid main()を見たら発狂したりするんだろうか
sizeof(variable)とかreturn (code)とかも好きそうだ。
551 :
478 :2007/10/28(日) 18:38:26
コンパイルエラーで誤代入を阻止できると言うが C/C++系以外で、誤代入が問題になることってあるの? BASICやPASCALでは誤代入にならないよね? 左辺に定数を置く人って、BASICやPASCALでも左辺に定数を置くの? 仮に、BASICやPASCALで左辺に定数を置くとして、それには、何か意味があるの?
見やすい
だから何?
左定数 VS 右定数って、喫煙 VS 嫌煙くらい不毛な気がする
右も左も定数にすれば丸く収まるんじゃね?
if(a==定数 && 定数==a)
ケースバイケースで見やすい方にすりゃいいだろ、が普通の人の考え × 左定数 VS 右定数 ○ 定数位置固定派 VS 臨機応変派
×普通の人 ○ドシロート
>>561 左定数アレルギーでも持ってるのか、お前は
このスレ見返したら
>>1 から延々と定数バトルやってて笑った
なんだよ、これ。読めねーよwww
不等号の時は if (0 <= a && a <= 10) って書く
malloc-freeのほうが面白いな。
>>566 俺もそう書く
高校の頃の数学の癖がそのまま残ってる
ここまでで得られた有益な情報・・・0
有益な情報を得ることを期待してこのスレを開くってのは そもそも情報の探し方がヘタだなぁ
ここは専門学校生が暇を潰すスレです
定数の話題を振ってる奴はこのスレをつぶしたいに違いない
ごめん修士持ってるけど暇潰してるや。 てかネトゲしながら画面半分でこのスレ開いてるんだぜ。我ながら時間無駄すぎ
何重にもキモい
>>468 自己正当化に必死なのは、あきらかにお前だろw
>>508 貴様が一人でコーディングして、自分だけで使うプログラムじゃないなら、
そんな瑣末なことに文句を付けるな。協調性のかけらもないクズ
論理破綻
こいつらの各コードがウマイわけがない
臨機応変に考えられない頭の固い奴が、よくプログラミングなんかできるなぁ。 「定数は絶対左じゃなきゃダメだ!」とか、潔癖症すぎんだろ。
段々アホが絞られてきたな
間違えた。ここで喚いているバカは、定数右派だった。 「定数は絶対右じゃなきゃダメだ!」
俺は取り敢えずVB6の括弧なしスタイルが気に入らない
滑稽を通り越して、痛い領域にまで達したようです。
このスレの1からじゃなくて、前スレの後半からずーっとこうだぞ。 バカってすぐ必死になるから性質が悪いよね。 このスレで得られた情報…0 無駄にした時間…priceless
うむ、定数は絶対に右とか言い出す奴だから、痛いのはしょうがない
ほうほう、if (a >= 0)を語順に読み下せない奴が修士持ってて、ネトゲしながら暇つぶしで2chをやってると。 で、そいつの会社は技術力が高くて、仕事がどんどん来ると。
このスレを「絶対」で検索すると面白いよ。 被害妄想強すぎー。
if (a >= 0) if (0 < a) どっちも書きうるな。 どっちかしか認めないとか言われたら、「アホかお前」って普通に言っちゃいそう
そんなこと誰も言ってないのに。 被害妄想強すぎー。
被害妄想で検索すると、一番被害妄想の強いバカが炙り出されるよ
お前らは 「馬〜鹿、ア〜ホ!」 「馬鹿って言った方が馬鹿なんですぅ〜!」 とか言い合ってる消防か
ぱっと見てヘタだなぁと思うコードスレは小学生の集う社交場ですから
>>552 =を:=と間違える人はいないんじゃないかな?
それでも左定数にするけど。
理由は「右定数には利点がない」。
不等号は臨機応変だね。
あれ? 587が前スレの815で、if (a >= 0)が読めないからif (0 <= a)が優れているって主張している奴だよね?
>>595 , -''":::::::::::::::::::::::`` ‐ 、' :,
,:/:::::::::::::;;;;;: -――‐- :;;;;;;`ヽ、
,:'/:::::::::::::::::/u , , ``-;ヽ
,:':/:::::::::::::::::/ '⌒`ー‐'| | |`ー-‐、u|::| なんで僕が小学生だと分かった…
,:'/:::::::::::::::::/u /⌒ヽ /⌒ヽ !::! ;
,' l--、:::::::/ l O | lj | O | '、l ,:
/´,―、ヽ:/ ヽ、,r‐'-、:::::::::ゝ--く l ;
.;'/ /ニ_ノ | ..::::::::{ r,、 ヽ / ,r-, ノ::.. '、;
; | l '-, / ヽ !},. ---'し'_,ヘ :..ヽ':,
':,! `‐' u ヽ ,. -'"´_,. ----,、 ヽ、u l ;
':,ヽ_ノ u ノ'" ,. -''" ̄ ̄ ̄ ヽ. ヽ |
.,: | lj / /_,. ---、,. -----、| | / ;.,
--―'ヽ / '-------―――‐''" ノ /``ー- 、_
599 :
デフォルトの名無しさん :2007/10/28(日) 19:49:57
すべては、多分このへんから始まった・・・
ぱっと見て「ヘタだなぁ」と思うコード その5
http://pc11.2ch.net/test/read.cgi/tech/1155315371/ 661 名前:デフォルトの名無しさん[sage] 投稿日:2007/10/21(日) 12:55:31
定数を左辺に持ってくる比較文を見るとイラッとするな。
あと、java限定だけど、"".equals(str)とか見たときだな。
685 名前:デフォルトの名無しさん[sage] 投稿日:2007/10/21(日) 23:01:40
if ("・・・".equals(str))の方が分かりやすいって人は、
if (str == null) よりも、if (null == str)の方が分かりやすいのかな。
713 名前:デフォルトの名無しさん[sage] 投稿日:2007/10/22(月) 16:00:31
だけどさ、
if( ! hogehoge_func() ){}
とは、みんな書くんだろ?
if( hogehoge_func() ! ){}
とは書けないもんな、これは文法エラーだし。
だったら、
if( NULL != hogehoge_func() ){}
でも良いんじゃね? ってならない?
右定数or左定数に拘ってる奴だけに質問。 左定数or右定数を見たら、他に理由が無くても直す? これでyesと答えたら阿呆確定だな。
601 :
デフォルトの名無しさん :2007/10/28(日) 20:04:59
左定数でコード書くやつ結構いて、もう見慣れたということもあるので、 あんまり違和感はないなぁ。自分でコード書くときは、右定数で書くけど。 strcmpも自分では、strcmp()==0と書くけど、!strcmpももうなれた。 だが、 if (MicrosoftFunctionDoSomething(dwParameterForSomething, pbBufferPointerToSomething,.............................) { dwParameterForSomething =... ってやつは、いつまでもなれることが出来ない。
602 :
右派 :2007/10/28(日) 20:05:24
>>600 わざわざ直したりはせんな。
なんで小便もらしたヤツの小便を俺が掃除せにゃいかんの?って感じ。
でも見ていて不愉快。
>>600 動作実績があるコードを自分の好みで書き換え、
蟲が入り込む余地をつくるようでは
プログラマ失格だろう。
左定数の利点としてもう一点
書き手は代入する意思がないということが明確
604 :
デフォルトの名無しさん :2007/10/28(日) 20:12:45
>>603 まだ言うか。その理屈はとっくに論破されとる!
論破も何も事実だろう
ってループしてたか・・・orz
607 :
デフォルトの名無しさん :2007/10/28(日) 20:25:33
>書き手は代入する意思がないということが明確 というのが仮に正しいとしても、こんな小さな理由で 多くの人の慣用的な書き方と反して、自分のスタイル を押し通すというのは、無茶なんじゃないかな。 多くの人が読みやすいと思うようなコードって、多くの人が 慣用的に使うロジックをちゃんと使っているコードだと思うのよね。 全然違う例だけど、ふつう次のように書くところを for (p = top; p != NULL; p = p->next){ } 次のように書くと、 p = top; while (p) { /*...*/ p = p->next; } 「ん?何かこうした理由があるのかな?」と読み手に余計な苦労を強いる。
IF分の中で代入ってどうよ?
「ふつう」と書く奴にろくな奴がいないの法則を補強するだけのレスだったな。
610 :
デフォルトの名無しさん :2007/10/28(日) 20:29:30
ループスレ! ループスレ! ループスレ!
611 :
デフォルトの名無しさん :2007/10/28(日) 20:30:55
>>609 そう思うとしたら、あなたの経験が足りないからだと思うぞ。
処理速度を重視するとグローバル変数だらけになる 見辛くてしょうがない
>>599 "".equals(str)はOKだろ。
str!=null && str.equals("")は面倒くさい。
このペースだと、明日中にはスレを使い切るなw
>>607 「思う」ではダメだ。
右定数が優れているという確実な根拠が欲しい。
for (p = top; p != NULL; p = p->next)
for (p = top; NULL != p; p = p->next)
大して変わらん。
だから好みの問題じゃないのか
左定数は利点が提示されているでそ
618 :
デフォルトの名無しさん :2007/10/28(日) 20:42:34
縦書きの日本語の文章をインクで手が汚れないから合理的だと 左から書いていく奴は一般的に基地外と呼ばれます。
>>618 まるで関係のない例を無理やり定数の話に結び付けようとしてるお前が基地外だろ
620 :
デフォルトの名無しさん :2007/10/28(日) 20:46:53
>>615 for (p = top; p != NULL; p = p->next)
for (p = top; NULL != p; p = p->next)
こうして見比べると、良い・悪いは別として、右定数の方が美しいよねぇ。
621 :
デフォルトの名無しさん :2007/10/28(日) 20:46:55
>>618 それは読み手が巻物を右手で巻きながら読むからだろ。
コードも読み手のことを考えて書かないと。
626 :
デフォルトの名無しさん :2007/10/28(日) 20:50:10
なんか美しいとかstrict htmlスレみたいになってきたな
左定数は利点があるが、その利点は無いに等しいというのは論破済み。 しかし客観的に見て左定数に弊害があるわけでもないのだから、 好きにすれば良い。 どちらかに拘る奴が基地外だろう。 なァ、>617,618
プロジェクト内でわざわざ多数派の逆を行く奴がいると こいつはアホなのか経験が足りないのか珍論振りまくオナニー野郎なのか 判断に迷って不安に陥るのでやめてください。
630 :
615 :2007/10/28(日) 20:54:11
欲求不満ですw
>>629 普通、既存のソースを修正するときは既にある書き方に倣うだろ
そこで自己主張する奴は、たとえ元の書き方より良かったとしても阿呆
ソースが非常に読みづらくなる
第三者が読む可能性のあるソースコードでなおかつ業務において 基地外なことをするつもりがない。 ということであればもう特に何も言わないよ。 匿名掲示板で好きなだけ吠えていてくれればよい。
>>607 その例はたしかに下だと気持ち悪いね。
上だと「ああリストを処理していくんだな」というのがすぐわかる。
左辺に定数を置く奴の、箸の使い方は相当下手だろうね 豆をつかめって言っても豆刺してそう...
所詮、両方ともが変数だったらどうしようもないんだから 片側が定数の時だけ特別ルールで拘るのも面倒
>634 そーいうお前は、海外、特に欧米でも同じ事言って 白い目で見られたりする奴なんだろうなァ。
638 :
デフォルトの名無しさん :2007/10/28(日) 21:42:43
>>615 そこまでこだわるんだったら、せめてマクロで隠蔽するほうがいい。
#define list_for_each(top, entry) \
for (entry = top; NULL != entry; entry = entry->next)
list_for_each(top, p) {
/*...*.
}
今度はマクロの可読性ネタですか?!
ぱっと見て「ヘタだなぁ」と思うコードの例
>>638
>>638 みたいなマクロ使うのはマジでやめて欲しい
左定数と右定数が混ざってるほうがまだマシ
#define unless(exp) if(!(exp)) #define loop for(;;)
GNUのhello.cはひでぇよなぁ
#define begin_block do #define end_block while ( 0 ) #define exit_block break
おいおい、一体何が起きてるんだよ。 と、1を見ながらレスしてみる。
#define pf printf #define gs gets #define i int #define c char #define l long
650 :
638 :2007/10/28(日) 22:01:09
意外なコメントだらけでワロタw
>>607 前者でも後者でも違和感無いけど。
後者が特に劣っているとも感じない。
Cしか使ったことないんじゃないかな? forだとcontinue使えて「便利」くらいしか差がないと思うが。
653 :
デフォルトの名無しさん :2007/10/28(日) 22:42:32
>>638 これはひどい。
祭りの予感・・・
つか、明日は月曜日だぞ。また徹夜させる気かよ。かんべんしてくれ!
654 :
デフォルトの名無しさん :2007/10/28(日) 23:00:08
>>653 653の理論だと、C++のSTLもひどいし、BSDやらLinuxの
カーネルのソースコードもひどいことになるぞ。
右定数が良くないと言ってるやつは右に定数を書くと 下記のようにミスってもコンパイルが通って発覚が遅れるのを防止するためだろ。 if ( a = NULL ) 左定数派ならば、ミスって下記のように書いてもコンパイル通らないからな。 if ( NULL = a ) まぁそんなのミスしなければいいだけで 俺は普通に右に定数を書くけどな
なにこの痴呆症患者の集うスレ・・・
もうコピペにしか見えないぞそれw
慣れていくにしたがって、変な書き方だと思っていたものが馴染んでくることもある こんなのとか array[index++]=value; // 今はこの書き方で無いとバグをだしそうで怖い while((chr=getchar())!=EOF){ ... } // 自然にこうしてしまう
660 :
デフォルトの名無しさん :2007/10/28(日) 23:32:34
>>659 せまい自分の中の範囲だけで判断せずに、もうちょっと
勉強をしていったほうがいいんじゃない。
638はスレを加速させるための燃料だろ? まさか本気で言っている訳がないじゃないか。
だが逆に失速したようだ
強烈なかまってちゃんが居たみたいだな。 どんだけ愛に飢えてんだよ
それは結果論ってことで。
やっぱり
>>80 みたいな神が現れないとダメだな。
正直、右左ごときどっちでもいいだろ…… コードの一行にこだわる瑣末な事でプログラム書けるのか?
適当に考えもなしにコードを書いている人には分からない次元の話だよな。
>667みたいな奴が権力握ると、どうでもいいルールを押し付けて生産性落とす。 要するにコボラーと同レベル。
必要なルールと余計なルールの区別がつかないって悲しいことだな。 ま、チーム開発をしたことが無いなら、気が付かなくても仕方ないか。
670 :
デフォルトの名無しさん :2007/10/29(月) 02:47:14
C++のSTLがひどいはずは無い。 BSDやらLinuxのカーネルのソースコードがひどいはずは無い。 社会保険庁の年金記録管理がひどいはずは無い。 TBSの番組がひどいはずは無い。 全国に30万人も会員がいるNOVAの経営がひどいはずが無い!
basic_stringは酷いと思う
672 :
デフォルトの名無しさん :2007/10/29(月) 03:14:24
>>370 まぁ、お前が書くコードよりはヒドクハナイダロ。
これまでの軌跡 左辺に定数を置くのが嫌なのは、Cの変数宣言方法がおかしいからだろう FORTRANでの変数宣言方法もCと同じものだ 以降その話題には触れず strcmpをnot演算子で等しいと言うif文を書く奴に言われたくない strcmpが返す値は整数だから論理値として扱うのはおかしいだろう! いいえ、strcmpが返す値は整数ではなく符号です 数に意味はないので、論理値として扱っても問題はありません 以降その話題には触れず そもそも自分の勉強不足を棚に上げ、ありもしない左辺定数の利点をさも至上のコーディングの様に持ち上げる その様なおもちゃみたいな奴が居るのだから、いじり回したくもなるのが人情
目視だとしても 変数 = NULL のバグを見つけるのと NULL == 変数のスタイルを守っているかをチェックする労力って少なくとも同等だと思われ
>>464 >ちょっと待て、strcmpは"0"か"正"か"負"を返すのであり、"数"を返すわけでは無い
>strcmpの返す値を、"0"より"大きい"のか"小さい"のか"等しい"のかで比べる以外に使用するのはナンセンスだろ
いいえ、しっかりと「数を返す」と定義してあります。
>Cにはboolenは無く、bool値の定義は、「0以外は真である」となっている
C言語は機能面で整数でbooleanを代用しているだけであって、
意味の上での整数とbooleanの区別はあります。
実際、isdigit の戻り値は、「真偽」と定義してあり、
一方で、strcmp の戻り値は、「数」と定義してあります。
>>466 無限ループの時は、while(1)ではなく、for( ; ; ) とした方が綺麗。
わかったからさっさとハロワに池
>左辺に定数を置くのが嫌なのは、Cの変数宣言方法がおかしいからだろう >FORTRANでの変数宣言方法もCと同じものだ >以降その話題には触れず 逆です。Cの変数宣言方法がおかしいから、 C言語では定数を左に書いても変ではない、という余地を残してしまったわけです。 もし、C言語が、i int;、main() int; という宣言のしかたをするのなら、 条件式の定数を左に書く人は居なかったでしょう。 ------------------------------------ i int; /* i は int */ p == NULL /* p が NULL */ ------------------------------------ int i; /* int な i */ NULL == p /* NULL な p */ ------------------------------------
>>673 >strcmpが返す値は整数ではなく符号です
数を返すと定義してあります。
int strcmp(const char *cs, const char *ct) は、
文字列 cs と 文字列 ct を比較する. cs > ct なら 0より大きい数,
cs < ct なら 0未満の数, 等しければ 0 を返す.
673は、スレの流れも分かって無いのに、適当なこと言って煽らないようにね。
>strcmpが返す値は整数ではなく符号です >strcmpが返す値は整数ではなく符号です >strcmpが返す値は整数ではなく符号です やっぱりこのレベルの人が頑張っていたんだね
大体、符号を返すったって、符号だけどうやって返すんだよって。
>>674 > 目視だとしても
> 変数 = NULL のバグを見つけるのと
> NULL == 変数のスタイルを守っているかをチェックする労力って少なくとも同等だと思われ
後者はわざわざあとから書き直さないでしょ。
あと「変数 == NULL」と信じてる目で「変数 = NULL」を見ると見過ごす確率大。
>strcmpが返す値は整数ではなく符号です もしそうなら、なおさら !strcmp(str1, str2) とはかけないね。 だって、! は符号を調べる演算子じゃないからね。
随分と必死だな、これw
それから、 while(1) と書いたときの「1」は、整数でbooleanを代用している。 一方、strcmp の戻り値は、意味の上でも整数で、 整数でbooleanを代用している、というわけではない。
>>682 あのさー、だからそれはコンパイラが教えてくれるんだって・・・
>>686 コンパイラも完璧じゃないじゃん
Cのシンタックス的に何も問題ないんだから
688 :
デフォルトの名無しさん :2007/10/29(月) 11:01:01
昼夜曜日を問わず熱い論戦が続いております
お前らめぐまれてるなー 俺なんかマイナーCPUで屑コンパイラしかなくて、警告がしょぼい上に方言バリバリな環境に 何年も泣かされてきたんだぞ つД`)
なんという低レベルな言い争いなんだ…
新レスチェックして百以上レスついてるの見る度に噴く
ヒマだなぁ
!strcmp(str1, str2) と書く奴は、もし、その書き方で整合性を取りたいなら、 int32_t ret = (int32_t)strcmp(str1, str2); if( !ret ){} /* str1 == str2 */ if( ret && !(ret&-0x80000000) ){} /* str1 > str2 */ if( ret&-0x80000000 ){} /* str1 < str2 */ if( ret ){} /* str1 != str2 */ if( !(ret&-0x80000000) ){} /* str1 >= str2 */ if( !ret || ret&-0x80000000 ){} /* str1 <= str2 */ と書かなきゃしょうがないよな。 やってらんねー。
ヒマだなぁ
ヒマならハローワークにでも行けよ
10 print "ヴァカ" 20 goto 10 30 end
strcmpが本当に"整数"を返すのであれば c = c + strcmp(str1, str2); がどの様な動作をするのか答えられると思うのだがどうだろうか?
>>699 それに答えるのは簡単だ。
Cに、strcmp()の結果が足されるとだけ言えばいい。
或いは、str1がstr2より大きければCの値は元の値より増え、str1がstr2より小さければ減り、そうでなければ変わらないと言ってもいい。
>>699 c += strcmp(str1, str2);
と書くのが望ましい。
>>700 答えになっていない
その様な曖昧な答えでは、どの様な動作をしているのか判らない
cの値は、元の値からどれだけ増えるのか?
cの値は、元の値からどれだけ減るのか?
あなたの言う動作ではっきり判っている動作は、str1とstr2が等しければcが変わらないと言うことだけだ
strcmpが返す値は"整数"だと主張するのであるから、増えるときは何れだけ増え、減るときは何れだけ減るとハッキリと言えるはずだが
>>702 「整数なら言える筈」と言う根拠を提示してください。
>>704 返すのは符号だと述べられているのに、"整数"が戻り値であると主張するのだから、
その戻り値の数字に意味があると主張しているのだろ?
なら、そのハッキリとした根拠の上に、cの値が具体的に何れだけ変化するのか述べることが出来て当然だと思うが
>>705 いいえ、私は整数が戻り値であると言う主張を過去未来に渡って一切行なっていませんし行なう積もりもありません。
# 勿論、符号であると言う主張に着いても同様です。
尚、整数であるからには数字に意味がある(べきだ)という短絡についても許容できないと考えます。
従って、>699に対する回答とstrcmp()の戻り値が整数かどうかについてはその点での議論は無意味だと思います。
そもそも c += strcmp(str1, str2); この関数はこんな使い方を意図していない
>>706 >>675 ???
数と言ったから、整数ではない?
符号を返すと言ったわけでもない?
0より大きな数?0より小さな数?それは、符号と言うのだと思うが?
strcmp(str1, str2)は、等しければ"0"を、str1がstr2よりも大きければ正の数値を、str1がstr2よりも小さければ負の数値を返す関数だ
で、その返ってきた数値に、どんな意味があるのか?
数値には意味はなく、正か負か"0"と言う符号の状態に意味があるんじないのか?
仮にあなたが、整数を返すと言う主張をしていないなら、
>>699 に対し回答すべきではない
そして、
>>702 で突っ込まれたからと言って、
>>706 の様な回答をすべきではない(あなたの頭が悪いようにしか見えない)
>>708 いいえ、私は>675でもありません。
私の主張したい点は、>699のような設問が無意味だと言うことだけです。
うぜー。 man strcmp >返り値 >strcmp() 関数と strncmp() 関数は整数を返す。この整数は、ゼロよりも、 >1)小さい、2)等しい、3)大きいのいずれかである。それぞれは、s1(または、 >この文字列の最初の n バイト)が s2 よりも、1)小さい、2)等しい、3)大きい >に対応している。
>>708 そもそも符号に0を表わす状態は存在しないわけだが。
>>705 符号だけどうやって返すの?
頭おかしいの?
Cに符号型なんて無いよ。
0を除いて絶対値に意味はないだろ
日本人じゃないんじゃないの
>strcmp(str1, str2)は、等しければ"0"を、str1がstr2よりも大きければ正の数値を、 >str1がstr2よりも小さければ負の数値を返す関数だ ちがいます。 int strcmp(const char *cs, const char *ct) は、 文字列 cs と 文字列 ct を比較する. cs > ct なら 0より大きい数, cs < ct なら 0未満の数, 等しければ 0 を返す. と定義されています。 「正の数値」や「負の数値」という言葉は使われていませんし、 「等しい時は偽を返す」とも書かれていません。
>>712 だから、整数で返すんだろ
数には意味はなく、正か負か0かに意味があるんだろ
ゼロよりも大きい整数のことを、普通、正の数値と言うんだが
爆釣ですな
>>715 C言語に於いて、「0以外は真」つまり、「0は偽」だろ?
Cにおいて、符号を調べる場合は、 「>0, <0, >=0, <=0, ==0, !=0」を使うのですが。 「!」を使っても符号を調べることは出来ません。 それから、定義に「数」を返すと書いてある以上、strcmpの戻り値は数です。 文字列を比較した結果を整数値で返す、というだけです。 出かけるので、次返事できるのは夜中の2時です。じゃ。
if (0 == a)の奴もそうだけど、strcmpの奴も同じプロジェクトにいたらと思うとぞっとする。
個人的には0==だけど等値判定だけなら!でもかまわんだろ
>>722 別にどのように書こうが、それは全くあなたの自由。
うざいのは、このスレに粘着してる奴。
if (strcmp() == 0)と、if (!strcmp())が同値であることを、万人が迷うことなく即答できるならよいが、 そうでは無い人がいることを考えると、前者の方が良いと考える。 if (0 == a)の場合と違って、!strcmp()には、タイプ数を減らすこと以外のメリットが見当たらない。
if (strcmp() == 0)が即座に理解できて、if (!strcmp())の理解に少し迷うレベル 且つC/C++の開発を問題なく行えるレベルの人間って、多分ほとんどいない
いるだろ
別にif (!strcmp())って書いてもいいけどさ、それが唯一至高の書き方だとか言われるとうざい
strcmpはゼロと比較して使う。 であるから、右辺にしろ左辺にしろ、 等号不等号の向こう側にはゼロを置いておきたい。 という理由で !strcmpとするよりは、 おなじみの方法でゼロと比較したい。
ぱっと見て「ヘタだなぁ」と思う議論をしているスレはここですか?
>>725 他言語でも、if (!strcmp())と同等の書き方をするのか?
どんな言語でも、if (strcmp() == 0)と同等の書き方をすれば、誰もが迷わない。
>>730 そもそも他の言語で文字列を比べるのに関数を使うなんて有り得ない
>>730 他の言語では、文字列の同等性を返す関数ないし演算子があるから、
順序を調べて0と比較するようなことはしない。
だめだこりゃ
ニートが、ただ単にC FAQに載ってることを蒸し返して暇つぶししてるだけだから、 相手にしても意味無いよ。
>>699 ISO/IEC 9899 7.21.4.4
おもったより !strcmp 多いなw
定数を左辺に置くより、そもそも定数と比べないようにする方が意味があると考える人が多いんだろうね
単に短く書けるからだろ。ばかじゃね?
ヒマだなぁ
ifやwhileの条件部分に論理演算の結果を渡さなきゃ気がすまない奴はヘタクソ。 そういう手合いに限って #define BEGIN { #defien END } みたいな事をやりたがるんだよな。 結局他の言語がベースにあるからCで物を考えるということが出来ないだけなんだよ。 郷に入っては郷に従えと。
新たなアホ登場か?
さぁ? そう思うなら具体的に指摘を
744 :
デフォルトの名無しさん :2007/10/29(月) 17:49:07
strcmp(a, b) && strcpy(a, b) || strcpy(b, ""); くらい書けないと一人前とはいえないな。
ここ一年以内にCを始めて、C FAQとか藤原のページとかを見つけて、誰かと話したくて たまらん奴と見た。 しかもニート。
if (!strcmp(s1, s2) {} Q1: {}に入るのはどのような時ですか? Q2: 何故そうなるのか説明しなさい。 という問題を出せば、Cの理解度を測る材料にはなるな。
ネタがないのに煽る奴 興を殺ぐからROMってろよ
>>747 A1.入ることは無い
A2.括弧が1つ足りないから
とか言うと怒るよね?
>>747 ある程度も何も…。
strcmpの動作を知っているか否か、
という部分が強調されるだけで、
それでCの理解度を計るには心もとない肝。
理解度つったらやっぱポインタ、配列、
ポインタ演算、メモリ関係の関数とかじゃね?
752 :
747 :2007/10/29(月) 18:14:46
思った通り爆釣。 どんだけリロードしてんだよw
>>750 >
>>747 ある程度も何も…。
> strcmpの動作を知っているか否か、
> という部分が強調されるだけで、
> それでCの理解度を計るには心もとない肝。
rakudai
うわぁ・・・
┌─┐ |も.| |う | │来│ │ね│ │え .| │よ .| バカ ゴルァ │ !!.│ └─┤ プンプン ヽ(`Д´)ノ ヽ(`Д´)ノ (`Д´)ノ ( `Д) | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U 〜 〜  ̄◎ ̄ . ̄◎ ̄  ̄◎ ̄ ◎−>┘◎
756 :
747 :2007/10/29(月) 18:20:41
>>752 お前誰だよ・・・
if (!strcmp(s1, s2)) {}のtypoだった。
Cの理解度を測るテストの問題くらいにはなるな、という意味。
このスレは、隔離スレに認定されました。
>>700 strcmpが幾つを返すか決まっていない以上、
足してオーバーフローなんかしたら鼻から悪魔だぞ
あと、strcmpが整数を返して、
その整数に対して!を使ってはいけないと主張する根拠を聞きたいな
759 :
デフォルトの名無しさん :2007/10/29(月) 18:38:28
>あと、strcmpが整数を返して、 >その整数に対して!を使ってはいけないと主張する根拠を聞きたいな !0, !5が何を返すかよくわからない派遣グラマの脳の負担を低減させることが出来るのは 大きなアドバンテージだ。
慣用句を許容できないようではCを使うべきではないな
762 :
デフォルトの名無しさん :2007/10/29(月) 19:42:30
∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | J
/ ∩ノ ⊃ ヽ
>>80 ( \ / _ノ | |
.\ “ /__| |
\ /___ /
C言語的には!x と x==0 は等価であるといえども、 "not"に変換して読んだとき、素直に意味が通ってほしいものだ。 !strcmp(x,y)で、意図としてはx==yとか言われると、アレ?ってなっちゃうから。
764 :
デフォルトの名無しさん :2007/10/29(月) 19:44:19
if (x == y) printf("糞"); if (! (x-y)) printf("尿");
Cにはbool型が無いから整数で代用しているって主張しているくせに、 符号型が無いから整数で代用しているって言う主張は認めないのね。 ダブルスタンダードですな。
うん
768 :
デフォルトの名無しさん :2007/10/29(月) 20:49:04
こ
769 :
デフォルトの名無しさん :2007/10/29(月) 21:08:34
まん
ざい
KENT-WEBのスクリプト、今見るとひでぇなwwww ほとんど成長しないよな中の人。
なんでif(a)じゃいかんのかね?Cはようわからんよな
773 :
デフォルトの名無しさん :2007/10/29(月) 21:29:19
モジュールも使えないようなプロパイダのクソCGIサーバでも動くように コーディングしてあるんだよ。そういうのはヘタとは言わない。
性文法主義者は総じてアホ なぜそのようなコードが書かれているのか分析することさえできない
776 :
デフォルトの名無しさん :2007/10/29(月) 21:47:54
まだやってたのかw
strcmp でここまで遊べるおまえらは死んだほうがいい
780 :
デフォルトの名無しさん :2007/10/29(月) 21:52:35
KENT-WEBって、なんのことかと思ったら。フリーでソースコードまで 公開してくれるCGIのサンプル集じゃない。ちらと中のぞいてみたが、 委託して納入されたものだとしても、別に不満はないな。 あえて言うなら、細かい好みのレベルかもしれんが: -設定変数は、ファイルを別に分けて欲しい -設定変数は、それとわかるように大文字にするなりしてほしい -Perlでありがちなのだが、main処理がダラダラと長くて疲れる くらいか?
>>724 >if (0 == a)の場合と違って、!strcmp()には、タイプ数を減らすこと以外のメリットが見当たらない。
if(strcmp(s1, s2)<0){ // ・・・条件(1)
hoge;
}else if(strcmp(s1, s2)>0){ // ・・・条件(2)
fuga;
}else{ // [!strcmp(s1, s2) == 0] ・・・条件(3)
hage;
}
と書いていたひとが、たまたま条件(1)と(2)で同じ処理をしたいと思って
if(strcmp(s1, s2)){
hogefuga;
}else{
hage;
}
と書き換えるとする
その後、hogehage と hage で逆の処理をしたいと思ったら
if(!strcmp(s1, s2)){
hogefuga;
}else{
hage;
}
こう書くだろ?
すみません 初心者なのですが int a = strcmp(str1, str2); int b = strcmp(str1, str3); で a > b の場合は str1 は str2 より str3 に近いということでしょうか?
783 :
デフォルトの名無しさん :2007/10/29(月) 22:00:56
if (strcmp(str1, str2) > 0) { hage } else if (strcmp(str1, str2) < 0) { hoge } else { huga }
>>781 ものすごく限定されたシチュエーションだなw
>>785 a = 3
b = -5
のときもあるぞ
787 :
デフォルトの名無しさん :2007/10/29(月) 22:04:49
>>782 なぜそういう風に思ったのか、ちゃんと書いてごらん。
自分の考えをキチンと整理すれば、正しいか間違っているか
おのずと答えが出るもんだよ。
>>782 strcmpの返値にそういう意味はありません
>>781 >}else{ // [!strcmp(s1, s2) == 0] ・・・条件(3)
ちょっw おまwww
>>791 qsort に strcmp 渡すとまずい?
Cでもオールマンスタイルの俺はコメントでこう書くこともある } else //if(!strcmp(s1, s2) == 0) {
796 :
デフォルトの名無しさん :2007/10/29(月) 22:12:19
>792
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa13.html Q 【qsort】
str_arrayは文字列へのポインタが100個格納された配列である。
次のコードはなぜうまく動作しないのか。
char *str[];
qsort(str_array, 100, sizeof(char *), strcmp);
A
qsortは、指定する比較関数に対して、比較されるオブジェクト
を指すポインタを使った呼び出しを行います。言い換えると、呼び出された比較
関数は、与えられた引数aとbに対して、
*aと*bを比較する仕様になっている必要があります。
strcmpはこの仕様を満たしていないので、そのまま
qsortの引数として用いることができません。
次のような関数を定義して、その中から
strcmpを呼び出せば解決します。
int pstrcmp(const void *p1, const void *p2)
{
return strcmp(*(char *const *) p1, *(char *const *) p2);
}
...
qsort(str_array, 100, sizeof(char *), pstrcmp);
...
(参考: comp.lang.c FAQ 13.8)
ところでおまえらなんで strncmp 使わないの?
798 :
デフォルトの名無しさん :2007/10/29(月) 22:15:42
> }else{ // [!strcmp(s1, s2) == 0] ・・・条件(3) これはヒドイ。まだ本人は気づいてないのかw こうだろ。 }else{ // [!strcmp(s1, s2)] ・・・条件(3) あるいは、こうかな。 }else{ // [strcmp(s1, s2) == 0] ・・・条件(3)
>>798 論理的に正しくて且つ分かりやすくて誤解を招かない書き方は
if(!strcmp(str1, str2) != 0){
でFA?
>>781 if(strcmp(s1, s2)==0){
を
if(strcmp(s1, s2)!=0){
に書き換えるのと大して変わらんと思うが
今時strcpy, strcmp等の関数をそのまま使う奴はヘタクソ。 strcpy_sやstrlcpyなどのセキュアな関数使えよ。
804 :
デフォルトの名無しさん :2007/10/29(月) 22:25:03
>>801 いや、こっちだろ
if(!strcmp(str1, str2) == !0){
分かるけど分かりやすいかは疑問
806 :
デフォルトの名無しさん :2007/10/29(月) 22:34:08
>>803 strcmp のセキュアな関数も教えてください。
>>473 >>476 定義されている
strcmp(s1, s2) == -strcmp(s2, s1)
これは常に真
manpageすら読まない奴がいることに驚愕
>>803 どんな環境だかわからないのに、そんなこと言えるのか?
810 :
782 :2007/10/29(月) 22:49:49
ご回答頂いたみなさんありがとうございます でも結論がいっぱいあるみたいでよくわかりません ><
811 :
デフォルトの名無しさん :2007/10/29(月) 22:52:09
>>807 s1 と s2 で文字列長が違う場合は?
strcmp は符号しか返さないよ
気違いの振りを装い続けるつもりになっている奴は既に気違い
816 :
デフォルトの名無しさん :2007/10/29(月) 23:07:01
>>810 あれれ・・・まだ分かってなかったのか。
じゃぁ、高卒のオレがレクチャーしちゃる。
int a = strcmp(str1, str2);
int b = strcmp(str1, str3);
は、文字コードの引き算を返しているだけなので、
数学的に言うと下記の式で表せる。
a = S1 - S2
b = S1 - S3
で a > b は、下式に置き換える事ができる。
S1 - S2 > S1 - S3
ここで仮に、S1 = 65、S2 = 66、S3 = 67 だとする(単なる例だよ)
65 - 66 > 65 - 67
が成り立つ。
「str1 は str2 より str3 に近いということでしょうか?」 ・・・に当てはめてみる。
「65 は 66 より 67 に近いということでしょうか?」
違うよな?
817 :
デフォルトの名無しさん :2007/10/29(月) 23:07:40
そもそもstr系なんて自分用のツールくらいにしか使わなくね? NULしゅうたんされていない可能性が常に付きまとうし。 せめてmemけいじゃね。
>>810 aとbの大小関係を求めても意味は無い
aやbは単独で意味をなす
820 :
817 :2007/10/29(月) 23:31:15
>>816 すみません
|a| > |b|
のつもりで書きました
それでもだめですか? ><
ぱっと見て下手だなぁと思う人生のすり減らし方
ファイルが開かれていれば0以外の値を返すisOpen()という関数があったとする。 (0以外の値はファイルポインタかもタイムスタンプかも1かもはさておきとして) ファイルが開かれているかの判定は下を使うのがやはり正しいと思われる。 if(isOpen() != 0) if(isOpen()) つまりstrcmpの関数名または戻り値の仕様がヘタってことでいいのではないか。 で、これをマクロで隠蔽するかしないかはまた別の話ということで。
>>821 任意の入力文字列strがあったとしよう
int x=strcmp("",str);
このxを人に送りつける
そしてxをもらった人は
二分探索の要領でstrcmp("",str)がxになるstrを探す
この手法を使えば六法全書だってint長のデータに圧縮できる
…わけないだろ
話変わって、 ある関数を作っていて渡す必要のあるパラメータが多い場合、 1.そのままだらだら引数を増やすか 2.それとも構造体作ってポインタで渡すか どういう判断基準で使い分けてる?
今更
>>1 を読み直したのだが
局所ブロックに関しての議論を
どっかにまとめてたりしてないものか?
>>782 辞書を考えてみる。
str1="aa"
str2="az"
str3="c"
の場合、
int a = strcmp(str1, str2); は2文字目の比較でaとzの差を返す。
int b = strcmp(str1, str3); は1文字目の比較でaとcの差を返す。
・・・と思う。
というか、より近いって基準が判らん。
"aa"と"az"の間の単語数と、"az"と"c"の間の単語数を較べるのだろうか?
異なる文字列には必ず大小関係があって、その大小関係を入れ子にして
どんどん細かくすることで順番が決まってソートされるので
>>785 は大嘘。
>>825 明確な基準は持ってないけど
たとえば構造体のサイズがポインタのサイズを超えたら検討し始めるかな
>>825 関数宣言が3行目に突入したら100%構造体に以降
830 :
デフォルトの名無しさん :2007/10/30(火) 00:14:57
>>825 渡すパラメータで処理が分岐するなら、関数を増やすと思う。
データ構造が先にありきで考えるだろ
>>825 渡すのだけが目的だよね?
関数から出力を受け取るといったポインタの方でしかできない事は考えないんだよね?
.
>>825 引数の組に簡単な名前で呼べないか検討して、
それが出来る場合は1つの概念で表せる→カプセル化出来ると判断して
構造体(orクラス)にしてしまう。
簡単な名前が思いつかない場合、それぞれの引数は
互いに関連性が低いのだから、無理してまとめたりはしない。
>>825 vsprintfみたいに可変長引数にする
他の関数でも同じ面子がいるかどうかが自分の基準
838 :
825 :2007/10/30(火) 00:25:30
>>825 誤解があるといけないので具体例で書くと
N個のint引数を渡す必要のある関数funcを作る場合
1.
void func(int arg1, int arg2, int arg3, ...... int argN);
2.
typedef struct {
int arg1;
int arg2;
....
int argN;
} func_args_t ;
void func(func_args_t *arg);
とするかです。
ここでは引数をintの配列にするのは意味的におかしい場合と考えてください。
また2.は実際は1個のstructではなくて意味的な塊で(複数の)structでまとめるべきですが、
ここでは例なので1個にまとめていると考えてください。
関数の粒度が粗過ぎるか、階層構造になっていないのが原因
840 :
825 :2007/10/30(火) 00:27:30
841 :
825 :2007/10/30(火) 00:29:07
>>831 >
>>825 > 渡すパラメータで処理が分岐するなら、関数を増やすと思う。
すべてのパラメータが使われるケースとしてください。
Hashのtypoだろ。気にする必要なし
てかなんでCのネタしかないんだここw
846 :
825 :2007/10/30(火) 00:30:27
>>832 > データ構造が先にありきで考えるだろ
上の例でいうと func_args_tはこの関数以外ではまず使われないとしてください。
849 :
825 :2007/10/30(火) 00:33:03
>>833 >
>>825 > 渡すのだけが目的だよね?
> 関数から出力を受け取るといったポインタの方でしかできない事は考えないんだよね?
引数の意味は考えないでください。
引数の数だけの問題です。
上の具体例ではintでもint*でも構わないです。
面倒だから構造体に全部突っ込んでthis状態
851 :
825 :2007/10/30(火) 00:34:18
>>835 >
>>825 > vsprintfみたいに可変長引数にする
Nはイメージ的には8〜10ぐらいの定数としてください。
可変長ではないです。
引数の数によるけど、同じ型があまり並ぶと順番間違えの危険があるので 他で使って無くてもこの場合構造体にする方が良さそうかな・・・
callbackにしろ
それどこの Ruby?
JavaでいうところのDTOか 基本的に、DTOつくるのはダサいな
856 :
825 :2007/10/30(火) 00:48:53
一応僕の見解を書きます。 僕はコンシューマのゲームプログラマなので常にパフォーマンスを気にかけています。 なので可読性を落とさない範囲でなるべく効率のいいバイナリになることを意識します。 プリミティブ型の引数をだらだら並べる場合 - 読みにくい - 同じ型が連続していると関数呼び出しの記述で引数を入れ替えて間違ってしまいやすい - RISC系ではレジスタ渡しを存分に活用できるので高速に呼び出せる 構造体にする場合 - 構造体によって意味的なまとまりがわかりやすい - 構造体によって メンバ名=値 という形式になるためパラメータの意味がわかりやすい - 呼び出し側でいちいち構造体を用意する必要があるのでスタック等を消費する、メモリアクセスが起こる - 呼び出され側でもポインタアクセスなので効率の点で不利(といってもほぼL1アクセス程度ですが) 今のところABIでレジスタ渡しに使えるレジスタ数を境めに決めています。 可読性、移植性(効率性の点で)を犠牲にしています。
857 :
817 :2007/10/30(火) 00:50:40
まぁ普通は、「そんなにたくさん引数を渡すことになることなんてない」 が、正解じゃないか?
可読性考えなくていいなら、設問として破綻してね?
859 :
デフォルトの名無しさん :2007/10/30(火) 00:55:01
今どき構造体なんて使うヤツおるの?バグの温床だろ? 何かよっぽど理由無いかぎり、もう使うなよ。 java は構造体を言語仕様から無くしちまっただろ? オブジェクト指向プログラミングには構造体は不要。 引数が多い関数って、一見使いにくいように思えるが コンパイラが引数チェックをある程度やってくれるだろ? ところが構造体だと、値をセットし忘れるミスをコンパイラが検出できない。 しかも新人クンが大のニガテの「ポインタ」を使いまくり。 今更わざわざ構造体なんて使って時代と逆行する事ぁ無と思う。
いつもの人だが、今帰ってきた。 strcmpは符号を返すわけではありません。 str1>str2 のとき、0より大きい数を、 str1<str2 のとき、0より小さい数を、 str1==str2のとき、0を返す、 と定義してあるだけです。 0はマジックナンバーです。 それから、C言語は論理型を整数型で代用しますが、 符号型を整数型で代用したりはしません。 それは、C言語に符号を調べる特別な演算子が無いことからも明らか。 C言語で整数値の符号を調べる時は、0との比較で調べます。
862 :
825 :2007/10/30(火) 01:01:52
>>859 > 今どき構造体なんて使うヤツおるの?バグの温床だろ?
> 何かよっぽど理由無いかぎり、もう使うなよ。
> java は構造体を言語仕様から無くしちまっただろ?
> オブジェクト指向プログラミングには構造体は不要。
class使えって話ですか?
別にclassでもいいですけど、そうなるとconstructorへの引数が多くなるという話になります。
本質的に何も変わりません。
863 :
825 :2007/10/30(火) 01:03:04
>>858 > 可読性考えなくていいなら、設問として破綻してね?
プログラミングで大事なのは可読性だけじゃないでしょ。
いやそれは違うだろ
レス乞食をレス乞食と見抜けない人は(掲示板を)使うのは難しい
>>863 可読性考えなくて良ければ、構造体使う必要ないし
>符号型を整数型で代用したりはしません。 >それは、C言語に符号を調べる特別な演算子が無いことからも明らか。 これ間違い
よ、真打登場w > それから、C言語は論理型を整数型で代用しますが、 > 符号型を整数型で代用したりはしません。 > それは、C言語に符号を調べる特別な演算子が無いことからも明らか。 全然明らかじゃないんですけどwww てかさ、言語仕様に「論理型を整数型で代用します」なんて、どこに書いてあるのか明示してよw
C使わないにしてもポインタの概念は知っといた方がいいだろ
870 :
817 :2007/10/30(火) 01:07:43
mem系のことも、たまには思い出してあげてください・・・。
それから、仮にstrcmpが返す数の符号が問題になったからといって、
その符号を調べるために、「!」を使うのはおかしい。
「!」は真偽を反転されるために有るのであって、符号を調べるために有るのではない。
「!」を使ってもゼロフラグが立っているかどうかが分かるだけであって、
符号が分かるわけではない。符号を調べるには、さらに最上位bitも調べる必要がある。
だけど、そんな面倒なことはしたくないし、だれもやらないので、
C言語では特別な構文は用意せず、かわりに 0 との大小関係を調べることになってる。
つまり、C言語で符号を調べたい時は、「>=0, <=0, >0, <0, ==0」 を使う。
0 との比較をするのがどうしても嫌だというなら、
>>694 のように書くしか他に方法はない。
872 :
825 :2007/10/30(火) 01:08:31
>>866 >
>>863 > 可読性考えなくて良ければ、構造体使う必要ないし
?
つーか可読性考えなくていいなんて言ってないよ
現実的な判断基準の話をしたい
>>862 え、Cの話かと思ってました。
classがOKなら
setHoge(10);
setHage(20);
setFuga(30);
・・・
execute();
が可能かと。
>>868 isdigit の戻り値はintだが、
ドキュメントには、引数が数値のとき、「真」を返すと書いてある。
逆に、「0以外の値」を返す、とは書いてない。
ドキュメントレベルで、「真偽」という言葉が出てくる。
つまり、Cは整数で真偽を代用する。
一方、
strcmpの戻り値もintだが、こちらには、
str1>str2 のとき、0より大きい「数」を返すと書いてある。
逆に、正の数を返す とは書いてない。
つまり、Cは整数で符号を代用しない。
さらに付け加えれば、符号を返すとも書いてないし、まして真偽を返すとも書いてない。
あくまで数を返すと書いている。
敷居値となっている 0 はマジックナンバーでしかない。
>>862 いや別に一度にコンストラクタに渡さなくてもいいじゃん
>>867 では、Cで符号を調べる演算子は何ですか?
877 :
デフォルトの名無しさん :2007/10/30(火) 01:18:37
>>862 無理してクラス使わんでもいいよ。
クラスが嫌なら引数の多い関数使えばいいんだよ。
全然問題無い。
だが、いったい何のために先人たちが苦労して
構造体を廃止してまでクラスを作ろうとしているのか。
それを考えた方がいい。
!strcmp と書く皆さんは、これからは
>>694 のように書いてくださいね。
そしたら誰も文句言わないから
>>874 どんなドキュメントに書いてあったんだ?
ANSIの仕様書にでも書いてあったか??
日本語訳とかじゃなくて、ちゃんと原書を見て調べたのか???
だから、
> つまり、Cは整数で真偽を代用する。
これがどこに明記されているか、さっさと出典を示せよ。
>>878 では、C言語で「符号型」は整数型を使ってどのように表されますか?
もし、aが正の整数かどうか調べる場合は、どう書けばよいですか?
if ( a && !(a&-0x80000000) ){}
ですか(笑
>str1>str2 のとき、0より大きい「数」を返すと書いてある。 >逆に、正の数を返す とは書いてない。 0より大きい数と正の数の違いは何?
>>879 !str...はそれ自体そういうものとして読まれてるのに整数云々みたいな
ありえない脳内前提をして批判しても意味ないよ。馬鹿だなあ
バカばっか
885 :
825 :2007/10/30(火) 01:25:18
>>875 >>877 classかstructかはどっちでもいいです。
オブジェクト指向の話はおいておいてください。
funcに必要なパラメータを渡すにあたって
プリミティブ型をだらだら渡すか、class/structを定義してそのポインタを渡すか
その判断基準はどうしてる?という話です。
>>881 違うよ
自分で言ってるじゃん
>C言語で整数値の符号を調べる時は、0との比較で調べます。
文法ばっか見て矛盾だ〜ってほんと阿呆だよな。 そんな命題はいくらでも生成できる。 今までどんな教育を受けてきたのか。
>>879 >>694 のコードでは、私の持っているコンパイラでコンパイルできない物があるのですが?
その様なコードを自慢げに正しいコードなどと言われても非常に困ります
また、マジックナンバーを否定するのであれば、マジックナンバーを使用しない
!strcmp(str1, str2)
という表現の方が、
strcmp(str1, str2) == 0
という表現よりも優れていると思います
>>880 manコマンドで調べろ。
>>882 0 より大きい数という言い方をした場合、0 はマジックナンバー。
コンピュータの都合で、たまたま 0 と比べているだけで、もしかしたら、
「 1 より大きい数 」 という仕様だったかもしれない。
0 より大きいか小さいかが問題だといっているのだから、
0 との大小関係を比較すべき。
一方、正の数という言い方をした場合、これは明らかに符号を問題にしている。
だけども、どっちにしろC言語で整数の符号を調べる場合は、0 との大小関係を調べるしかない。
さもなくば
>>694 か。
何ごちゃごちゃ喧嘩してんだよ。 ISO9899:1999から引用しろ。それ以外は議論に値しない。
!strcmpをBoostで検索して そのヘッダの作者名を見ればもう話は終わりだと思う
ISO9899:1999で真はnonzeroとある
>>886 0 と比較するということは、それはC言語では符号は特別視しないということ。
整数で代用された論理型のように、「!」のような演算子は用意されて無いからね。
もし仮に、こんな感じに記述できるのなら、Cは整数で符号を代用しているといえるのだがな。
if( $a ){} /* aは正の数 */
if( ?a ){} /* aは負の数 */
でも実際は、C言語に符号を調べるための特別な演算子は用意されて無いだろ。
894 :
デフォルトの名無しさん :2007/10/30(火) 01:36:45
>>885 コイツ、最強のアフォ!
struct 使うな、と言えば 「class使えって話ですか?」
クラス使わんでもいい、と言えば 「classかstructかはどっちでもいいです。」
もう相手するだけバカバカしい。無視しとこ。
>>888 マジックナンバーが関数の仕様の定義に入っちゃってるんだから、
むしろマジックナンバーに従うべき。
使う側は作った側に従うしかない。
>>892 さん が代わりに調べてくれたようだが、
「真」の定義はあったようだね。
で、同じように「正の数」の定義はありましたかね。
>>896 お前が勝手に擬似コードをコンパイルしようとしているだけだろ。
>>885 そろそろ可哀想だからレス
上手いことまとめられる時だけ構造体、基本的にはだらだら
実際にこうなっちゃったときは設計を見直すから机上論的なものになるけど
正の数と負の数の限界ならlimits.hにありますね。
>>894 相手してるのはお前だけ。他はとっくに無視してるから心配すんな。
>>825 は struct を使え、って答えを期待してるのがミエミエだろ?
「だれか、struct を使ったほうが良いよ、って言ってくれませんか」って呼びかけているんだよ。
反対の意見は耳に入れるつもりは全然無い。
「自殺したいから背中を押してくれませんか」って呼びかけているんだよ。
>>900 それは整数の取れる範囲を示したものであって、
「正の数」や「負の数」を定義したものではないよね。
ISO9899を見ているとnegativeとかnonnegativeという語が ひっきりなしに出てくるんですがこれは何を意味するとお考えでしょうか。
埋め
あるいはこう言い換えてもいいな。 signed と unsigned の違いは何ですか?
>>868 「代用」の使い方が他人と違うんじゃないかな
>>898 >>694 のコードは私のコンパイラではコンパイルは出来るのですが、
正しく動作していないようです
大体さ、符号ってのは、2の補数を使う環境では、 ゼロフラグ(CPUにあればの話) と 最上位bit の兼ね合いで決まるんだよ。 C言語ではゼロフラグを反転したものが論理値だが、 かたわれの、最上位bit を簡単に調べる構文は用意されていない。 だからC言語で符号を調べる場合は 0 と比較することになってる。
>>909 それはISO9899:1999の§いくつに書いてありますか?
>>910 符号を調べる演算子が ISO9899:1999 にでも書いてあるのか?
書いてないなら 0 と比較するしかやりようがないだろ。
ちなみに「自分で探せ」というのはだめですよ。 挙証責任を守って下さい。
>>889 > manコマンドで調べろ。
ごまかすなよw
そんなに怖がらずに、ちゃんと自分の言葉で説明してごらん。
>>911 だからそれがISO9899:1999のどこに書いてあると。
書いてないのならあなたの論も意味をなさなくなりますが。
>>897 いや定義としてあったわけじゃなくて
「〜 true (nonzero) 〜」みたいに文脈中で換言されてたのを見かけただけ
916 :
825 :2007/10/30(火) 01:58:57
>>894 え?
プリミティブ型だらだら派というわけですか?
じゃあ関係のないjavaだのオブジェクト指向だの言った意味がわかりません。
>>914 では一体どうやってC言語で符号を調べるんだよ。
符号を調べる方法が何処にも書いてないから、
0 と比べるしかないよねといってるのに、書いてるところを示せといわれても困る。
何処にも書いてないんだもの。
>>917 質問を質問で返すのは失礼ですよ。議論の基本があなたはなってない。
まず自分に投げかけられた質問に答えてからしかる後に質問をしなさい。
>>916 実際問題、Cの話かC++の話か限定しないとどうにもならんよ
>>915 それで十分だよ。
true (nonzero) ってことは true is nonzero ってことだからね。
一方で、negative の説明は有りますかね。
negative is negative とかやめてよ。
たしか、C言語で負の数をどう扱うかは実装依存だったはず。
>>917 0と比べるしかないっていうのはISO9899のどこに書いてありますか?
書いて無いと思うよ
923 :
825 :2007/10/30(火) 02:07:42
>>901 >
>>894 > 相手してるのはお前だけ。他はとっくに無視してるから心配すんな。
そんなつまらないネタかな?
どっちでもいいことながら悩んでしまうところなんだけど。
>
>>825 は struct を使え、って答えを期待してるのがミエミエだろ?
> 「だれか、struct を使ったほうが良いよ、って言ってくれませんか」って呼びかけているんだよ。
> 反対の意見は耳に入れるつもりは全然無い。
> 「自殺したいから背中を押してくれませんか」って呼びかけているんだよ。
プリミティブだらだらか、struct/classかどっちにする?って話じゃないよ。
そんなの当然どっちもありなわけです。
どっちにするかの判断基準はどうしてるの?ってことです。
>>918 書いていないって言ってるじゃん。
無いことの証明が出来ないって知らないの?
「悪魔の証明」って知らない? 立証責任があるのはあなたの方ですよ。
人に失礼とか言う前に議論するうえで最低限知っておかなければならないことだと思うが。
925 :
825 :2007/10/30(火) 02:09:05
>>919 >
>>916 > 実際問題、Cの話かC++の話か限定しないとどうにもならんよ
じゃあC++にしましょう。
どう思います?
>「悪魔の証明」 厨ワード入りマース
>>923 CとC++じゃ評価基準が違うだろ
もっといえば、関数で渡すものの質が全く違う
>>924 悪魔の証明?どこが?
どこに書いてあるのかと聞いているのに、この場合悪魔の証明とは
どこにも書いてない事を証明する事になる。
180度違うだろ?え?
>>921 大小を比較する演算子の定義は
6.5.8 Relational operators に書いてある。
だけど、それ以外に符号を調べる方法が有るのを証明するのはあなたの責任。
930 :
825 :2007/10/30(火) 02:14:20
>>927 いちおう
>>925 のとおりC++でってことにしました。
でもCの場合とC++の場合でどういう基準で決めるのかの結論がかわるなら、それぞれ教えて欲しいです。
>>929 こらこら責任転嫁は良くありませんね。
>>917 で
>0 と比べるしかないよねといってるのに、書いてるところを示せといわれても困る。
と言ったのはあなたですよ。
だからあなたが0と比べるしかない事を証明しなくてはならないのです。
>>930 C++限定なら話は簡単
引数をまとめるためだけに構造体を切るなどありえない
>>923 引数に構造体を積極的に使うのはむしろ好ましいと思う。
ただ、必ずしもすべての引数を一つにまとめる必要は無いと思う。
>>928 お前バカだろ。
おれは、唯一 A しかない、といってるんだよ。
唯一 A しかないことを証明するのは、
BもちがうしCもちがうしDもちがうし・・・・・・ZもちがうしAAもちがうし・・・AAAもちがうし・・・
と永遠に全ての要素が違うということを示さないといけないので無理。
A 以外にも、条件を満たす要素があるということを立証するのはお前の仕事。
お前は B でも出来るじゃん と一つ示せばいいだけだからな。
936 :
934 :2007/10/30(火) 02:19:18
うは、リロードしたら話題がC++になってた。なんというフェイント。
936に萌えた
>>935 俺が言っているのはそういう事ではない。
ISO9899にも書いてない、「0と比べるしか符号を調べる方法はない」という
あなたの意見を私が黙って受け入れられない、と言っているのです。
ISO9899だけをより所にしているんですから。だからISO9899に書いてない事が
わかったなら、貴方はそこで黙らなければならない。
939 :
825 :2007/10/30(火) 02:20:45
>>899 >
>>885 > そろそろ可哀想だからレス
> 上手いことまとめられる時だけ構造体、基本的にはだらだら
> 実際にこうなっちゃったときは設計を見直すから机上論的なものになるけど
もうちょっと相手を
設計をどんな感じで見直して解決するんですか?
940 :
デフォルトの名無しさん :2007/10/30(火) 02:21:00
>>927 相手にすんなって。
コイツは自分の期待した答え以外は全く受け付けないヤツだからさ。
○○だから、こっちにしろ、と書いたら
「○○は関係無いです。どっちにするかの判断基準はどうしてるの?ってことです。」
って延々帰すだけだから。
コイツ、人口無能みたいやなw
intは32bitとは限りません 16bitである場合もあります
942 :
825 :2007/10/30(火) 02:24:20
>>934 >
>>923 > 引数に構造体を積極的に使うのはむしろ好ましいと思う。
> ただ、必ずしもすべての引数を一つにまとめる必要は無いと思う。
>>936 >うは、リロードしたら話題がC++になってた。なんというフェイント。
すみません、classかstructかでどう話がかわるか興味があったのでC++にしました。
確かに関数への引数が多いときは構造体にしろとは教科書的によく言われていると思います。
C++だったら話かわりますか?
Javaでの話に一度は乗ってきたかと思いきや 関係ないとか言い出すしね
>>932 >>935 の理由より、立証責任はあなたにあります。
「C言語で符号を調べるには、0 と比較するしかない」
には立証責任は無い。
少なくとも、
>>929 に、0 と比較することで、符号が分かることは示した。
そして、それ以外の方法は、どうも見当たらない、と主張しているわけで、
他の方法があるというのなら、他の方法を実際に示して見せるのはあなたの責任。
945 :
825 :2007/10/30(火) 02:25:27
>>933 >
>>930 > C++限定なら話は簡単
> 引数をまとめるためだけに構造体を切るなどありえない
でどうします?
>>944 何度も言いますが、その論理はおかしい。
>「C言語で符号を調べるには、0 と比較するしかない」
>には立証責任は無い。
というのはあくまでも貴方が勝手に決めたルール。そのルールに
私は従うも従わないも自由なのです。
だから立証責任を私に押しつけるのは貴方の我が儘なのです。
あなたが証明しなくてはなりません。
人口無能ワロス。 久々聞いた。 ってか、ほんとは「人口無脳」やろ?わざと?
お前さんが聞きたいのは「だらだら渡すか構造体にするかの判断基準」だろ? 933はC++ならそれ以外の解があるって言ってるんだろ。 でも、その話は聞きたくないんだよな?
>>940 人口無能って...人工だろうよ...何だ、統計調査でもやるのか?
>>945 設計が妥当であるという前提でいくと、
> でどうします?
の答えは、「どうもしない」としかいいようがない
951 :
947 :2007/10/30(火) 02:32:37
orz
しかし簡単な議論もまともに出来ないのによくプログラマやってますね。 そうやって人に責任転嫁をしていれば製品が出来上がるの? 結局は自分の責任で最後まで作らなくちゃどうしようもないでしょう。
>>952 そこが面白いとこだよ
なぜまともに解答を求められないのにプログラムが書けるのか?
>> つまり、Cは整数で真偽を代用する。 >これがどこに明記されているか、さっさと出典を示せよ。 これに対するレスあったっけ
そういうところにこの手の問題の真の解答があると思うんだよね、ボク(キリリ
>>953 どこかで現実と妥協してるからでしょ。
規格書が100%正しいとしても規格書に書いてない事は
自分で判断していくしかない。人にそれを責任転嫁するなど
もってのほかです。
958 :
825 :2007/10/30(火) 02:37:23
>>950 >
>>945 > 設計が妥当であるという前提でいくと、
> > でどうします?
> の答えは、「どうもしない」としかいいようがない
え?
>>933 >
>>930 > C++限定なら話は簡単
> 引数をまとめるためだけに構造体を切るなどありえない
でしょ?
C++限定なら「どうしようもない」、つまり引数だらだらですか?
Cなら構造体?
なぜそうなるか教えてください。
僕理解力ないですか?
959 :
デフォルトの名無しさん :2007/10/30(火) 02:38:22
だから素直に
>>944 は
「0と比べるしかない理由は俺にはわからない。でもそれでちゃんと
動いてるんだからそれでいいんでしょ。証明しなくてもいいから。」と
素直に言えばいいものを。
事もあろうに私に証明しろなんて言い出すものだから話がこじれるのです。
>>938 ISO9899 だけをよりどころにしているのなら、
>>929 で書いたとおり、符号を調べる方法は、
ISO9899 には関係演算子を使ったものしかかかれてないのだから、
「符号を調べるには、0 と 比べるしかない」
って結論になるよね。だって他にかかれてないのだから。
私が言ってるのではないですよ。あなたの大好きな ISO9899 が言ってるのです。
>>961 あれれ?
ISO9899に関係演算子を使った物しか書いてない事が、どうして
「符号を調べるには、0と比べるしかない」という結論に至るのですか?
なんか論理の飛躍を感じるんですが。
・文法的に正しい(コンパイルエラーにならない) ・ある程度一般化している こうした書き方を単に「読み辛い」という理由で ローカルなルールで禁止するといのは実に愚かだと思う。 ルールを覚えるより、書き方(読み方)を覚えた方が早いだろ。
規格書に従うと規格的に規格化されないんじゃないの、そもそも
>>963 読みづらいのは駄目だろ
パッと見て読めるものをいちいち解体して細部から否定するのはナンセンスだと思うけどね
>>962 >> つまり、Cは整数で真偽を代用する。
>これがどこに明記されているか、さっさと出典を示せよ。
これに対するレス頂戴
ここで屁理屈をこねている奴は前にもデザパタのスレでああでもない こうでもないと自分の理屈を人に押しつけていた奴と同じ匂いを感じる。
>>946 だから「無い」ことは立証できないんだって。
「有る」と主張する方に立証責任が発生する。
おれは 0 と比較する以外に符号を調べる方法は「無い」と主張している。
他に方法があるというなら(反論したいなら)そっちに立証責任が発生する。
これは俺のルールじゃない。議論するうえでの最低限のマナー。
お前の大好きな ISO9899 にはこんな基本的なことは書いてないが、
ISO9899 作った奴らもみんな守ってることだからお前も守れ。
>>967 それは俺が言い出したんじゃないよ。
言い出してもいないし、ましてや書いてもいないから。
言い出した、もしくは書いた本人に聞いておくれ。
仕様書なんて後から作られるものだからな。ガンダムに例えると(ry
>>970 そっか
君じゃなかったのね
じゃ書いた人お願い
議論(笑)の内容はどうでもいいんだけど、960の喋り方は気持ち悪い。 >> 958 > 設計が妥当であるという前提でいくと、 ここをきちんと読め。 C++では、設計が妥当になされていれば、パラメータが無駄に多くなることは少ない。 で、その上で、どうしようもないときはどうしようもない。 しかし、構造体でパラメータを渡すことには意味がない。
>>969 誰も「無い」事を証明しろとは言ってないでしょう。
「0と比較する事が符号を調べる唯一の方法です」という貴方の
意見を証明して、と言っているのですよ。
曲解しないように。
>>954 >>892 さんが調べてくれた。
true (nozero) という記述を見かけたそうだ。
真は非ゼロ。
>>969 そういう事。反証するつもりはないんですよ。
あなたが規格書に書いてない事を言い出したから、根拠を
言ってください、とこんな簡単な事を言っているだけなんですよ。
C++の場合は、
http://www.fujigoko.tv/rev/prof/ の、文書的プログラミングとは?
の桃太郎の部分を参考に。
・オブジェクトの状態を変える(セットする)
・何らかの処理を行って結果を返す
この2つは分けるのがC++の基本です。
で、オブジェクトの状態を変えるときにはいっぺんに複数の
パラメータを変化させるのではなくて、
変化するパラメータと、それには影響しないパラメータを分離します。
というやり方で引数だらだらを避けます。
>966 補足。 「一般化している」のだから「読み辛い」のは「個人的理由」に他ならない。 以下阿呆止め。 「環境依存で良ければ、Cで符号を調べる方法は0との比較以外にあるかもしれない」
> そういう事。反証するつもりはないんですよ。 これでは議論にならない。 なに?タモさん?
>>976 「代用する」って書かれてる?あるならどこ?
あと「代用」の意味をお願い
>>981 強いて言えば「規格書に書いてない事を貴方が言い出したから、
証明してね(はぁと)って事です。
証明すればいいだけの簡単な話なのに、やれ「悪魔の証明」だの やれ「お前が証明しろ」だの、そういう議論に反する事を言われるので 引っ掛かるのです。 もしくは「証明できないけどちゃんと動くからいいだろ」でもいいのです。
985 :
981 :2007/10/30(火) 02:52:56
あぁ、ごめん。俺はお前の相方じゃない。 通りすがりで書いただけ。
>>960 は?
符号を調べるときに、0と比べる以外の方法は ISO9899 には明記されていませんよ。
理由が無いわけではない。他に明記されてない、という確たる理由がある。
他にもあるというのなら、その人が、「ここにも書いてあるよ」と立証するしかない。
そうじゃないかぎり、私の言い分が正しいと認められたことになる。
>>986 何それ?根拠もなしに「私は正しい」と言うのですか?
馬鹿ですか?
小学生のケンカでもそんな馬鹿な言い方はしませんよ。
>>986 あと、
>理由が無いわけではない。他に明記されてない、という確たる理由がある。
これをkwsk。
989 :
825 :2007/10/30(火) 02:56:55
>>974 > 議論(笑)の内容はどうでもいいんだけど、960の喋り方は気持ち悪い。
>
> >> 958
> > 設計が妥当であるという前提でいくと、
> ここをきちんと読め。
> C++では、設計が妥当になされていれば、パラメータが無駄に多くなることは少ない。
C++ならパラメータが多くなることはないってそんなこと一般化できるわけないです。
パラメータが減る根拠あげられますか?
さらにCにするとC++に比べてパラメータが多くなるってことならそんな設計もありえないです。
オブジェクト指向言語とオブジェクト指向設計の区別がついていないのでは?
> で、その上で、どうしようもないときはどうしようもない。
> しかし、構造体でパラメータを渡すことには意味がない。
こっちも根拠が知りたいです。
うざいから漏れが判定しちゃる。 双方阿呆だ。 まず>909で他に方法が無いと言い切っているが、ISO9899に書いてない方法もある。 それに対し、ISO9899のどこに書いてあるかと切り替えした時点で、相手も阿呆確定。
>>990 割り込まれるのなら環境依存じゃない方法でお願いします。
規格に明記されてない事は未定義。 規格上、未定義な事はできてもできなくても構わない。
>>990 実は
if ( a>=0 ) /* 正 */
という方法があるんだけど、これは内緒だよ
ごめん
>>990 実は
if ( a>=1 ) /* 正 */
という方法があるんだけど、これは内緒だよ
と書こうとした。
999
だから何度も、無いことの証明は出来ないっていってるだろ。低脳は帰れ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。