我的C书中有一个神奇的数字127

时间:2011-01-31 03:34:03

标签: c for-loop c99 nested

  

可能重复:
  What limits the number of nested loops in c?

您好。

当我阅读我的C书时,它说

Nesting for-Loop in C can continue even further up to 127 levels!

127是如何产生的?

我的书没有提到这一点。对我来说就像一个神奇的数字。

[更新]

int main()
{
    int number, n, triangularNumber, counter;

    triangularNumber = 0;

    for (counter = 1; counter <= 5; ++counter){
        printf("What triangular number do you want? \n");

        // using a routine called scanf
        scanf("%i", &number);


        triangularNumber = 0;

        for (n =1 ; n <= number; ++n)

            triangularNumber += n;

        printf("Triangular number %i is %i\n", number, triangularNumber);
    }
    return 0;
}

3 个答案:

答案 0 :(得分:13)

此号码来自ISO C标准ISO/IEC 9899:1999

  

5.2.4.1翻译限制

     

实施应该能够   翻译并执行至少一个   包含至少一个的程序   以下每一个的实例   限制:

     
      
  • 127个嵌套级别的块
  •   
  • 63条件包含的嵌套级别
  •   
  • 12个指针,数组和函数声明符(以任意组合)   修改算术,结构,   联合,或不完整的类型   声明
  •   
  • 完整声明符中的括号声明符的嵌套级别
  •   
  • 完整表达式中括号内表达式的嵌套级别
  •   
  • 内部标识符或宏名称中的63个重要的初始字符   (每个通用字符名称或   扩展源角色是   被认为是一个单一的角色)
  •   
  • 外部标识符中的31个重要初始字符(每个通用字符   字符名称指定短   0000FFFF或更低的标识符是   考虑6个字符,每个   通用字符名称指定   短标识符00010000或更多   被认为是10个字符,每个字符   扩展源角色是   考虑相同的数量   字符作为对应的   通用字符名称,如果有的话)
  •   
  • 一个翻译单元中的4095个外部标识符
  •   
  • 在一个块中声明了块范围的511个标识符
  •   
  • 同时在一个中定义4095个宏标识符   预处理翻译单元
  •   
  • 一个函数定义中的127个参数
  •   
  • 一个函数调用中的127个参数
  •   
  • 一个宏定义中的127个参数
  •   
  • 一次宏调用中的127个参数
  •   
  • 逻辑源行中的4095个字符
  •   
  • 字符串文字或宽字符串文字中的4095个字符   (连接后)
  •   
  • 对象中的65535个字节(仅限托管环境中)
  •   
  • #included files的15个嵌套级别
  •   
  • 开关语句的1023个案例标签(不包括任何案例标签)   嵌套切换语句)
  •   
  • 单一结构或工会中的1023名成员
  •   
  • 单个枚举中的1023枚举常量
  •   
  • 单个中63个级别的嵌套结构或联合定义   结构声明列表
  •   

这些是符合C编译器必须能够处理的最小值。

答案 1 :(得分:7)

See the C99 standard在第5.2.4.1节翻译限制,第32页。

C99标准为块定义了至少127级的嵌套。 AFAIK每个编译器实现都可以自由地提供比这更高的值。

一个块基本上是C函数定义中的花括号内部。并且定义块的级别从外部块向内部块计数。参见:

void myFunction() {
    int x = 2;
    /* level 1 block */
    while(1) {
        /* level 2 */
        if (x > 1) {
            /* level 3 */
            ...
        } else {
            int i;
            /* also level 3 */
            for (i = 0; i < x; ++i) {
                /* level 4 */
                ...
            }
        }
    }
}

我真的不知道该函数的主体是否实际上是 1级 0级,但这只是为了让您了解它是如何工作的

此最小值是标准保证遵循此限制的程序能够在不经修改的情况下在C语言编译器的不同实现中进行编译。

请注意,级别太深的代码可能会导致函数过大code smell

答案 2 :(得分:0)

我猜它与有符号8位整数的大小有关。有符号的8位整数可以采用的最大值是127.但是,我确定您可以为循环嵌套的深度取决于所使用的特定编译器。