您好。
当我阅读我的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;
}
答案 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.但是,我确定您可以为循环嵌套的深度取决于所使用的特定编译器。