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

Nan*_* HE 9 c for-loop nested c99

可能重复:
什么限制了c中嵌套循环的数量?

你好.

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

Nesting for-Loop in C can continue even further up to 127 levels!
Run Code Online (Sandbox Code Playgroud)

怎么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;
}
Run Code Online (Sandbox Code Playgroud)

miz*_*izo 13

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

5.2.4.1翻译限制

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

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

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

  • +1,我今天学到了新东西.我遇到了很多奇怪的代码,但从未嵌套到极限,这样的限制将被测试.现在我很想看看gcc附带的测试,看看他们滥用它的严重程度:) (3认同)
  • 我喜欢如何允许指针间接或功能抽象的"不幸的第13级"失败. (2认同)

Tri*_*dad 7

请参见第5.2.4.1节"转换限制"(第32页)中的C99标准.

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 */
                ...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,具有太深级别的代码会导致过大的函数,这是代码味道.