#author("2018-05-26T13:16:47+09:00","default:mat2umoto","mat2umoto")
#contents

*C/C++ [#b6a5e9ae]
**for文のループ回数 [#o2b06a03]
-悪い例
#code(c){{
	for(int i=0; i<obj.GetLength(); i++){
		// 処理
	}
}}
obj.GetLength()が毎回評価されてしまうため、obj.GetLength()で重い処理を行っている場合に問題となる。

-良い例
#code(c){{
	for(int i=0, length=obj.GetLength(); i<length; i++){
		// 処理
	}
}}
変数 length のスコープもforブロック内のみとなることがポイント。

**2次元配列の動的メモリ確保 [#h50a3540]
5*10のint型配列変数の確保の例
#code(c){{
    int (*p)[10];   // 1つのポインタ変数であることに注意(*と[]の優先順位の関係)
                    // 「4(int型)*10」Byteの大きさのデータを指すポインタ変数の宣言
                    // *p[10]だと「4(int型)」Byteの大きさのデータを指すポインタ変数10個の"配列"になってしまう

    // malloc(), free() の場合
    p = (int(*)[10])malloc(5 * 10 * sizeof(int));   // 確保
    free(p);                                        // 解放

    // new, delete の場合
    p = new int[5][10];     // 確保
    delete[] p;             // 解放
}}
※多次元配列も同様のイメージ。ただし、やはり一番左側の要素数以外は固定値にする必要がある。

**小数点以下の四捨五入 [#ja3e963b]
#code(c){{
#define		ROUND(val)			((int)((val < 0.0) ? (val - 0.5) : (val + 0.5)))
}}

**配列の要素数 [#a2258799]
#code(c){{
#define		ARRAY_SIZE(ary)	(sizeof(ary) / sizeof(ary[0]))
}}
※要素数が明示されている配列変数にしか使えない。ポインタ表現となっている場合は期待した値とはならない。

**変数の内容の標準出力(DEBUG用) [#vce543f2]
#code(c){{
#define		PRINT_VAR(fmt, var)		printf(#var " = " fmt "\n", var);
}}

**値を範囲内に丸める [#c2e2703b]
#code(c){{
    // x は 0~1000
    x = min(max(x, 0), 1000);
}}


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS