C/C++ Edit

for文のループ回数 Edit

  • 悪い例
      1
      2
      3
    
        for(int i=0; i<obj.GetLength(); i++){
            // 処理
        }
    obj.GetLength()が毎回評価されてしまうため、obj.GetLength()で重い処理を行っている場合に問題となる。
  • 良い例
      1
      2
      3
    
        for(int i=0, length=obj.GetLength(); i<length; i++){
            // 処理
        }
    変数 length のスコープもforブロック内のみとなることがポイント。

2次元配列の動的メモリ確保 Edit

5*10のint型配列変数の確保の例

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
    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;             // 解放

※多次元配列も同様のイメージ。ただし、やはり一番左側の要素数以外は固定値にする必要がある。

小数点以下の四捨五入 Edit

  1
#define        ROUND(val)            ((int)((val < 0.0) ? (val - 0.5) : (val + 0.5)))

配列の要素数 Edit

  1
#define        ARRAY_SIZE(ary)    (sizeof(ary) / sizeof(ary[0]))

※要素数が明示されている配列変数にしか使えない。ポインタ表現となっている場合は期待した値とはならない。

変数の内容の標準出力(DEBUG用) Edit

  1
#define        PRINT_VAR(fmt, var)        printf(#var " = " fmt "\n", var);

値を範囲内に丸める Edit

  1
  2
    // x は 0~1000
    x = min(max(x, 0), 1000);

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-05-26 (土) 13:16:47 (2179d)