サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ドラクエ3
www.kouno.jp
13.1: どうすれば数を文字列に変換することができるか(atoiの反対)。関数 itoaというのは存在するのか。 A: なにも考えずにsprintf()を使え。(「sprintfはやりすぎだ。実行時 間とコード領域を無駄遣いする。」という声は無視すること。とにか く動くんだから。) 質問7.5の解答内の例を参照のこと。質問12.21も 参照のこと。 すぐわかるようにsprintf()を使えばlongや浮動小数点数も文字列に 変換することができる。 References: K&R1 Sec. 3.6 p. 60; K&R2 Sec. 3.6 p. 64. 13.2: なぜstrncpy()はコピー先の文字列に、終端文字の'\0'を付けないこ とがあるのか。 A: 元々はstrncpy()は、今となっては時代遅れになってしまったデータ 構造、すなわち固定長で必ずしも\0で終わるとは限らない"
14.1: 浮動小数点の変数を、例えば3.1に設定すると、どうしてprintf()は 3.0999999と出力するのか。 A: たいていのコンピューターは浮動小数点の数に、整数にと同じように、 2進数を用いている。2進数の1/1010(これは10進数では1/10)は無限循 環小数となる。2進表現は0.0001100110011...となる。コンパイラー の2進/10進変換ルーチン(たとえばprintf()で使われているもの)がど れくらい注意深く作られているかによって、2進数では正確に表現で きない数が(特に精度の低い浮動小数が)代入されたり読み込まれて出 力されると(すなわち、2進から10進に変換し、10進から2進に変換し なおすと)食い違いが生じるかもしれない。質問14.6も参照のこと。 14.2: 平方根を求めようとしている。けれど、とんでもない数字が返ってく る。 A: まず<ma
3.1: なぜ以下のコードはうまく動かないか。 a[i] = i++; A: i++は副作用をもたらす。つまりiの値を変更する。式の他のところで iが参照されているので、このことが未定義の振舞いを引き起こす (K&Rの言い回しではこの式の振る舞いは不定であると取れるが、C規 格は一段と厳しく未定義であるとしている。-- 質問11.33を参照のこ と)。 References: K&R1 Sec. 2.12; K&R2 Sec. 2.12; ANSI Sec. 3.3; ISO Sec. 6.3. 3.2: 私が使っているコンパイラでは以下のコードで49を出力する。 int i = 7; printf("%d\n", i++ * i++); 評価の順にかかわりなく、56を出力するのではないのか。 A: 後置増分演算子++も後置減分演算子--も元の値を返した後で、その演 算を行う。この"後"の
1.1: どの整数型を使えばよいか、どうやって決めればよいか。 A: 大きな値(32767より大きな値か、-32767より小さい値)が必要なら longを使う。もしメモリの効率を気にするなら(例:大きな配列がある とか構造体がたくさんあるなど)shortを使う。どうでもいいならint を使う。オーバーフローの時の性質の明確なことが大事で負の値が不 要なら、対応する符号なしの整数を使え(ただし符号付と符号なしの 整数の混在には注意すること)。 文字データ型を(特にunsigned charを)"小さな"整数として使うこと はできるが、そうすることによる予想不能な符号拡張の問題とコード サイズの増加を考えると、その価値よりも伴う面倒のほうが大きくな る場合がある。(unsigned charを使うことは助けになる。関連する問 題については質問12.1を参照のこと) 同じような空間と処理時間を天
12.1: なぜ以下のコードはうまく動かないのか。 char c; while((c = getchar()) != EOF) ... A: getchar()の戻り値を格納する変数はintでなければならない。 getchar()は、文字型のあらゆる値を返すだけでなくEOFも返す。 getchar()の戻り値をcharで渡すと、普通の文字が返ってきたのにEOF と誤解されたり、EOFが他の値に変えられて(特にデータ型charが符号 なしの場合)、いつになってもEOFが出てこないかもしれない。 References: K&R1 Sec. 1.5 p. 14; K&R2 Sec. 1.5.1 p. 16; ANSI Sec. 3.1.2.5, Sec. 4.9.1, Sec. 4.9.7.5; ISO Sec. 6.1.2.5, Sec. 7.9.1, Sec. 7.9.7.5; H&S Se
5.1: そもそもこの悪名高いヌルポインターとは何か。 A: C言語の定義によればどんなポインターの型にも特別な値、すなわち 「ヌルポインター」が存在する。このヌルポインターは他のどんなポ インターの値とも区別可能で、「いかなるオブジェクトや関数へのポ インターと比較しても等しくなることがないことを保証されている」。 すなわちアドレス演算子&を適用した結果がヌルポインターとなるこ ともない。またmallocの呼び出しに成功した場合の戻り値がヌルポイ ンターの場合もない(mallocは領域確保に失敗した場合にヌルポイン ターを返す。これがヌルポインターの典型的な使い方である。その値 によりアドレス以外の意味をあらわす特別なポインターの値で、たと えば「領域確保の失敗」とか、まだ「何も指していない」のような意 味を持つ)。 ヌルポインターは、初期化されていないポインターと考え方で異なる。 ヌル
20.1: 関数から複数の値を返すことはできるか。 A: 値を格納する領域をいくつか起動する側で用意して、それらの領域を 指すポインターを引数として渡し、関数にポインターの先に値を埋め てもらう。あるいは、関数の戻り値を構造体にして、その構造体に希 望の値を設定してもらう。あるいは(最後の最後の手として)global変 数を使うことを考える。質問2.7, 4.8, 7.5を参照のこと。 20.3: コマンド行の引数をどうやって手にいれることができるか。 各引数は配列argvによって指されている。main()はargvを引数として 起動される。 References: K&R1 Sec. 5.11 pp. 110-114; K&R2 Sec. 5.10 pp. 114- 118; ANSI Sec. 2.1.2.2.1; ISO Sec. 5.1.2.2.1; H&S Sec. 20.1 p
6.1: あるソースファイルでchar a[6]と定義して、別のファイルでextern char *aと宣言した、なぜこれはうまくいかないのか。 A: extern char *aという宣言が、実際の定義と食い違うからである。 「タイプTへのポインター」は「タイプTの配列」とは異なる。extern char a[]を使え。 References: ANSI Sec. 3.5.4.2; ISO Sec. 6.5.4.2; CT&P Sec. 3.3 pp. 33-4, Sec. 4.5 pp. 64-5. 6.2: でもchar a[]はchar *aと同じと聞いたことがあるが。 A: 全然別のものである(君が聞いた話というのは、関数の仮引数の話だ。 質問2.4参照)。配列はポインターと違う。配列の宣言「char a[6]」 は6文字分の領域を確保して、それを「a」という名前で識別すること
[1996年2月26日変更 北野 欽一] (訳注:1995年9月4日版に基づく(頭に[Last modified September 4, 1995 by scs.]とあるもの)) [1996年2月26日変更 北野] [Last modified September 4, 1995 by scs.] この記事の著作権は1990年から1995年に渡ってSteve Summitに帰属する。書籍 『C Programming FAQs: Frequently Asked Questions』の内容を著者と出版社 の許可の元、社会への貢献のために使用している。このFAQは書籍版を補足す ることを意図としている。内容は各国の著作権法によって守られる。 (訳注:日本語版の著作権は北野 欽一に帰属する。) 注意: 当FAQは1995年9月に大改訂を行った。章の再構成を行い、すべての問題 の番号を振りなお
10.2: 見て見て下の気のきいたマクロ。 #define begin { #define end } どう思う。 A: ゲーッ。17章も参照のこと。 10.3: 二つの値を交換する汎用のマクロは。 A: この質問の確かな解答はない。もしも値が整数なら有名な排他論理和 を使った技を使うことができる。しかし、この技も浮動小数点表示の 数やポインターには使えない(整数の場合も同一の変数を二つの引数 として指定することはできない)。また整数型の"誰でもわかる"極端 に詰め込んだコードa^=b^=a^=bも、副作用が複数回起こることにより 厳密にいえば文法違反である)。もしマクロを任意の型の値に使いた いなら(普通はこれが目的である)、一時変数を使うことはできない。 なぜなら、どの型の一時変数が必要かわからないからである(もし一 時変数が使えたとしても、変数の名前の付けかたに苦労するだろう)。 標
C言語 FAQ 日本語訳 このページは北野 欽一さんが日本語訳されたC FAQをHTML化したものです。 著作権等に関しては「C言語FAQと日本語版について」をご覧ください
このページを最初にブックマークしてみませんか?
『www.kouno.jp』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く