您可以在C中使用阶乘宏吗?

金眼镜蛇1986

我正在寻找阶乘宏的示例。我找不到任何有效的方法。没有特定原因吗?这是因为C的实现吗?

因此,为了使问题更清楚……。我无法在C的编程语言中找到阶乘宏。我知道您无法在宏中进行递归,但是有一种方法可以具有迭代阶乘函数。为什么在C中不可能有阶乘宏?

作为参考,这里是我发现阶乘函数的迭代实现的示例:

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

这是一个进一步理解C语言及其使用宏的问题

请解释为什么这个问题被否决。更好地理解C是一个问题。

chqrlie

在一般情况下,我想不出一种使它成为宏的方法,因为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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

您可以在C ++中使用Java Swing吗

来自分类Dev

您可以在getElementById中使用通配符吗?

来自分类Dev

您可以在getElementById中使用通配符吗?

来自分类Dev

您可以使用#define宏在C中创建文件吗?

来自分类Dev

您可以在C / C ++ include指令中使用环境变量吗?

来自分类Dev

您可以在UWP的C#代码中使用C ++ DLL吗?

来自分类Dev

您可以在C / C ++ include指令中使用环境变量吗?

来自分类Dev

您可以在c ++中的抽象类中使用抽象函数吗?

来自分类Dev

您可以在C#中使用太多新实例来引起内存问题吗?

来自分类Dev

您可以在C中使函数参数指向变量吗?

来自分类Dev

您可以在RESTFUL环境中使用NodeJs Passport会话吗?

来自分类Dev

您可以在Restangular中使用多个变量构建URL吗?

来自分类Dev

您可以在页面中使用Jekyll布局变量吗?

来自分类Dev

您可以在Visual Studio 2012中使用SignalR吗?

来自分类Dev

您可以在WPF应用程序中使用jQuery吗?

来自分类Dev

您可以在secrets.yml中使用'<<:* default'吗?

来自分类Dev

您可以在Bootstrap 2.3中使用面板吗

来自分类Dev

您可以在JBehave中使用TestNG的dataprovider吗?

来自分类Dev

您可以在Golang中使用SQLite ATTACH和DETACH吗

来自分类Dev

您可以在Swift中使用FBSnapshottestcase库吗?

来自分类Dev

您可以在离线Intranet环境中使用Cordova吗?

来自分类Dev

您可以在Qt Creator中使用环境变量吗?

来自分类Dev

您可以在PHP数组键中使用逗号吗?

来自分类Dev

您可以在Laravel中使用OR方法在何处作为序号吗?

来自分类Dev

您可以在Python中使用日期时间求和吗?

来自分类Dev

您可以在Angular 2中使用独立指令吗?

来自分类Dev

您可以在R中的函数中使用嵌套参数吗?

来自分类Dev

您可以在交换机中使用OR吗?

来自分类Dev

您可以在CSS速记属性中使用Sass变量吗?

Related 相关文章

  1. 1

    您可以在C ++中使用Java Swing吗

  2. 2

    您可以在getElementById中使用通配符吗?

  3. 3

    您可以在getElementById中使用通配符吗?

  4. 4

    您可以使用#define宏在C中创建文件吗?

  5. 5

    您可以在C / C ++ include指令中使用环境变量吗?

  6. 6

    您可以在UWP的C#代码中使用C ++ DLL吗?

  7. 7

    您可以在C / C ++ include指令中使用环境变量吗?

  8. 8

    您可以在c ++中的抽象类中使用抽象函数吗?

  9. 9

    您可以在C#中使用太多新实例来引起内存问题吗?

  10. 10

    您可以在C中使函数参数指向变量吗?

  11. 11

    您可以在RESTFUL环境中使用NodeJs Passport会话吗?

  12. 12

    您可以在Restangular中使用多个变量构建URL吗?

  13. 13

    您可以在页面中使用Jekyll布局变量吗?

  14. 14

    您可以在Visual Studio 2012中使用SignalR吗?

  15. 15

    您可以在WPF应用程序中使用jQuery吗?

  16. 16

    您可以在secrets.yml中使用'<<:* default'吗?

  17. 17

    您可以在Bootstrap 2.3中使用面板吗

  18. 18

    您可以在JBehave中使用TestNG的dataprovider吗?

  19. 19

    您可以在Golang中使用SQLite ATTACH和DETACH吗

  20. 20

    您可以在Swift中使用FBSnapshottestcase库吗?

  21. 21

    您可以在离线Intranet环境中使用Cordova吗?

  22. 22

    您可以在Qt Creator中使用环境变量吗?

  23. 23

    您可以在PHP数组键中使用逗号吗?

  24. 24

    您可以在Laravel中使用OR方法在何处作为序号吗?

  25. 25

    您可以在Python中使用日期时间求和吗?

  26. 26

    您可以在Angular 2中使用独立指令吗?

  27. 27

    您可以在R中的函数中使用嵌套参数吗?

  28. 28

    您可以在交换机中使用OR吗?

  29. 29

    您可以在CSS速记属性中使用Sass变量吗?

热门标签

归档