C言語の誤解されていそうなことについて
C言語には、慣れない入門者や他の言語の利用者からすると
誤解しそうなことが結構ある。
字面や常識的に類推したこととC言語でのルールが合わない
ために思いこんでしまったり(いわゆる、C言語の落とし穴)。
こういうのはC言語の欠点だし重箱の隅をつつくようなことでもあり、
プログラムを組む上で知らなくても済ませられることもあるけれど、
しかしデバッグ時に勘違いしていてバグに気づけない等の問題を考えれると、
知らないとマズイなとも思う。
以下に、人(とくに入門者)によっては勘違いしているかもしれない、
そのような事柄について書き出してみます。
(もちろん間違わないように気をつけてるつもりだけど、
思いこんだらをよくする人間なんで問題のある記述を見つけたとき
は教えていただけると助かります)。
文法関係
- main の戻り値の型は void でなく int。(*)
- 関数定義で戻り値の型名を省略すると void でなくint。(*)
- Cでは引数省略の関数定義fnc()はfnc(void)でなくfnc(...)。(*)
- char,shortの値は演算や関数引数でまずintに変換される
- 整数の基本はint, 実数の基本は(どちらかといえば)floatでなくdouble.(*)
- char, signed char, unsigned char はそれぞれ別の型
- Cではconst LBL=1;は読出専用変数. 定数定義は#define,enumで.(*)
- 配列定義のサイズ/添字は定数. 変数は指定できない.
- 0で始まる数値は 8進数.(*)
- a ^ b は乗数計算でなく、排他的論理和という演算(*)
- sizeof は関数でなく演算子.(*)
- ビット演算やシフト演算の演算順位は勘違いしやすい(*)
- struct ST {…}; と定義しただけでは、(struct ST) と (ST) は違う型
- 半角カタカナ文字定数 'ア' は 0xB1 でなく -79 の場合がある.
- int a;のとき a % 256 は a & 0xFF と同じにならない(負数の余りの問題)
ライブラリ関係
その他
- #define で,IF,THEN,FOR などを定義して別言語を作らない(*)
- C言語で書いたからといって移植し易くなるわけではない(*)
- .h の中に初期値のある変数定義や関数を置かない
1999-06-20
(※Cプログラミング講座的なものを書いてて挫折した、その残骸^^;)