Tips & Information 今回のお題:
『C(++) 言語まわりのメモ』


●序

ハマったポイント、便利なツール、トリッキーなコード、などなど。

●内容

Visual C++ で M_PI

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");

make のエラー

$(TARGET): $(OBJ)
	$(CC) $(CFLAGS) -o $(TARGET) $(OBJ)
	./$(TARGET)

のような makefile があったとする。 生成コマンドを使ってテストまでやる場合などである。

$(TARGET) を make したら、実行結果の末尾に

make: *** [foo] Error 22

(foo はターゲット名)みたいに出た場合、書いたプログラムで、 int main() なのに return で値を返してないことが疑われる。 return 0; とか追加しよう。


printf() の桁揃え

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 なんかでこれを応用すると、 「小数点以下の指定した桁で四捨五入」とかいうこともできる。


戻る