我无法理解for循环和if语句的块

时间:2016-08-22 03:50:22

标签: c loops if-statement block c99

在C Primer Plus中,作者说

  

前面提到的C99功能是作为其一部分的语句   即使大括号(即{},循环或if语句也有资格作为块   )没有使用。更完整的是,整个循环是一个子块   包含它的块,循环体是整个的子块   循环块。

我想循环体表示下面示例中的printf(...)语句。但是这两个大胆的词语是什么意思呢? :" .. 整个循环是包含它的的子块,..."如果你能用下面的例子解释它会很好!

for(int n =1;n<3;n++)
    printf("%d \n",n);

3 个答案:

答案 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');

这特别限制了ifor循环的范围;它不能在循环外访问。循环体是一个块,其范围是迭代语句的严格子集,这并不是一个大惊喜。周围的街区不那么明显,可能会让人大吃一惊。