by
Anonymous Coward
on 2011年01月31日 17時10分
(#1896060)
言語仕様と実装の問題をいっしょにするのはどうかと思いますが。 間違ったコードはちゃんとコンパイル時及び実行時にエラーとして叩き落とす実装(たとえばFail-Safe C [aist.go.jp])を使えばいいんじゃないでしょうか。Cの言語仕様はこのような実装を禁じていません。未定義とは文字通り「何をしてもいい」ので、コンパイルエラーや実行時エラーにしてもいいのです。 「そんなもん仕事では使わん」と言うなら、Pascalだって仕事で使うことなんかありませんし。むしろ(将来Cで仕事をさせる予定の人間に)過保護な高級言語ばかり使わせていると、間違ったコードはちゃんと言語がエラーにしてくれると思い込んでしまいませんか?
CはCでも・・・ (スコア:5, おもしろおかしい)
世の中はCでできている。WindowsだってLinuxだってアメンボだって、みんなみんなCでできている。
プログラミング言語だってCでできている。PythonだってRubyだってオケラだって、みんなCでできている友達なんだ。
アメンボとオケラのCは炭素では?
Re: (スコア:0)
Cの難易度が誇張されているように思うのだが。
Javaより難しい?
Re:CはCでも・・・ (スコア:0)
間違ったコードが間違ったまま動くから、独習するのは難しいと思います。
Cだけ学ぶより、CPUやコンパイラをセットで学んだほうが楽だと思えるぐらい。
先日某所で char number[sizeof(int)]; というブットビコードを見かけました。
整数を一旦文字列にしようと思ったらしいですが、スタック壊しながら動いちゃいますから、初学者は何が悪いか気がつきませんよね。
Re:CはCでも・・・ (スコア:3, 参考になる)
言語仕様と実装の問題をいっしょにするのはどうかと思いますが。
間違ったコードはちゃんとコンパイル時及び実行時にエラーとして叩き落とす実装(たとえばFail-Safe C [aist.go.jp])を使えばいいんじゃないでしょうか。Cの言語仕様はこのような実装を禁じていません。未定義とは文字通り「何をしてもいい」ので、コンパイルエラーや実行時エラーにしてもいいのです。
「そんなもん仕事では使わん」と言うなら、Pascalだって仕事で使うことなんかありませんし。むしろ(将来Cで仕事をさせる予定の人間に)過保護な高級言語ばかり使わせていると、間違ったコードはちゃんと言語がエラーにしてくれると思い込んでしまいませんか?
Re: (スコア:0)
残念ながら、Cの仕様では、コンパイル時にすべての未定義コードを簡単には蹴ることができないんですよ。例えば、
a[i] = a[j]++;
は、実行時に、i==jだったら未定義になりますが、コンパイル時に、それを検出するのは容易ではありません。
Re:CはCでも・・・ (スコア:2)
#釣り?
なんら、変な所ないのですが・・。
>整数を一旦文字列にしようと思ったらしいですが、スタック壊しながら動いちゃいますから、初学者は何が悪いか気がつきませんよね
盛大な釣り?
閑話休題
Re: (スコア:0)
このコメント自体が盛大な釣りですか?
とりあえずあなたが初学者さんと同レベルであることはよく分かりましたので、願わくは一生Cのプロジェクトで関わり合いにならないことを祈っておきます。
Re:CはCでも・・・ (スコア:4, おもしろおかしい)
> 願わくは一生Cのプロジェクトで関わり合いにならないことを祈っておきます。
賛同者は多いとおもいますが、経験的には、その類の願いが叶うことは決してありません。(泣
Re:CはCでも・・・ (スコア:2, すばらしい洞察)
c言語の欠点が、まさにこの問答で現れていると思いますよ。「初学者」と「Cのプロジェクト」参加者との、このギャップを埋める努力を誰がしているのか、と。もしかしてその努力って、初学者の自助努力に大きく頼っていませんか。
初学者が「Cのプロジェクト」参加者レベルまで達するのに必要な学習はどのようなもので、それは独学で可能か?あるいは、間違って覚えたことを修正するのにはどうすればよいか?
客にカネを払わせるに値するプロジェクトの推進には初学者は無用でしょうが、「Cのプロジェクト」参加者レベルの人材が天から降ってくるわけもなく、何らかの形での教育は必要不可欠なわけですよ。まして、フリーソフト(たとえばlhaplusとか・・・ただしこの設例に他意はありません)などは一人でやっているわけで、その人が仮に間違った知識でコーディングしていたら?間違っているが偶然にも動いてしまう場合は?等等
c言語の使い手の雰囲気って、初学者を排除する文化が蔓延しているように見えます。「Cのプロジェクト」参加者レベルとしてはそれでいいのでしょうが、初学者を邪魔者扱いでは、その初学者がいずれ書くであろうプログラムの質はいつまでたっても上がらないでしょう。
意味不明 (スコア:0)
> それは独学で可能か?あるいは、間違って覚えたことを修正するのにはどうすればよいか?
それは初学者当人やその上司、PMの問題であって、「言語」の問題とは一切関係無いよ。
或いは貴方がこれまで参加してきた「C言語によるプロジェクト」の巡りあわせが
極めて不運だったのでしょう。
Re: (スコア:0)
知らないなら素直に「どこがおかしいのかわからないから教えてください」と言えばいいものを「釣り?」とかほざくのが言語の問題? 言いがかりにもほどがある。
これが不遜メソッド [hatena.ne.jp]って奴ですか?
Re: (スコア:0)
ごめんなさい、別コメでも補足しましたが、その後に
sprintf(number, "%d", some_small_integer);
ってのが来るのです。整数が3桁までなら動いているので、その時点で何がおかしいかを知る手段はない。ですが、4桁目まで使ってしまうとスタック壊しますよね。メモリの置き方によってはこれでも動いてしまう場合があるのですが、こことは直接無関係な変更をした瞬間に動かなくなって、どこが原因だかわからなくなってハマっている、なんてこともしばしば。
実際人のこと言えず、配列を踏み越えちゃったり解放したメモリへの参照が残ってたり、なんてケースではバグの発生条件が不確定だったりバグを顕在化した変更とバグの原因が遠かったりで、なかなか大変な目に遭うことも。ええ、僕自身が「Cのプロジェクトで一緒になりたくない」存在かもしれませんね…orz
Re:CはCでも・・・ (スコア:2)
> sprintf(number, "%d", some_small_integer);
うがぁ;;
笑えないですね;;。
そこで、「%*.」「%.*」「%*.*」とかを教えてあげましょう。
彼も一つのスキルを手に入れられます。
閑話休題
Re: (スコア:0)
> char number[sizeof(int)];
すみません、何が悪いのか分かりません。
int型の変数とセットでunionとして使えば使い道があるような気がしました。
Re: (スコア:0)
元コメの言う通り数値⇒文字列変換なら桁数が全然足りてないのでは。
unionはバイトコード変換なら使うでしょうけど、文字列には変換できませんよね?
Re: (スコア:0)
> 元コメの言う通り数値⇒文字列変換なら桁数が全然足りてないのでは。
> unionはバイトコード変換なら使うでしょうけど、文字列には変換できませんよね?
「文字列変換」が意味するところは、まさにそういう意味だと思ってました。
0x41424344 -> "ABCD" または "DCBA" (エンディアンによる)(32ビットintの場合)
といったことを、やりたいのだと思ってました。
sprintfみたいなことがやりたいのなら、これではだめなことは明白ですね。
Re: (スコア:0)
元の話ですが、fizzbuzzの話で、なぜかsprintfを使いたかったようです。
わかりづらい書き方してごめんなさい
Re: (スコア:0)
「バイトコード変換した結果を文字列として扱う」だとしても、今度は「終端文字分を確保していない」という罠が待ってますよん。
#まぁこっちではなかったようですが。