C言語の誤解されていそうなことについて
C言語には、字面から常識的に類推したことと実際のキマリが合わない場合がままあり、
慣れない入門者や他の言語の利用者からすると誤解しそうなことが結構ある。
そういったこと(の一部)を以下に列挙。
[追記2012]
これ書いたときはまだC99は決まってなかったこともあり、
基本的に C89 の話です。C99以降にかわってしまってる件もあり。
文法関係
- main の戻り値の型は void でなく int。(*) (※ c++やc99以降は事情が多少変わった)
- 関数定義で戻り値の型名を省略すると void でなくint。(*)
- Cでは引数省略の関数定義fnc()はfnc(void)でなくfnc(...)。(*)
- char,shortの値は演算や関数引数でまずintに変換される
- 整数の基本はint, 実数の基本は(どちらかといえば)floatでなくdouble.(*)
- char, signed char, unsigned char はそれぞれ別の型
- Cではconst int LBL=1;は読出専用変数. 定数定義は#define,enumで.(*)
- 配列定義のサイズ/添字は定数. 変数は指定できない.
- a ^ b は乗数計算でなく、排他的論理和という演算(*)
- sizeof は関数でなく演算子.(*)
- ビット演算やシフト演算の演算順位は勘違いしやすい(*)
- struct ST {…}; と定義しただけでは、(struct ST) と (ST) は違う型
- (SJISの時) 半角カタカナ文字定数 'ア' は 0xB1 でなく -79 の場合がある.
- int a;のとき a % 256 は a & 0xFF と同じにならない(負数の余りの問題)
ライブラリ関係
その他
- #define で(,IF,FOR などを定義して)別言語を作らない(*)
- C言語で書いたからといって移植し易くなるわけではない(*)
- .h の中に初期値のある変数定義や関数を置かない
1999-06-20
(※Cプログラミング講座的なものを書いてて挫折した、その残骸^^;)