24

次の式でマクロを作成しようとしてい(a^2/(a+b))*bます。、ゼロ除算がないことを確認したいと思います。

#define SUM_A( x, y ) if( x == 0 || y == 0) { 0 } else { ( ( ( x * x ) / ( ( x ) + ( y ) ) ) * ( y ) )}

次に、main内のマクロを呼び出します。

float a = 40, b = 10, result; 
result = SUM_A(a, b); 
printf("%f", result);

if関数を角かっこで囲んでみましたが、ifステートメントの前に構文エラーが発生し続けます。私もreturnを使ってみましたが、defineでそれを使うべきではないことをどこかで読みました。

4

8 に答える 8

32

#defineはプリプロセッサによって解釈されるため、ifステートメントは使用できません。出力は次のようになります。

 result=if( x == 0 || y == 0) { 0 } else { ( ( ( x * x ) / ( ( x ) + ( y ) ) ) * ( y ) )}

これは間違った構文です。

ただし、別の方法として、三項演算子を使用することもできます。定義をに変更します

#define SUM_A( x, y )  ((x) == 0 || (y) == 0 ? 0 : ( ( ( (x) * (x) ) / ( ( x ) + ( y ) ) ) * ( y ) ))

置換時の構文エラーを回避するために、定義を常に括弧で囲むことを忘れないでください。

于 2012-10-20T14:19:37.960 に答える
6

if式ではなく、ステートメントを導入します。「三項」(条件付き)演算子を使用します。

#define SUM_A(x, y) (((x) == 0 || (y) == 0)? 0: ((((x) * (x)) / ((x) + (y))) * (y)))

または、これをinline関数にします。

inline float sum_a(float x, float y)
{
    if (x == 0 || y == 0)
        return 0;
    else
        return ((x * x) / (x + y)) * y;
}

xこれにより、および/またはの複数の評価の問題が回避され、yはるかに読みやすくなりますが、xおよびのタイプは修正されますyinlineを削除して、この関数をインライン化する価値があるかどうかをコンパイラーに判断させることもできます(inlineインライン化が実行されることを保証するものではありません)。

于 2012-10-20T14:19:35.907 に答える
1

問題は、ifステートメントが式ではなく、値を返さないことです。また、この場合、マクロを使用する正当な理由はありません。実際、これは非常に深刻なパフォーマンスの問題を引き起こす可能性があります(マクロ引数として渡すものによって異なります)。代わりに関数を使用する必要があります。

于 2012-10-20T14:20:29.643 に答える