ハマったポイント、便利なツール、トリッキーなコード、などなど。
Microsoft Visual C++ では、math.h に定数 M_PI が定義されていない (K&R に載っていないところを見ると、別に標準ではなかったらしい)。
次のようにするとよい。「定数 M_PI は使いたいけど、別に math.h を include するほどのことはない」とかいう場合にもどうぞ。
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
三項演算子は、関数の引数なんかにも書ける。
int n;
scanf("%d", &n);
printf("%s\n", n % 2 ? "odd" : "even");
$(TARGET): $(OBJ)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJ)
./$(TARGET)
のような makefile があったとする。 生成コマンドを使ってテストまでやる場合などである。
$(TARGET) を make したら、実行結果の末尾に
make: *** [foo] Error 22
(foo はターゲット名)みたいに出た場合、書いたプログラムで、 int main() なのに return で値を返してないことが疑われる。 return 0; とか追加しよう。
printf("%5d", 123);
とすると 5 桁右揃えで数値 "123" が出力されるのは基本。
printf("%*d", 5, 123);
と、この桁指定を引数でできるのはあまり知られていない。
printf("%0*d", 5, 123);
とすれば、0 で桁を埋めることもできる。
また、実数を表示する際に、
printf("%5.2f", 1.2345);
とすると、 「全体の表示で 5 桁使い、そのうち 2 桁を小数点以下の数の表示に使う」 という意味になる。つまり、左から 2 桁目に "1" が来る。 "."(小数点)で一桁使うので、考えるときは注意。
ただし、このような指定を変数からすることはできない。
printf("%*f", 5.2, 1.2345); /* ふっ飛ぶ */
K&R を見れば載っているが、変数から指定できるのは整数値だけである。 上のようにしたい場合は、多少の制限はあるが、以下のようにするとよい。
sprintf(buf, "%%%.1ff\n", 5.2); /* 10 桁以上を指定することができない */
printf(buf, 1.2345);
perl なんかでこれを応用すると、 「小数点以下の指定した桁で四捨五入」とかいうこともできる。