K&R C言語 入門その2

こんにちは、童爺です。
入門2日目です。
張り切っていきましょう。

今日は、参考書(下図)の内容が少し?古い為、少し訂正をさせていただきます。
また、実際にプログラムを組んでいて、実際にあったミス等も合わせて説明できればと思います。

型について

11ページに「~16ビットのintより~」と記述されていますが、Linux(Unix)は、現在lp64規格です。
すなわち、以下の様になります。

  • char 8ビット
  • short 16ビット
  • int 32ビット
  • long 64ビット
  • long long 64ビット
  • ポインタ 64ビット

となります。
また、扱える数値の範囲に関しては、/usr/include/limits.h内に記述されています。
例えば、intに関しては以下の様に宣言されています。

/* Minimum and maximum values a `signed int' can hold.  */
#  define INT_MIN	(-INT_MAX - 1)
#  define INT_MAX	2147483647

/* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */
#  define UINT_MAX	4294967295U

解りづらいと思いますが、慣れれば平気です。
intは-2147483648~2147483647まで。
符号無しのintは、4294967295です。(4294967295UのUはunsignedのUです。)

コメントについて

上記と同じく11ページにて、コメントは/**/と書かれていますが、//も使えます。
では、どう使い分けるかというと、処理の説明が1行で済むものやちょっとしたコメントは、//で。
処理の説明が複数になる場合や、処理をコメントアウトしたい場合は、/**/を使用します。

具体的に書くと以下の様になります。

#include <stdio.h>

/*
 * *fahr=0,20,・・・,300に対して、摂氏-華氏対応表を
 * *印字する
 * */
#define LOWER (0)   //温度の下限
#define UPPER (300) //温度の上限
#define STEP (20)   //きざみ
void main(int argc, char *argv[])
{
        int fahr, celsius;

            //fahrを下限で初期化する。
            fahr = LOWER;
            /*
             * fahrが上限に達するまで、
             * 華氏の温度と摂氏の温度を出力する。
             */
            while(fahr <= UPPER){
                celsius = 5 * (fahr-32) / 9;
                fprintf(stdout,"%d\t%d\n", fahr, celsius);
                fahr = fahr + STEP;
            }
}

出力結果は参考書と同じになります。

while・for・if文ついて

参考書では、while・for・if(else)文に関して構文の内容が1行の場合、{}を省略していますが、これは悪い例です。
理由は、デバックなどでログファイルを出力している際に、デバック用のLM(ロードモジュール:実行ファイルの事)では動くのに、納品用のLMでは動かないと言う、問題が度々発生するからです。
一例を挙げて見ましょう。

if(hogehoge > 300)
#ifdef DEBUG
{
	fprintf(stderr,”エラー発生”);
        return -1;
}
#endif
hogehoge++;

等としているとき、hogehogeが300より大きい場合、デバックモードではfprintf文が実行されますが、実装モードの場合、hogehoge++;文が実行されています。
1行でも{}をつける癖をつけておけば、済む問題です。
こういう問題は、開発規模が大きくなればなるほど、割と頻繁に発生します。
気をつけましょう。

switch文について

switch文のcaseの中は簡潔にするか、出来れば関数化して呼ぶようにしましょう。
そうしないと思わぬ問題に直面します。

switch文の構文は以下の感じですが、

switch(式)
{
case 定数式:文
・
・
・
case 定数式:文
default : 文
}

ですが、switch(式)の式はアセンブラにした時、intの範囲でジャンプできるアドレスまでしか扱えません。
以前、所属していたプロジェクトで上記のルールを知らなくて、switchの文をずらずらと書いて、考えていたcase文まで行かないと大騒ぎになった事があります。
今は、int(32ビット)なのかそれともポインタ(64ビット)なのか解りませんが見にくいですから、なるべく簡潔にしましょう。

まとめ

駆け足でしたが、どうでしょうか?
とりあえず第3章までで、特筆すべき点は書いたつもりですが、抜けがあるかもしれません。
何かあれば、コメントに記述していただけると幸いです。


それではまた。
でわでわ。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

童爺 童爺のプロフィール
童爺は「どうじ」と読んでください。 由来は友人に、ハンドルネームを「酒呑童子」にしようかと相談したら、「酒呑童爺」にしたらどうかと言われたのが由来です。(爺むさい所や、子供っぽいところがあるからです。)