2016-11-22 12 views
0

私は階乗マクロの例を探しています。私は動作するものは何も見つけられません。特定の理由はないのでしょうか?これはCの実装のためですか?Cで階乗マクロを使用できますか?

質問をより明確にしようとする.........私はCのプログラミング言語で階乗マクロを見つけることができませんでした。マクロ内で再帰を行うことはできませんが、反復階乗関数を持つ方法です。なぜCで、階乗マクロを持つことができないのですか?参考のため

ここでは、私は階乗関数の反復的な実装で発見した例です。

int factorial(int N) { 
    int product = 1; 
    for (int j = 1; j <= N; j++) 
     product *= j; 
    return product; 
} 

このことはさらに、C言語を理解する問題であり、それはマクロ

の使用ですしてください質問が投票された理由を説明してください。それはCを理解するための質問です。 N > 12int場合は32ビットであるため、それは未定義の動作を呼び出します。私はそれ一般的なケースではマクロにする方法を考えることはできません

+1

なぜ機能ではなくマクロが必要なのですか? – Peter

+0

どこ? ** N **、** Z **、** R **、または** C ** **では、 – deamentiaemundi

+0

私は言語自体をよりよく理解したいと思っています – kingcobra1986

答えて

2

は、あなたの階乗関数が定義されているint非常に少ない値がある置きます。また

static int const factorials[13] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 
            362880, 3628800, 39916800, 479001600 }; 
#define FACT(n) ((n) < 0 ? 1 : (n) > 12 ? INT_MAX : factorials[n]) 

#define FACT(n) ((n) <= 1 ? 1 : \ 
       (n) == 2 ? 2 : \ 
       (n) == 3 ? 6 : \ 
       (n) == 4 ? 24 : \ 
       (n) == 5 ? 120 : \ 
       (n) == 6 ? 720 : \ 
       (n) == 7 ? 5040 : \ 
       (n) == 8 ? 40320 : \ 
       (n) == 9 ? 362880 : \ 
       (n) == 10 ? 3628800 : \ 
       (n) == 11 ? 39916800 : \ 
       (n) == 12 ? 479001600 : INT_MAX) 

注これらの両方がnを複数回評価することを

がここにこれを利用する多くの方法があります。

インライン関数は、はるかに良いアプローチです。あなたのfactorial()は、近代的な最適化コンパイラに一定の引数に定数にコンパイルされることがありますfactorial機能は、Intel SIMDの計り知れない235行にコンパイル

短い例打ち鳴らす3.9 -O2とMatt Goldberg's online compilerを使用して非常に有益ですコードint test(void) { return factorial(12); }はわずか2命令生成しつつ:-O1 10はるかに小さいためであっても-Osとサイズを最適化することはあまりにも大きい、アセンブリコードの49行を生成

test():        # @test() 
     mov  eax, 479001600 
     ret 

ライン。

関連する問題