一部のマクロステートメントでC ++で予期しない結果が生じることがありますか?

どのマクロステートメントが予期しない結果を引き起こす可能性がありますか?

#define YEAR_LENGTH   365
#define MONTH_LENGTH  30
 #define DAYCALC(y, m, d) ((y * YEAR_LENGTH) + (m * MONTH_LENGTH) + d)

 int main()
 {
    int x = 5, y = 4 , z = 1;
    cout << DAYCALC(x *3 , y %3 , z) << endl ;
    cout << DAYCALC(x +12 , y  , 300) << endl ;
    cout << DAYCALC(x , 40 - y , 3+z) << endl ;
    cout << DAYCALC(x  , y  , (z+50)) << endl ;
    cout << DAYCALC(x  , y %3 , z) << endl ;
    cout << DAYCALC(4 % x , y++ , z) << endl;
    return 0;
 }

私は予期せぬ結果を伴わずにプログラムをうまく実行します。

いくつかの隠れた例外はありますか?

ベストアンサー

オペレータの優先順位の問題があります。マクロは文字通りテキストコピーとペーストとして展開されます。

例えば:

DAYCALC(x , 40 - y , 3+z)

次のように展開されます:

((40 - y * YEAR_LENGTH) + (x * MONTH_LENGTH) + 3+z)

40 -y * YEAR_LENGTH は、演算子の優先順位のために必要なものではありません。

したがって、マクロ内のパラメータの周りに()を配置する必要があります。

#define DAYCALC(y, m, d)     (((y) * YEAR_LENGTH) + ((m) * MONTH_LENGTH) + (d))

一般に、マクロパラメータがマクロ内で複数回出現する場合、(最後のステートメント内の) y ++
などの副作用も複数回適用されます。だからそれは慎重になるべきことです。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です