こんにちは、童爺です。
入門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章までで、特筆すべき点は書いたつもりですが、抜けがあるかもしれません。
何かあれば、コメントに記述していただけると幸いです。
それではまた。
でわでわ。