我正在寻找阶乘宏的示例。我找不到任何有效的方法。没有特定原因吗?这是因为C的实现吗?
因此,为了使问题更清楚……。我无法在C的编程语言中找到阶乘宏。我知道您无法在宏中进行递归,但是有一种方法可以具有迭代阶乘函数。为什么在C中不可能有阶乘宏?
作为参考,这里是我发现阶乘函数的迭代实现的示例:
int factorial(int N) {
int product = 1;
for (int j = 1; j <= N; j++)
product *= j;
return product;
}
这是一个进一步理解C语言及其使用宏的问题
请解释为什么这个问题被否决。更好地理解C是一个问题。
在一般情况下,我想不出一种使它成为宏的方法,因为int
定义了阶乘函数的值很少:N > 12
如果int
有32位,它将调用未定义的行为。
这里有许多利用此功能的方法:
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()
可能会在现代优化编译器上将其编译为常量作为常量参数:
一个使用Matt bergberg的在线编译器和clang 3.9 -O2的简短示例非常有启发性:
该factorial
函数可编译为235行Intel SIMD代码,而int test(void) { return factorial(12); }
仅产生2条指令:
test(): # @test()
mov eax, 479001600
ret
即使使用大小进行优化,也会-Os
产生49行汇编代码,这太大了,因为-O1
在10行时要小得多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句