トップページ⇒tech
1001コメント309KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/10/30(火) 03:00:12
禁止ネタ(超既出)
・長い関数
・深いネスト
・グローバル変数
・goto
・memset
・malloc - free
・局所ブロック
・サンプルコードのtypo
・記述スタイル
・関数・変数名

過去スレ
その6: http://pc11.2ch.net/test/read.cgi/tech/1193250955/
その5: http://pc11.2ch.net/test/read.cgi/tech/1155315371/
その4: http://pc8.2ch.net/test/read.cgi/tech/1153312202/
その3: http://pc8.2ch.net/test/read.cgi/tech/1149986051/
その2: http://pc8.2ch.net/test/read.cgi/tech/1142741989/
初代 : http://pc8.2ch.net/test/read.cgi/tech/1141867015/
0153デフォルトの名無しさん2007/10/30(火) 17:46:37
>>147
まず、256 の大きさの char 型の配列 str を "" で初期化する。
つぎに、str が 0以外 なら、str に "Hello!" をコピーし、
そうでないなら、標準出力に "error!\n" を出力する。
0154デフォルトの名無しさん2007/10/30(火) 17:50:16
>>153
strは0にならねぇよ
0155デフォルトの名無しさん2007/10/30(火) 17:50:40
>>
まず int 型の i が 0 で初期化される。
つぎに、i が 0 以外なら i に 0 が代入され、
そうでないなら、i に 1 が代入される。

>>150
C言語において、整数の 1 や 2 の真偽を問う必要性が無い。
例えば、if文は、0と比べてどうか、という価値観で分岐しているだけであって、
真偽で分岐しているわけではない。
0156デフォルトの名無しさん2007/10/30(火) 17:54:48
また昨晩のアホのニートが来てるのか
0157デフォルトの名無しさん2007/10/30(火) 17:55:56
>>152
もとの式が論理値を意味しているのなら、「!」を使えばよい。
もとの式が論理値を意味していないのなら、わざわざ「!」を使う必要も無い。
その意味で「わざわざ式の真偽を考える必要はないし、nonzero を true と捉える必要も無い。」
と書いた。
0158デフォルトの名無しさん2007/10/30(火) 17:56:48
>>155 論理式の結果は、もはや数値という意味を失って、
論理値として期待される。整数として扱う必要性が無い。

例:
int b = (1 != 0);
0159デフォルトの名無しさん2007/10/30(火) 17:57:02
こりゃつまらんな
0160デフォルトの名無しさん2007/10/30(火) 17:57:03
>>154
strは配列だから0になることはないね。
だけど、それはコードを書いた人に文句言ってよ。
0161デフォルトの名無しさん2007/10/30(火) 17:58:02
>>157 おk なんとなくキミの言いたいことは分かった。
0162デフォルトの名無しさん2007/10/30(火) 17:59:02
>>160 配列だから、ではなくて、
「文字列リテラルで初期化されているから」では?
0163デフォルトの名無しさん2007/10/30(火) 18:00:02
>>162 は忘れて…お願い><
0164デフォルトの名無しさん2007/10/30(火) 18:05:59
if (*str)なら大丈夫だw

ISO/IEC 9899:1999 6.5.3.3 の 5 に誰も触れないところがry
0165デフォルトの名無しさん2007/10/30(火) 18:06:33
なんかこっちって、スレタイトル本来の意味で気楽に書きにくいね。
辞めようと〜の方が書きやすい。辞めようとまでは思ってないけど。
0166デフォルトの名無しさん2007/10/30(火) 18:12:06
こいつのかまって度は、小学生並のしつこさだな。
0167デフォルトの名無しさん2007/10/30(火) 18:14:16
>>153>>155
なぜ、if文でエラーとなりコンパイルできないと答えずに、全ての設問の動作を回答したのでしょうか?
あなたの理屈で言うと、int i = 0;以外は、0以外であるが真では無いので、コンパイルされてはおかしいのでは無いでしょうか?
iは、int型であり、その値は10です
strは、str[0]のポインタであり、その値はstr[0]のアドレスです
どちらも、あなたの言う、0以外であるが真では無い物なのですが...
0168デフォルトの名無しさん2007/10/30(火) 18:15:58
>>166
ニートでしかも性格が悪いので相当他人に触れる事に飢えていると思われ
0169デフォルトの名無しさん2007/10/30(火) 18:21:11
>>164
真偽値を表している整数値は、真偽値のまま扱うべきだと言っているが。
>>149 のような書き方はC言語の仕様上、動くというだけで、やるべきではないし、
やるひつようもない。
C言語では、意味の上での真偽値は、必要とあらばいつでも整数値に格下できるというだけ。
0170デフォルトの名無しさん2007/10/30(火) 18:25:08
>>167
機能上、if文は、式が、0でないか、0と等しいか、を見るだけだから。
真偽を判定しているわけではない。
だから仕様上は動く。ただそれだけ。
0171デフォルトの名無しさん2007/10/30(火) 18:25:12
>>149のような書き方をするヤツっているのか?w
0172デフォルトの名無しさん2007/10/30(火) 18:26:20
>>171
このスレの人達はそうするらしいよ。
理由は「コンパイルが通るから」だってさ。
動きゃ味噌も糞もいっしょなんだよ。
0173デフォルトの名無しさん2007/10/30(火) 18:28:21
>>170
それは貴方の主張は間違っていると認めると言うことでしょうか?
それとも、全てのコンパイラはISOの規格を正しく実装していないと言うことでしょうか?
0174デフォルトの名無しさん2007/10/30(火) 18:31:05
>>173
単に動けばそれで良い、というなら、
「ヘタだなぁ」と思うコードも、
コンパイルはとおるのだろうし、一応は動くのだろうから、
このスレの趣旨と反します。
ここは、コンパイル出来る出来ないを議論する場所では有りません。
0175KY2007/10/30(火) 18:32:25
つ主観
0176デフォルトの名無しさん2007/10/30(火) 18:32:49
お前ら小学生かw 丁寧語で煽るなw
0177デフォルトの名無しさん2007/10/30(火) 18:33:41
もう皆IOCCC並みのプログラム書こうぜ
0178デフォルトの名無しさん2007/10/30(火) 18:37:34
>>174
現在、議題は、「真は0以外」で「0以外は真とは限らない」と言う主張は正しいのかどうかです
ですので、コンパイルエラーがでるでないでは無く
「真は0以外」で「0以外は真とは限らない」と言うのを証明して貰わなければならないのですが
少なくとも現時点の実装では、「0以外は真」として動作しているので、その見解を聞きたいのです
0179デフォルトの名無しさん2007/10/30(火) 18:40:05
なんか面白い方向に行ってるな。主張主はコテ付けるように!
0180デフォルトの名無しさん2007/10/30(火) 18:42:15
>>178
>「真は0以外」
>「0以外は真」
規格上これらの両方が成立すると思ってる?
前者のみが成立すると思ってる?
後者のみが成立すると思ってる?
どちらも成立しないと思ってる?
0181デフォルトの名無しさん2007/10/30(火) 18:44:08
>>178
>「0以外は真」として動作している
動作していません。
if 文は 0でないか 0と等しいか、で分岐しているだけです。
真偽を評価しているわけでは有りません。
if 文に意味を持たせるのは、プログラマの役目です。
そうでなければ、if 文は単に 0でないか 0と等しいか で機械的に分岐するだけです。
0182デフォルトの名無しさん2007/10/30(火) 18:44:23
>>180
私は>>136が正しいと思います
0183デフォルトの名無しさん2007/10/30(火) 18:45:42
今何人いるんだ?
0184デフォルトの名無しさん2007/10/30(火) 18:46:56
>>182
>>136 が 数学的に根拠が無いということは >>141 で示しました。
命題が正しいからといって、常にその逆が成り立つとは限りません。
0185デフォルトの名無しさん2007/10/30(火) 18:48:15
問題意識が…霞んでよく見えない。
ifでの分岐の作動原理に、真偽がどうの、を期待するのが気に食わないと?
intで代用する文化の延長で、ifの動作原理を抽象化して、
それを真偽だとしてあつかう文化が気に食わないと?
0186デフォルトの名無しさん2007/10/30(火) 18:51:00
そんなにtrueやfalseが好きならC言語とはきっぱり縁を切って
C++かdelphi使えよ
0187デフォルトの名無しさん2007/10/30(火) 18:55:21
>>185

>ifでの分岐の作動原理に、真偽がどうの、を期待するのが気に食わないと?

期待するのが正しい。
だから >>149 のような書き方をするのは良くない。

ただ、仕様上は、if 文は 0でないか、0と等しいか、で機械的に分岐するだけだから、
「真偽がどうの、を期待した書き方」、でなくても動いてしまう。
でもそういうの良くないよね、と。
0188デフォルトの名無しさん2007/10/30(火) 18:55:27
if(2 == !0){}

なぁおまいら、↑がfalseになるのはどう考えたら良い?
0189デフォルトの名無しさん2007/10/30(火) 18:56:36
>>184
>>141ではなにも証明されていません
「真はzero以外である」と言う命題において
「1であれば、真である」が、「真であれば、1である」というのであれば成り立ちません
「真はzero以外である」ので、ある時には「真は10である」かも知れないし、「真は'a'である」かもしれません
0190デフォルトの名無しさん2007/10/30(火) 18:57:18
>>188
環境にもよるのかもしれんが、シンプル。
!0が1になる。ので 2 == 1 はfalse。
0191デフォルトの名無しさん2007/10/30(火) 19:01:12
>>189
>「真はzero以外である」と言う命題において
>「1であれば、真である」が、「真であれば、1である」というのであれば成り立ちません

何言ってるの?
だれか一人でも、真であれば1である、なんて言ったのか?
真であればzero以外である、とは言ったが、1であるなんて限定した言い方は誰もしてないぞ。
0192デフォルトの名無しさん2007/10/30(火) 19:01:31
>>190
えっと、すまん携帯からなんで短く書きすぎた。
2は0以外で、!0は真だけど、異なるって言って良いの?って質問。
0193デフォルトの名無しさん2007/10/30(火) 19:04:22
0が偽、それ以外は真、なんて初歩中の初歩だろ・・・。なんでこんなに延びてるんだ。
0194デフォルトの名無しさん2007/10/30(火) 19:07:28
思うに、"真"のイメージが一致してないから、
話が噛み合って無いんじゃないかと。

プログラマはループが好きだしね。
0195デフォルトの名無しさん2007/10/30(火) 19:07:29
>>192
C言語の仕様上、真偽は本来「無い」。
論理型は整数型で代用されている。(根拠 >>34)
単なる整数値を真偽値として取り扱うのは、プログラマの責任。
0196デフォルトの名無しさん2007/10/30(火) 19:08:58
>>193
偽は0、真は0以外、で代用するが、
0が偽、0以外が真、は成り立たない。
0197デフォルトの名無しさん2007/10/30(火) 19:11:44
>>182
>「真は0以外」
>「0以外は真」
4つのうちどれ?
・規格上これらの両方が成立する
・前者のみが成立する
・後者のみが成立する
・どちらも成立しない
0198デフォルトの名無しさん2007/10/30(火) 19:14:41
もう一度書いておくが、C言語に、真偽値を表す機能自体は無い。
しかし、意味の上での真偽値は有る。
意味の上での真偽値は、いつでも整数値に格下げすることができる。
逆に、整数値を、いつでも意味の上での真偽値として使っているとは限らない。
0199デフォルトの名無しさん2007/10/30(火) 19:16:30
>>197
>>182 は そうとう頭悪いからそんな難しいこと聞いてもわからないって。
突然、>>189 みたいな意味不明なことを言いだすやつだぜ。
質問の意味もわかってないんじゃね。
0200デフォルトの名無しさん2007/10/30(火) 19:18:08
おまいら、こういう無駄っぽい論争は燃えるけど、
ムカつかせるような書き方は自重しようぜ。

論破してもどうせ皆名無しだし、対人ゲームみたいなもんだ。
0201デフォルトの名無しさん2007/10/30(火) 19:22:30
javaのライブラリで、関数がすべてthrows Exceptionになっている奴は
かなり下手だと思う。
0202デフォルトの名無しさん2007/10/30(火) 19:29:00
>>17
>むしろ、propetyとmethodの単純な二元論で設計しようとする場合の弊害を気にすべきです。
C++の場合、その単純な二元論で設計しない弊害の方が、はるかにでかい気がするんだが・・・
0203デフォルトの名無しさん2007/10/30(火) 19:29:21
思ったんだが、集合としての「0以外」と、
具体的な1要素としての「0以外」で話変わってくるんじゃね?
0204デフォルトの名無しさん2007/10/30(火) 19:35:08
>>201
同意。
あと逆にキャッチだけして無かったことにするやつ。
状況に応じてってのは分かるけど、
キャッチしてfalse返すだけとか、ちょっと待てって思う。
0205デフォルトの名無しさん2007/10/30(火) 19:35:25
>>196
それでは、「真はzero以外である」が成立しないだろ
zero以外が真でなければ、真は何なのか?
そんなの誰にも答えられないだろ

「真はzero以外である」と言う命題において
「1であれば真である」は成り立つ
「zeroであれば真ではない」も成り立つ
「真でなければzeroである」も成り立つ
しかし、
「真であれば1である」は成り立たない

同じく「真はzero以外である」と言う命題において
「コップであれば真である」は成り立つ
「zeroであれば真ではない」も成り立つ
「真でなければzeroである」も成り立つ
しかし、
「真であればコップである」は成り立たない
0206デフォルトの名無しさん2007/10/30(火) 19:36:58
>>205 じゃあ、俺は0じゃないから…tureなんだねブボボ(`;ω;´)モワッ
0207デフォルトの名無しさん2007/10/30(火) 19:39:11
命題云々の話はできても規格の話はできないのかな
0208デフォルトの名無しさん2007/10/30(火) 19:40:30
>>203
「0以外」は集合です。

もし、具体的な1要素として「0以外」を見るのなら、
範囲の集合 S = { (0以外), (1以上3以下), (-3以外), (4だけ) }
といった見方も有ります。
しかし、0以外、という言葉が、
「0以外に含まれている具体的な1要素」
を表すことはありません。
020902007/10/30(火) 19:46:39
漏れも要素1の集合にしてください
0210デフォルトの名無しさん2007/10/30(火) 19:46:49
>>205
1行目の成立ってのをkwsk
C言語において「真はzero以外である」ってのは定義なんじゃねーの?
証明したりする類のことじゃない気がするんだが
02112102007/10/30(火) 19:48:52
すまん、俺文盲だったわ
205だけ読んで理解しようとしてた
0212デフォルトの名無しさん2007/10/30(火) 19:49:42
>>205
まず、AであればBであるとき、
BであればAであるとは限らない、ということを理解すべき。

命題: 「真はzero以外である」、が成立するために、
逆: 「zero以外が真である」、が成立する必要は無い。
裏: 「真でなければzeroである」、も成立する必要は無い。
成立する必要があるのは、
対偶: 「zeroであれば真以外である」、だけ。

>「真はzero以外である」と言う命題において
>「1であれば真である」は成り立つ
なりたたない。
命題は、「真であればzero以外である」、と言っているだけで、
1 であれば 真 である、とは一言も言っていない。
1 は単なる 「1」 の意味かもしれない。
0213デフォルトの名無しさん2007/10/30(火) 19:50:56
>>204
こういうのは自分的にはOK。
 public int safeInt(String str, int errorValue){
  try {
   return Integer.parseInt(str);
  } catch (NumberFormatException e) {
   return errorValue;
  }
 }

キャッチして無かったことにするのはヘタでなくてバグだと思う。
0214デフォルトの名無しさん2007/10/30(火) 19:51:49
>>210
そうだよ
C言語に於いては「真はzero以外」であり、「zero以外なら真」だよ
特定の人だけ、「真はzero以外」だが「zero以外なら真」とは限らないと喚き散らしてるんだよ

もうね、zero以外であれば、文字型でも、整数でも、浮動小数点でも、真だって事が理解できないらしいんだ
だから、>>205みたいな証明じみた事をしなければならないのさ
0215デフォルトの名無しさん2007/10/30(火) 19:56:51
>>214
>C言語に於いては「真はzero以外」であり、「zero以外なら真」だよ
Cに限って言えばそれは無い。
zero以外の整数値を、真以外の意味で使うこともある。
だから「zero以外→真」は常に成り立たない。
数学上、常に成り立たつとは限らない命題は偽である。

>もうね、zero以外であれば、文字型でも、整数でも、浮動小数点でも、真
C言語には元々真も偽もない。
意味の上だけの真や偽が浮遊しているに過ぎない。
0216デフォルトの名無しさん2007/10/30(火) 19:57:04
>>214
特定の人とは要するにキチガイでお邪魔虫だろ
だからそういう人は無視すればいいんだよ
0217デフォルトの名無しさん2007/10/30(火) 19:59:04
>>215
何言ってんの?
評価は真だって話だろ?運用の話なんてしてねえよ。
0218デフォルトの名無しさん2007/10/30(火) 19:59:08
>>212
1は単なる「1」かも知れないが、それは、zeroでは無い
つまり、「真はzero以外」であるならば、「1はzeroでは無いから真である」
そして、君が言う対偶というのは、「真であれば1である」と言うのが対偶だ
けして、命題を反対から読むことではない
0219デフォルトの名無しさん2007/10/30(火) 20:02:19
>>215
ああ、君は真偽以外の話もしてたの?
0220デフォルトの名無しさん2007/10/30(火) 20:02:20
>>218
いい加減に「逆は必ずしも真ならず」って理解してくれませんか?
あなた頭悪すぎですよ。
0221デフォルトの名無しさん2007/10/30(火) 20:07:39
>>213
上で書いた状況に応じてってのがまさにそれのことw
それは俺もOK。

>バグ
そういう仕様のメソッド、と言われると中々ね・・・。
最低でもログにスタックトレース出してくれないと泣ける。
0222デフォルトの名無しさん2007/10/30(火) 20:09:37
今日も大漁だなw
0223デフォルトの名無しさん2007/10/30(火) 20:10:18
>>218

>1は単なる「1」かも知れないが、それは、zeroでは無い
↑これは正しい
>つまり、「真はzero以外」であるならば、「1はzeroでは無いから真である」
↑これはおかしい。
↑命題は 「真→zero以外」 とは言っているが、決して 「zero以外→真」 とは言っていない。
↑よって、「真はzero以外」 ということを根拠に、「1はzeroでは無いから真である」
↑ということを言うことは出来ない。

>そして、君が言う対偶というのは、「真であれば1である」と言うのが対偶だ
>けして、命題を反対から読むことではない
「真→zero以外」 の対偶は
「zero→真以外」 です。
だいたい「1」なんて言葉は一言も命題に使われていない。どっから出てきたのか。
勝手に数学の定義を変えないで。
0224デフォルトの名無しさん2007/10/30(火) 20:10:59
C++のコード、あるクラスのメンバ変数(ファイルハンドラ)があったとして、
次のようなソースコードを見かけてしまった。

CHoge::CHoge()
{
m_hFileHandle = NULL;
}
void CHoge::Shori()
{
Close();
m_hFileHandle = CreateFile(……);
//処理
}

void CHoge::Close()
{
if (m_hFileHandle != NULL)
{
CloseHandle(m_hFileHandle);
m_hFileHandle = NULL;
}
}


これって、どう思う?
0225デフォルトの名無しさん2007/10/30(火) 20:12:14
なんかどちらも正しい気がする。
ただ噛み合って無いって感じ。

それと、キチガイとか頭悪いとか言い出すのは負けだと思った方がいい。
0226デフォルトの名無しさん2007/10/30(火) 20:13:18
補足。
どちらも、ってのは両者の言い分のこと。
0227デフォルトの名無しさん2007/10/30(火) 20:13:47
>「真→zero以外」
規格上これは正しい?
0228デフォルトの名無しさん2007/10/30(火) 20:14:14
>>217
整数を評価した結果は「整数」でしかありません。
if 文は式が 0でないか、0と等しいか、に基づいて、機械的に分岐するだけです。
0229デフォルトの名無しさん2007/10/30(火) 20:14:27
>>225
いや、基地外にははっきりと基地外と言った方がいい
だって全然議論にもなってないじゃんこれ
0230デフォルトの名無しさん2007/10/30(火) 20:14:44
if( 0以外 )

を偽と評価する事があるんだったら見てみたい。
0231デフォルトの名無しさん2007/10/30(火) 20:15:50
>>223

↑
↓←← →

→ → ↓
0232デフォルトの名無しさん2007/10/30(火) 20:16:32
逆裏対偶なんて脇道はどうでもいいんだよ。
真理値を意味する整数型を算術演算したり数値を意味する整数型を論理演算するのはヘタ。
これでいいじゃん。
0233デフォルトの名無しさん2007/10/30(火) 20:17:18
>>227
>>34 を 参照してください。
0234デフォルトの名無しさん2007/10/30(火) 20:17:32
同意。
0235デフォルトの名無しさん2007/10/30(火) 20:18:18
234は>>232宛
0236デフォルトの名無しさん2007/10/30(火) 20:18:19
>>233
君誰?
0237デフォルトの名無しさん2007/10/30(火) 20:19:48
あと、真面目に読んでなかったからあれなんだけど、
↓はどういう意味?

> 同じく「真はzero以外である」と言う命題において
> 「コップであれば真である」は成り立つ
> 「zeroであれば真ではない」も成り立つ
> 「真でなければzeroである」も成り立つ
> しかし、
> 「真であればコップである」は成り立たない

「コップであれば真である」は成り立つ
って何よ。つーかコップがどうしたの? どっから出てきたの?
0238デフォルトの名無しさん2007/10/30(火) 20:20:24
zero以外の物の例としてコップを挙げただけだろ
0239デフォルトの名無しさん2007/10/30(火) 20:20:42
>>236
いつもの人
0240デフォルトの名無しさん2007/10/30(火) 20:21:22
>>230
ヨロシクー
0241デフォルトの名無しさん2007/10/30(火) 20:22:02
>>237
屁理屈そのものだな
詭弁法だよ

詭弁の特徴のガイドライン
6:一見関係ありそうで関係ない話を始める
0242デフォルトの名無しさん2007/10/30(火) 20:22:38
>>238
で、コップは真なのですか?
コップはコップでしょ。

> 「コップであれば真である」は成り立つ

とか自分で書いてて、変だなぁとか思わなかったの?
0243デフォルトの名無しさん2007/10/30(火) 20:22:49
>>237
展開がおかしくないか?

まず「真はヤカン以外である」があって
「コップであれば真である」
が
「真であればコップである」とは限らない
というのなら解るんだけど。
0244デフォルトの名無しさん2007/10/30(火) 20:24:48
>>242
なんで俺に言ってるの?
俺は書いてないよ
書いた人に言ってね
0245デフォルトの名無しさん2007/10/30(火) 20:26:36
John Lennon is dead.
GOD is dead.
∴John Lennon is GOD.
0246デフォルトの名無しさん2007/10/30(火) 20:26:45
>>224
俺はよくそれやる。
でも俺自身は再オープンするコードは書かないw

あと、初期化子使った方が良い、というかCloseHandleするauto_ptr的なハンドル保持クラスを使う。
0247デフォルトの名無しさん2007/10/30(火) 20:27:50
>>230 >>240
読み飛ばしてたごめん。

if 文は 真偽を評価するわけではない。
ただ、0でないか、0と等しいか、で分岐するだけ。
>if( 0以外 )
は 0 と等しくないので、以降に続くブロックは実行される。
結局、0以外が「真」と評価された、かどうかまでは判らない。
C言語には元々真偽はなく、整数で代用されている。
C言語で言うところの真偽は、意味上のものでしかない。
0248デフォルトの名無しさん2007/10/30(火) 20:29:07
>>244
ごめんごめん、もうだれがだれだかわけわかめ
0249デフォルトの名無しさん2007/10/30(火) 20:30:01
>>247
そんなこと解りきっとるわ!
if(){
//真
}
else{
//偽
}

だって話してたんだろ今まで!!
0250デフォルトの名無しさん2007/10/30(火) 20:30:22
>>232が結論だろ常考
0251デフォルトの名無しさん2007/10/30(火) 20:32:49
>>250
お疲れ
0252デフォルトの名無しさん2007/10/30(火) 20:34:21
>>188
が絡んでたのか。このぐっちゃりした議論の原因がわかった。
■ このスレッドは過去ログ倉庫に格納されています