【问题标题】:Does For-Loop counter stay?For-Loop 计数器是否保留?
【发布时间】:2011-05-18 11:00:00
【问题描述】:

简单的问题。在 ANSI-C 中想象一下:

int i;

for(i=0 ; i<5 ; i++){
   //Something...
}

printf("i is %d\n", i);

这会输出“i is 5”吗?

i 保留还是循环后i 的值未定义?

【问题讨论】:

    标签: c loops iterator for-loop


    【解决方案1】:

    是的。如果 i 在 for 循环之外声明,则在循环退出后它仍然在范围内。它保留循环退出时的任何值。

    如果你在循环中声明了 I:

    for (int i = 0 ; i < 5 ; i++)
    {
    
    }
    

    然后循环退出后 i 未定义。

    【讨论】:

      【解决方案2】:

      变量 i 是在循环范围之外定义的(这很好,否则在这种情况下您将无法打印它)。

      并且它在循环的每一轮都被后置,其结束条件是“当 i 大于或等于 5 时停止”。

      所以此时 i 等于 5 真的很有意义。

      块作用域与 C 中的函数作用域并不完全相同。当您跳出循环的作用域时,变量 i 不会神奇地“恢复”到其先前的值。

      【讨论】:

        【解决方案3】:

        i 的值将在您的循环之后为 5。除非你做了类似的事情

        i = 50000;
        

        在里面。

        【讨论】:

          【解决方案4】:

          在我读过的大多数编码标准中,通常也建议不要在退出循环后使用“i”。特别是不要这样做:

          for(i = 0; i < num_elements; i++)
          {
              if(element[i].id == id)
              {
                  /* Do something to element here. */
                  break;
              }
          }
          
          if(i == num_elements)
          {
              fprintf(stderr, "Failed to find element %d.", id);
              succeeded == false;
          }
          

          虽然这会起作用,但编码很差。它的可读性和可维护性不如替代品。例如

          succeeded = false;
          
          for(i = 0; i < num_elements; i++)
          {
              if(element[i].id == id)
              {
                  /* Do something to element here. */
                  succeeded = true;
                  break;
              }
          }
          
          if(false == succeeded)
          {
              fprintf(stderr, "Failed to find element %d.", id);
          }
          

          【讨论】:

            【解决方案5】:

            是的,变量仅在声明它们的块内有效。 这是一个例子:

            #include <stdio.h>
            
            void main(int argc, char *argv[])
            {
                if(argc == 2) {
                    int x;
                    x = 7;
                }
            
                x = 1;
            }
            

            那是编译器:

            gcc ex.c
            ex.c: In function ‘main’:
            ex.c:10: error: ‘x’ undeclared (first use in this function)
            ex.c:10: error: (Each undeclared identifier is reported only once
            ex.c:10: error: for each function it appears in.)
            

            【讨论】:

            • 错误,什么?他问“是A还是B?”。这样的问题不能简单地回答“是”或“否”。他还在块外声明了他的变量。我认为这个答案不相关或没有必要(因为它没有添加以前答案中未包含的新信息)。
            • 是的,你是对的。我只是回答“是”,因为有人已经解释了为什么 i 被保留(Visage 的回答是最好的)。我认为添加此示例可能有助于完成其他答案。 =)
            猜你喜欢
            • 2011-12-31
            • 1970-01-01
            • 2013-04-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-02
            • 1970-01-01
            相关资源
            最近更新 更多