在C Primer Plus中,作者说
前面提到的C99功能是作为其一部分的语句 即使大括号(即{},循环或if语句也有资格作为块 )没有使用。更完整的是,整个循环是一个子块 包含它的块,循环体是整个的子块 循环块。
我想循环体表示下面示例中的printf(...)
语句。但是这两个大胆的词语是什么意思呢? :" .. 整个循环是包含它的块的子块,..."如果你能用下面的例子解释它会很好!
for(int n =1;n<3;n++)
printf("%d \n",n);
答案 0 :(得分:4)
措辞有点严厉,但很简单:
for(int n =1;n<3;n++) // <-- loop
printf("%d \n",n); // <-- block
循环体就像你在这种情况下所说的printf()
一样,一般来说,尽量保持我的答案尽可能小,这就是格式:
for(...; ....;)
body_of_loop
当你有嵌套循环或if语句时, sub 就会起作用。例如,一个双循环:
1. for(int i = 0; i < 10; ++i)
2. for(int j = 0; j < 10; ++j)
3. printf("hi\n");
更完整的是,整个循环是包含它的块的子块,循环体是整个循环块的子块。
因此,第2行是整个循环,它是块的子块,它是它的一部分。循环外部的块是第2行和第3行。
答案 1 :(得分:3)
如果您有代码块,例如:
while(1) <-- code block (contains if [that contains printf])
if(2) <-- sub block (contains printf)
printf("3"); <--- part of if block
printf被认为是if块的一部分,if块本身(现在也包含printf)被认为是更大块的一部分。这可以继续......
while(1)
while(2)
if(3)
for(;;)
i++;
这里的3个中间线中的每一个都是包含以下行的子块
答案 2 :(得分:2)
C11标准在§6.8.5迭代声明
中说¶5迭代语句是一个块,其范围是其范围的严格子集 封闭的。循环体也是一个块,其范围是范围的严格子集 迭代语句。
我认为这就是你引用的陈述试图解释的内容。
这有点不透明(欢迎阅读标准的世界),是一个迭代语句(while
循环,do … while
循环或for
循环)被处理作为一个块。这主要影响带有变量声明的for
循环。
考虑:
for (int i = 0; i < max; i++)
printf(" %d", i);
putchar('\n');
措辞意味着代码的功能就像你有:
{
for (int i = 0; i < max; i++)
{
printf(" %d", i);
}
}
putchar('\n');
这特别限制了i
到for
循环的范围;它不能在循环外访问。循环体是一个块,其范围是迭代语句的严格子集,这并不是一个大惊喜。周围的街区不那么明显,可能会让人大吃一惊。