第1章 スタイル
変数名や関数名はオブジェクトのラベル。その目的について情報を伝える。
グローバル変数にはわかりやすい名前を、ローカルには短い名前をつける
例:
ループインデックス i, j
ポインタ p, q
文字列 s, t
関数名には能動的な名前をつける
能動的な動詞+名詞
getTime()
isOctal()
構造がわかるようにインデントしよう
自然な形の式を使う
カッコを使って曖昧さを解消する
明快に書こう
目的はあくまでも明快なコードを書くことであって、小賢しいコードを書くことではない
明快さと短さは同義ではない。「?:」を使って良いケース
max = (a > b) ?: a: b;
副作用に注意する
++演算子の副作用に注意
一貫性はより優れたプログラムをもたらす。
インデントとブレースのスタイルを統一しよう
1つのスタイルを選んでそれを一貫して利用すればいい。議論するのは時間の無駄。
慣用句によってっ完成を確保しよう
forの例
for(i = 0; i < n; i++) array[i] = 1.0
・Cでリストをたどる標準的なループ
for(p = list; p != NULL ; p = p->next){
...
}
・無限ループ
for(;;){}
while(1){}
・文字列コピー
strlenは文字列の終端を示す\0を勘定に入れないが、strcpyはそれも一緒にコピーする。
p = malloc( strlen(buf) + 1); strcpy(p, buf);
ANSI Cの標準ではないがstrdupというライブラリを使うのもあり。
多分木の判定にはelse-ifを使う。
switch文(必ずbreakを必要とする文)ならば、else-if文を使ったほうが分かりやすさは向上する。
switch文の落下の技を利用するのは、数個のcaseに同一の小ど~をが使われる場合
case '0': case '1': case '2': … break
関数マクロは使わない
関数マクロの短所は長所を上回っている。
マジックナンバーには名前をつける
0、1以外のすべての数字は大芸がマジックナンバー
数値はマクロではなく定数として定義する
C/C++ではenum文で定義できる
enum{
MINROW=1,
MINCOL = 1,
MAXROW = 24,
MAXCOL = 80
};
数値の定義としてC++ではconstを用いてできるが、Cでは、constで定義した変数を配列の境界値として利用できないので、選択しとしてenumを利用する
整数ではなく定数を利用する?
str=NULL; name[i] = '\0'; x=0.0
オブジェクトサイズは言語に計算させる
char buf[1024]; fgets(buf, sizeof(buf), stdin);
宣言が可視の配列の時は下記のマクロで要素数を計算できる
#define NELEMS(array) (sizeof(array) / sizeof(array[0])) double dbuf[100]; for(i=0; i< NELEMS(dbuf); i++)
実際に計算が実行されるのはプログラムのコンパイル時。
*これこそマクロの正しい使い方
当たり前のことはいちいち書かない
注意すべき細かい点に完結に触れたり、もっと大きな視野で処理を解説することでプログラムの理解を助長するようなコメントがベスト
コメントは、コードを見てもすぐにはわからない情報を付け加えたり、ソースのあちこちに散らばっている情報を1ヶ所にまとめる役割を果たさないとならない。
関数とグローバルデータにコメントをする
struct State {/*プレフィックス+サフィックスリスト*/
char *pref[NPREF]; /*プレフィックス用の単語*/
Suffix *suf; /*サフィックスのリスト*/
State *next; /*ハッシュテーブル中の次の項目*/
}
-否定演算子はわかりづらいので避けること。
-変数名resultは役に立つ情報を含んでいない。
コメントは、コードと矛盾させるな
あくまでも明快に、混乱を招くな
参考文献
ープログラミング書法
ーコードコンプリート・完璧なプログラミングを目指して、
ーエキスパートCプログラミング;知られざるCの深層