【问题标题】:Is it OK to use the same variable name in loops?在循环中使用相同的变量名可以吗?
【发布时间】:2018-04-03 16:59:47
【问题描述】:

我刚开始用 C++ 编程,在编码时我开始注意到我的代码中有很多 for 循环,然后我开始思考。

在 for 循环中,当您创建像:for (int **i**=1;i<10;i++) 这样的变量时,循环完成后i 会发生什么?
是否可以使用相同的变量名创建多个 for 循环?
在 while 循环中创建变量怎么样?

【问题讨论】:

  • 在这种情况下,i 的范围是 for 循环 - 循环完成后它不再存在
  • 在此处了解块范围:en.cppreference.com/w/cpp/language/scope
  • i, j, k 通常被理解为循环中的索引,但如果它更清楚,请使用其他名称
  • 变量是循环语句范围的局部变量,不能在循环范围之外使用。

标签: c++ loops for-loop while-loop


【解决方案1】:

...循环完成后i 会发生什么?

超出范围。

可以创建多个具有相同变量名的 for 循环吗?

是的,这样做是可以的,而且是普遍的做法。

在 while 循环中创建变量怎么样?

在 while 循环内创建的变量是 while 循环体的局部变量。它们与在 for 循环头的第一部分创建的运行变量不同,后者仅在第一次进入循环之前执行。

【讨论】:

    【解决方案2】:

    在循环中创建的变量是在循环后不会保留相同值的变量。它只是一个时间值。 例如,此代码将打印 i=10,因为您使用的是第一个“i”变量。

       #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int i = 0;
    
        for (i = 1; i<10; i++);
    
        cout << i;
    
        return 0;
    }
    

    我们在 c++ 中,因此您可以完美地在循环中创建另一个“i”变量,该变量将具有时间值:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int i = 0;
    
        for (int i = 1; i<10; i++);
    
        cout << i;
    
        return 0;
    }
    

    它会打印“i”而不是时间值,即 0。

    【讨论】:

      【解决方案3】:

      这取决于,如果您在 for() 内定义迭代值 i,它是一个局部变量,并且仅在 for() 内声明,因此您不应将其用于 for() 内的另一个循环(除了你有充分的理由)。

      例如以下代码将引发错误,因为变量i 未在for() 循环之外声明,这意味着它在一般main(){} 内部不可访问:

      #include<cstdlib>
      #include<iostream>
      
      int main()
      {
        for (int i = 5; i > 0; i--) {
          std::cout << "Iteration: " << i << std::endl;
        }
        std::cout << "Iteration outside of 'for': " << i << std::endl; // Error
      
        return 0;
      }
      

      【讨论】:

        【解决方案4】:

        循环完成后“i”会发生什么?

        'i' 将获得输入条件中最后分配的值。

        是否可以创建多个具有相同变量名的 for 循环?

        这将取决于用于运行此代码的语法或语句。

        良好的做法是为不同的声明分配不同的变量名。

        这也属于第一个问题。另外,您需要考虑此代码的位置 将在网络、移动应用程序或程序中使用。

        在 while 循环中创建变量怎么样?提前致谢。

        最佳实践是在执行任何条件或语句之前创建变量。

        【讨论】:

          【解决方案5】:

          ijk等通用名称确实很常用,但实际上是一种常见的不良做法。变量名称应正确反映存储值的用途。例如,如果它用于索引项目向量,则应将其命名为 item_index 而不仅仅是 i。这可能看起来不必要的冗长,但是当具有通用名称的变量被弄乱时,这种方法有助于避免常见的错误,例如将此frobs[i] = some_frob; bars[j] = some_bar;frobs[bar_index] = some_frob; bars[frob_index] = some_bar; 进行比较。实际上,在这种情况下,不仅索引变量名称应该是非泛型的,而且变量类型也不应该是泛型的,因此将一种索引类型转换为另一种需要显式转换。我认为存在几个通用命名变量的情况类似于Three Star Programmer,因为它不应该在正确编写的代码中发生。

          在循环范围内声明的变量在循环范围外是不可见的,所以没有问题。然而,构造 for(int i=1;i&lt;10;i++) 实际上是一个语法缺陷,因为它忽略了正常的范围规则,并使声明的变量 i 在循环范围之外在范围内可见。这实际上与 C 不同,后者禁止在 for 构造内声明变量。基本上

          for(int i = 1; i < 10; ++i)
          {
             // loop body
          }
          // i is not visible here
          i = 42; // error
          

          在 C++ 中是更紧凑的等价于

          {
              int i;
              for(i = 1; i < 10; ++i)
              {
                 /* loop body */
              }
          }  
          /* i is not visible here */
          i = 42; /* error */
          

          在 C 中。

          然而,一些编译器可能会表现出非标准行为,并允许在 for 构造内声明的变量即使在 for 循环退出后仍可见。例如带有/Zc:forScope-的Visual C++

          for(int i = 1; i < 10; ++i)
          {
             // loop body
          }
          // i is still visible here
          i = 42; // no error
          

          【讨论】:

            猜你喜欢
            • 2018-02-21
            • 2011-06-20
            • 2017-04-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多