#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); }}