1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:06:26 ] malloc(sizeof(char)*(strlen(s)+1)) ではなく malloc(strlen(s)+1) と書くような糞コードばかり見て育った、 悪しき慣習を引きずった人は引退すべし
357 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:49:03 ] まぁ、俺も現実的にはC++使うな。 だけどC++使うからこそ観念的に省略しないんだけどな。 テンプレート関数とか作るとき > ここは自明だろーがよ > というのが反対派の意見だと思う。 そのはずの自明が、抽象化・総称化すればする程無くなっていく。 wchar_tの対応をしようとしただけで崩れる。 つまりその自明はあまり本質的でなかったということ。 むしろ、文字をchar型を扱うときに限り文字数とバイト数が同じになる、と考える。 文字列操作と言いながら型を強く意識するのは、やはりスマートとは思えないよ。
358 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:52:00 ] 誤記は脳内保管で。
359 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:00:44 ] >>357 ぶっちゃけ未対応ソフトの多バイト文字対応をするときは charをwchar_tに機械変換♥ なんて絶対しないから もうその辺はすごい勢いでどうでもいい話だと思う。
360 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:11:32 ] そもそも文字型が独立しておらず、charやunsigned charが 整数型の1つである(JavaやC#でいうbyteにあたる型)という時点から もう文字とバイトをごっちゃにするのは始まっている。 だから俺は文字 == バイトを甘んじて受け入れ、sizeof (char)を使わない。
361 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:15:20 ] 機械変換とかじゃなくて、テンプレート関数の話な。 allocator((Tr::getlen(s)+1) * Tr::char_size); みたいな感じで実装して、型はコンパイル時に決まる。 ちょっとした関数を総称化すると、 自分が自明だとか本質的だと思っていたものが、 そうでもないと気付かされるって話。
362 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:18:56 ] ぶっちゃげcharだけなんてXMLも扱えねぇよ最近。
363 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:28:46 ] >>360 文字とバイトがごっちゃというのは整理出来ていないから。 文字は文字集合として独立していて、バイトも文字集合とは関係無い。 その2つを繋いで、バイト列の上で文字を表現するルールがエンコーディング。 概念が頭の中で分かれていれば、unsinedだとかSJIS, UTF-8やらがあってもごっちゃにはならないはず。
364 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:30:07 ] 型について、ちょい脱線するけど・・・。 時刻を保持する型を使ってて、8月中のデータを探すとき (擬似コード。リテラルは変数に代入された値と思って) if("2007/08/01" <= x && x <= "2007/08/31 23:59:59"){...} のように書く奴が居る。 俺は if("2007/08" <= x && x < "2007/09"){...} と書く。月日は省略されると1、時間以下は0となる。(普通) しかし、そう書く理由はソースが短くなるからじゃない。 if("2007/08/01 00:00:00" <= x && x < "2007/09/01 00:00:00"){...} と書いても良い。 59:59だとか、9999だとかは、まずいサインだと思っている。 型を強く意識している場合は多いからだ、 上記の場合、この型がミリ秒まで保持することになったとき、 23:59:59は正確な最後ではなく、23:59:59.999と書く必要があり 僅かだが穴のあるプログラムとなる。 データ的にはピコ秒まで持てるようになったら?.999999... 精度の問題じゃない、結局は 「2007/09/01に限りなく近い値」となる なら2007/09/01 00:00:00と比較すれば良い。 ソートで単に最後にしたいものに 9999 を入れるとか、 場合によってはハードコーディングとか、もう見てられない。 必要以上に型の精度に依存しないで欲しい。
365 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:33:50 ] ミリ秒以前にうるう秒
366 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:36:45 ] <= じゃなくて < を使えば済む話じゃないのか
367 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:48:33 ] >>366 そう、そういう話。 でも使ってる精度が日まで(時以降が00:00)で、Webフォームから期間を入れられた場合、 開始日〜終了日という入力欄では終了日も含むので、 x < 終了日+1 とせず、単に x <= 終了日とする奴が中々多い。 右の方がシンプルだし、わからんでもないが。 それで登録日時(時分秒が有る)とかを検索する処理でも同じソース使って馬鹿がって結果になってた。
368 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:52:32 ] >>363 文字とバイトがごっちゃというのは俺に言っているのか? 俺は、CとC++が文字とバイトをごっちゃに扱っていると言ったつもりだ。 だから俺にそんなこと言われても、お門違い。
369 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 01:04:36 ] wchar.hなど有るし、文字とバイトをごっちゃに扱ってるようには思えないが・・・ それにchar==文字でなく、char*==nul終端文字ストリームというのがあったから SJISなどをそれなりに扱えて来たわけだし。
370 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 01:20:30 ] ちなみに、java,C#などは文字型が本当の意味で独立してるわけじゃなく、 単に内部のエンコードを割り切ってUTF-16に統一してるだけ。 昔、C言語がasciiで十分と考えたように。 その利便性はもちろん大きいけど、その代償としてUTF-8などを読み書きするとき エンコード変換のオーバーヘッドを受け入れている。 ※よほど巨大なファイルでない限り対したオーバーヘッドじゃないけど。
371 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 01:27:26 ] UTF-16もサロゲートペアを考えるとchar==1文字とならない。 Unicode領域で固定バイトが出来るのはUTF-32だけ。 でもascii1文字に4byteも使うことと、 サロゲートペアの文字があまり重要でないことからUTF-32で扱っているシステムは少ない。 未来の言語のcharは32bitかもしれない。
372 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:46:39 ] おれは>>355 と同じように考える。 >>357 ,>>361 で抽象化とか総称化とかって話がでてるけど、 そのようなケースになったときは、そう書けばいい。 しかし、このスレでは‘sizeof(char)’は抽象化されてない。 あくまで、>>1 の記述に的を絞って考えたらやっぱり冗長かなーと。。。
373 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:49:51 ] >>354 > char* strmalloc(int len){return len<0?NULL:malloc((len+1)*sizeof(char ));} len=0のときにNULLにしてしまうのは、ちょっと馴染みがないんだが。
374 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:53:44 ] え?
375 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:55:50 ] >>354 その引数lenの型は、size_tにして、条件演算子は排除。
376 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:58:23 ] >>373 len<0が0を含むっていうのは、ちょっと馴染みがないんだが。
377 名前:373 mailto:sage [2007/09/04(火) 03:40:49 ] ごめん、寝ぼけてた。 真と偽を逆に見てた。
378 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 07:21:37 ] >>375 あ、確かに、size_tだな。size_tってunsignedって保証あるんだったっけ? \0を入れられない、len==-1(len+1が0に)でNULL以外が帰ると都合が悪いので負の数を弾いてた。
379 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 07:48:25 ] >>369 例えばmemsetなどのmem〜関数がごっちゃにしている例。 wchar_tはいいが、後付なのでここでは省きたい。 Shift_JISなどはマルチバイト文字なのだから、 char1つで表せないのは当たり前のことだ。 >>370 charが単に16ビット符号無し整数型とは別に存在するだろ。 Javaにはそんな整数型は無いが、いずれにせよcharが 整数として演算可能な型ではないことを言いたかっただけ。 >>371 D言語はUTF-32も扱える
380 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 09:19:06 ] >>379 「D言語は」って・・・Cだと扱えないのか?
381 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 11:33:12 ] >>379 そりゃmem*でも文字列は扱えるけど、普通は str* wcs* を使うだろう。 文字列にmem*使う奴が悪いと思うが。 >wchar_tはいいが、後付なのでここでは省きたい。 Cの規格自体、かなり昔から何度も改訂されてるし、 今ではwchar_tも正式な仕様なのに、後付け扱いはあんまりかと・・・。 まぁCではtypedefなんで後付け感は確かにあるけど。 > charが単に16ビット符号無し整数型とは別に存在するだろ。 > Javaにはそんな整数型は無いが、 > 整数として演算可能な型ではないことを言いたかっただけ。 javaのcharは16ビット符号無し整数で、整数として演算可能だよ。 > D言語はUTF-32も プログラミングで言えばlinuxのgccのwchar_tも32bitだっだはず。 俺が言いたかったのはUTF-32を内部コードとして使ってるOS,ライブラリ,ソフトウェアが少ないってこと。 >>380 UTF-32用の組み込み型があるって意味だと思う、 (Dはそもそも強いtypedefがあるから、組み込みでなくても問題ないけど) 「標準」っていうことが重要になる。 標準でないと、各々作ってしまう。 typedef unsigned longならまだいいけど、 構造体やクラス化されると他ライブラリとの互換性がね・・・。
382 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 16:19:11 ] >>378 size_tは普通 signed な何かです。
383 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 16:37:46 ] いいえ、unsigned intかunsigned longであることのほうが普通です。
384 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 17:09:44 ] ssize_tと間違えていたよ
385 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:43:25 ] >>371 D言語はUnicodeを知っていて、UTF-8,-16,-32の変換は勝手にやってくれるらしいぜ。 import std.stdio; void main() { string s = "AΑあ"; // UTF-8の配列 writefln(s.length); // 当然長さは、6 foreach(i, dchar c; s) // UTF-32で取り出す writefln(i); // 0, 1, 3 ... 自動でUnicodeスカラ値単位に区切ってくれる! }
386 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:51:22 ] > // 当然長さは、6 当然? 素直に考えれば、長さは3だと思うけど。
387 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:54:37 ] string は const(char)[] のaliasだから、ただのUTF-8シーケンスなのです。 だから、長さは6なのです。
388 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:59:16 ] Dはちょっと見ないあいだにますます変な機能が追加されてんだな const(char)[] って何だよw
389 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 07:48:16 ] D言語って、そんなに悪くないと思うよ。 同じことをC++でベタベタとコードを書いたり、 可読性の酷くわるいマクロや、テンプレートを駆使しすぎるよりは。
390 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:55:15 ] 385はうそっぱちなので真に受けないでください
391 名前:デフォルトの名無しさん [2007/09/06(木) 23:49:44 ] デーげんごっていつのまにかたいへんなことになってんだな
392 名前:デフォルトの名無しさん [2007/09/14(金) 20:35:08 ] さすがに、みんな飽きたな。 次のネタを検討しようか。 引数を1つしか取らないようなprintfを書くな。 そういうコード例の参考書は買ってはいけない。 ってのはどうよ。 Cの標準化の人達は、なんで、print を用意しなかったのかな。 putsとカブっているとはいえ、引数1つのprintfが氾濫するよりはマシだろうに。
393 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:13:54 ] puts は最後に改行文字を出すぞ
394 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:18:32 ] 文盲?
395 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:24:10 ] コンパイラが最適化するからどうでもいいんじゃないの?
396 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:37:40 ] >>393 よくあるprintfの酷い使い方。 printf("==== ほげほげ version 1.0 ======\n") ; printf("Programed by foobar\n") ; 一行ずつ別々にprintfを呼ぶなら、putsでもいいんじゃないか。
397 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:39:13 ] >>395 そんな変な最適化をするコンパイラなんて捨ててしまえ。 そういうのに慣れていると、 printf("私のコードは100%safeです。\n") ; なんていう恐ろしいことをやる馬鹿が出てくるんだよ。
398 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:42:51 ] puts, gets, putchar, getchar, printf, scanfまるごとなくしてしまえ。 f版でいいよ。 gets, putsとfgets, fputsは微妙に挙動が違うのが癪だが。
399 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:09:27 ] 少なくともgccはフォーマット文の中身まで見て最適化するよ
400 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:35:27 ] gccが最適化するからprintfを変な使い方をしてもいい、というのは間違いだと思う。 すでに書かれてしまった膨大なコードのために、変態な最適化をしてくれるのだと思う。
401 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:37:51 ] void OutputMessage(char* s) { printf(s) ; } こんな関数があったとしたら、 OutputMessage("100%safe") ; なんて呼び出す輩が出てくる。 gccがprintfの引数を見て最適化してくれればバグが顕在化しないが、 最適化しない環境に持っていけばバグが顕在化してしまう。
402 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:38:28 ] >>397 俺的には-Wallで警告出るから問題ない
403 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:43:11 ] >>402 のようなのは警告でないっしょ?
404 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 00:03:52 ] でるよ。
405 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 00:54:17 ] >>401 俺は何でもかんでもprintf使う方だけど、コレは無いなぁ・・・。 void OutputMessage(char* s) { printf("%s",s); } puts、fputsなんてここ5年ぐらい使ってない。 対話なCUI作るときは(滅多に作らないけど)cursesなことが多いし、 ログ出力は定型で吐くラッパ作ることが多いし、 出力部分をgrepするのに、いちいち正規表現やなんかで色々指定するのダルい。
406 名前:401 mailto:sage [2007/09/15(土) 01:53:37 ] >>405 そのまさかをやる人間が少なくないのですよ。 printfに渡す文字列に対してサニタイジングを行うべし なんて真顔で言う人間までいる。
407 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:09:08 ] あたしゃprintf("<>")なんてのはやるがね。
408 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:14:37 ] >>400 一般論だが、 想定外の変なデータにあわせてプログラムを書き換えるというのは たいていあとでほころびが出たりしますよな。
409 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 00:01:27 ] ん? printf("\n") ; がだめってことか? 何で悪いのか判らん・・・
410 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 00:59:50 ] 別にいいと思うよ。
411 名前:デフォルトの名無しさん [2007/09/18(火) 01:10:15 ] かつては、printfをどこかで使ってるなら出力は全部printfにしたほうが、 さらにもう一つputs関数がリンクされてしまうよりも 実行ファイルが小さくなるという効能があったのではないかと思う。
412 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 01:37:58 ] >>1 死ね
413 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 01:42:07 ] そもそもputsとfputsの挙動が違うのがな 今日の言語設計者は気持ち悪くて、そんなことできないと思う。
414 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 03:22:46 ] しょうがない。 もとはと言えば64KB程度のメモリで動いていたマシンのOSと、OSの上で動くプログラムを書くとき、 メモリを節約するために共通コードを関数としてライブラリ化したような代物だから。
415 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 23:17:00 ] ところで、sizeof(char)=sizeof(short)=sizeof(int)=2っていう設定のトンデモコンパイラがあるらしい。 一応、C言語の規格上これは間違っていない。(型のサイズは決められてないからね。)
416 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 23:39:37 ] kwsk
417 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 23:49:13 ] sizeof(char)=2は規格上まずいだろ
418 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 00:00:53 ] >>415 >>206
419 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:43:58 ] もちろん、Cでもsizeof(char)は1だと明確に定められてるから。よろしく。
420 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 15:02:18 ] >>415 「だから sizeof(char) は省略すべきではない」という主張?...でもなさそうだな。 このスレタイは「必ず1でも」って条件付きだから関係ないよね。
421 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 15:50:12 ] 無次元の1と1バイトって同一視して話していいんだっけ。
422 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 16:21:03 ] 数学で毎回全ての問題の全ての数字に (注意:これは10進数) みたいな但し書きをかかれるようなものだろ。
423 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:20:15 ] 415はsizeof(char)が2になるトンデモコンパイラをはやく晒してくれ
424 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 00:01:05 ] 論理1バイトが物理2バイトだったらどうか。 自分でも書いててよくわからんが。
425 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 01:23:46 ] >>424 charが、1バイトが、16ビットの可能性はあるかもしれない それでも1バイトは1バイトだ
426 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 01:47:50 ] >>419 それどこに書いてる? ISOかJISの規格票のどちらかでいいから教えて
427 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:04:21 ] >>426 ISO/IEC 9899とか。 ついでにググったらすぐ出てきた 6.5.3.4 The sizeof operator の抜粋な 2. The sizeof operator yields the size (in bytes) of its operand.... 3 When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1.
428 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:22:05 ] なるほど さんくす
429 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 20:00:42 ] >>415 > ところで、sizeof(char)=sizeof(short)=sizeof(int)=2っていう設定のトンデモコンパイラがあるらしい。 > 一応、C言語の規格上これは間違っていない。(型のサイズは決められてないからね。) それどこが出してる? 製品名と会社のweb siteのどちらかでいいから教えて
430 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 21:04:48 ] >>429 ひょっとしたら、sizeof(char*)=sizeof(short*)=sizeof(int*)と完治害してんじゃね?
431 名前:デフォルトの名無しさん [2008/01/21(月) 00:49:50 ] 未だにsizeof(char)を書いてる人っているの?
432 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:54:36 ] javaのcharは2バイトって聞いたぜ。 …どうでもいいか。
433 名前:デフォルトの名無しさん [2008/01/21(月) 19:55:24 ] Cプログラマの為に、ポイントをまとめたドキュメントを販売しています。 プロのプログラマでもあまりにレベルが低い人が多すぎます。 そんな人に限って、自分のレベルの低さを自覚していない、、、 本人は構わないかもしれませんが、その下についた新人プログラマは たまったものではありません。(私が経験しました。) 今になって分かりました。 彼らもまた、理解できていなかったのです。 プログラミング言語の一番の習得の近道はきちんと理解している人にアドバイスをもらうこと。です。 (何といったって、参考にしようとする市販の本さえ、 きちんと説明してくれていないのですから、 その証拠にC言語の学習で悩む人がどんなに多いことか) 私のC言語に取り組んだ7年間をすべてぶつけたつもりでテキストを作りました。 私の会社の後輩からは、どんなテキストよりもわかりやすかった!や、 今まで教えてくれていた先輩や、テキストたちが、ちゃんと理解できていないことがわかりました。 と、嬉しいコメントをたくさんもらいました。 そしてなにより、彼らの社内での評価がとても高いということが、私の誇りです。 宣伝と言ってしまえば、そうなってしまうかもしれませんが、ひとりでも多くのプログラマを救いたい。 プログラムの世界そのものの実力を底あげに貢献し、 無意味なバグに、残業したり、悩んだりして欲しくないのです。 興味がある方はどうか、下のサイトをみてみてください。 mori.eco.to/
434 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 20:09:56 ] >コンピュータの専門学校に入学、在学中に情報系の国家試験である、基本情報処理技術者、ソフトウエア開発を取得。 専卒かよ。
435 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 00:51:04 ] >>433 ブラクラ注意
436 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 02:12:26 ] 専門学校wwwwwwwwwwwwwwwwwwwwwwwwww
437 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:45:03 ] >>431 templateで間接的になら
438 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:38:06 ] sizeof (TCHAR)で間接的になら
439 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:22:32 ] >>435 おいおい、ブラクラではなかったぞ。 >>434 学歴は関係ないと思う。 8,800円払って中身みたわけではないのだが、 大学の教授が書いているC言語入門書にも、 とんでもなく酷い本があるのだから、 もはや学歴や肩書きは関係ないと思うのよ。 BASIC時代のPRINTをそのまま引きずった、 printf("Hello, world\n"); なんてのが平然と書かれている本を見るたびに、 こんなので勉強したら無駄な時間を食うのは当然だなと思うし。
440 名前:デフォルトの名無しさん [2008/03/21(金) 02:42:30 ] >>439 Hello,worldは基本中の初歩であって これをバカにする理由が思い当たらないんだが
441 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 02:51:38 ] puts("hello world"); ってやるべきってこと?
442 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 03:12:25 ] そんなことを言い出したらフォーマット文字列の中に 足がすくんじゃって何も書けなくなってしまうわけだが
443 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 03:17:33 ] 正統派の基本を馬鹿にするのは新しいまがいものを売るときの基本 結局同じことの繰り返しになるわけだが
444 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 03:35:57 ] 30年間でほとんど進歩してないな。 マイクロソフトの新しいバージョンのVisual C++が出る度に、まっさきに、 Visual C++ バージョンほげほげ対応 という冠を付けた本が出るのだが、 いまだに本編は相変わらず昔のままで、付録的に コンソールで cc hoge.c とやってコンパイルするのと同等のことをやる方法を ちょろっと書いているだけで、Visual C++のデバッガの使い方を説明せず、 変数の値をprintfを埋め込んで標準出力に出して確認することを第一に教えている。
445 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 03:39:09 ] >>442 それが正しい。 printfの第一引数が書式化文字列であるとういことを初手から叩き込むべき。 printf("%s\n", "hello, world!"); これくらい、わざとらしくやってもいいくらいだ。 そうでもしないと、↓みたいなことをやるマヌケが出てくるからな。 void print_message(const char *p) { printf(p); }
446 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 16:48:42 ] 中身をみないで擁護できるのは本人だけ。
447 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 17:00:16 ] 入門書の何が問題かというと、「ポインタがわかりません」なんて人を今だに量産していること。 しかも、そこに書かれていることが、次の段階の本で否定されていたりする。
448 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 21:15:11 ] >>439 どうやって文字列が表示されるのかを勉強している身としてはとてもバカにできない内容なんだが、 どういう内容を載せるべきだと言ってるのか教えて欲しいな。
449 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 22:15:53 ] printfは、C言語の仕様の一部ではあるものの、ライブラリの一関数に過ぎない。 printfやscanfの使い方は、ライブラリのマニュアルを読めばわかることであって、 入門書で解説すべきなのは、それらの使い方ではなく、 マニュアルを読めばわかるようになるための必要な前提知識である。 ってなことを頭の片隅に置いて聞いて欲しい。 hello, worldのサンプルなんだけど、なんかC言語っぽくないんだよね。 短くてエッセンスが凝縮されているサンプルが思いつかないんだけどさ。 >>448 > どうやって文字列が表示されるのかを勉強している C言語とはあまり関係ないなぁ。 ライブラリがOSのシステムコールを呼んで、あとはOSが処理してる。
450 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 05:04:58 ] CもようやくOSを意識しないでプログラムを組める時代になったのか
451 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 03:19:41 ] >>450 ないよ。
452 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 03:37:29 ] >>445 という以前に、フォーマット文中に誤った引数が指定できて、しかも その間違いがコンパイラでも内部処理でも検知できないっていう printfの仕様上の欠陥があるわけで、そもそもprintfを使うことそれ自体が NGだという話になるんじゃないの?
453 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 04:14:43 ] それを言いはじめたら、標準ライブラリの多くの文字列がらみの関数がNGになるよ。 たとえばstrcpyがバッファオーバーランしうる、とか。 そもそも、 今さらC言語を使わないといけない、しかも、習得するプログラミング言語の最初がC言語でなければならない っていう状況に閉じ込められた時点で、その人は終わっていると思う。
454 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 11:02:22 ] 除算も同じ意味でNGだな
455 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 12:01:53 ] プログラム言語だけでプログラムが動くわけじゃないからな
456 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 14:37:08 ] >>454 除算は「検知」はできるでしょ? まあ、言いたいことはわかるけど。
457 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 17:53:21 ] printfの引数不正も検知できますよ。 除算よりは面倒ですが。