例
#define Echo(a) a
#define Echo(a) (a)
ここではおそらく大きな違いはないと思いますが、なぜa
マクロ本体の中に括弧内を含めたいのでしょうか。それはどのようにそれを変えますか?
例
#define Echo(a) a
#define Echo(a) (a)
ここではおそらく大きな違いはないと思いますが、なぜa
マクロ本体の中に括弧内を含めたいのでしょうか。それはどのようにそれを変えますか?
あなたが持っているとしましょう
#define mul(x, y) x * y
私が言うとどうなりますか:
mul(a + 5, 6); /* a + 5 * 6 */
ここで、マクロを少し変更すると、次のようになります。
#define mul(x, y) ((x) * (y))
mul(a + 5, 6); /* ((a + 5) * (6)) */
引数は評価されないことを忘れないでください。テキストによる置換のみが実行されます。
記録のために、マクロを使用しているときに数学的なエラーを修正する方法はここから着陸しました。この回答をここで展開して、その他の回答に合わせます。
あなたは次の違いについて尋ねています:
#define Echo( a ) a
#define Echo( a ) ( a )
マクロ自体を理解していない限り、これは問題ありません(私も専門家ではありません:))。
まず第一に、あなたはすでに (おそらく) Operator Precedence があることを知っているので、この 2 つのプログラムには大きな違いがあります:
1):
#include <stdio.h>
#define ADD( a , b ) a + b
int main( void )
{
auto const int a = 5;
auto const int b = 10;
auto const int c = ADD ( 2 + a , 2 + b );
printf( "%d", c );
return 0;
}
出力:
19
と:
#include <stdio.h>
#define ADD( a , b ) ( a ) + ( b )
int main( void )
{
auto const int a = 5;
auto const int b = 10;
auto const int c = ADD ( a , b );
printf( "%d", c );
return 0;
}
出力:
15
次に、前置+
します*
:
#define ADD( a, b ) a * b
コンパイラはa * b
、たとえばa == 5
とb == 10
whichのように扱い5 * 10
ます。
しかし、あなたが言うとき:
ADD ( 2 + a * 5 + b )
ここのように:
#include <stdio.h>
#define ADD( a , b ) ( a ) * ( b )
int main( void )
{
auto const int a = 5;
auto const int b = 10;
auto const int c = ADD ( 2 + a , 5 + b );
printf( "%d", c );
return 0;
}
105
演算子の優先順位が関係しており、
2 + b * 5 + a
なので
( 2 + 5 ) * ( 5 + 10 )
これは
( 7 ) * ( 15 )
==105
しかし、あなたがするとき:
#include <stdio.h>
#define ADD( a, b ) a * b
int main( void )
{
auto const int a = 5;
auto const int b = 10;
auto const int c = ADD ( 2 + a , 5 + b );
printf( "%d", c );
return 0;
}
あなたが得る37
理由
2 + 5 * 5 + 10
つまり:
2 + ( 5 * 5 ) + 10
つまり:
2 + 25 + 10
短い答え、次の間に大きな違いがあります:
#define ADD( a , b ) a * b
と
#define ADD( a , b ) ( a ) * ( a )