【问题标题】:How do you use an existing variable within one or more for loops?如何在一个或多个 for 循环中使用现有变量?
【发布时间】:2011-05-06 06:01:34
【问题描述】:

我正在学习 Head First C#,但我对当前的练习有点困惑。他们说:

如果您在 for 循环中声明一个变量——for (int c = 0; ...)——那么该变量仅在循环的大括号内有效。因此,如果您有两个都使用该变量的 for 循环,您将要么在每个循环中声明它,要么在循环外声明一个。如果变量 c 已经在循环之外声明,则不能在任一循环中使用它。

这对我来说听起来很矛盾,就像说你只能在外面声明它才能使用它,但如果你在外面声明它就不能使用它。

你能,还是不能?我尝试在两个单独的 for 循环中声明 c 并且效果很好,但是当在 for 循环之外声明 c 时,我找不到任何方法来引用两个 for 循环中的变量 c 而它也在外部声明,无论我是否尝试改变它的价值与否。这不是练习所必需的,我只是在尝试吸收我遇到的每一点知识并尝试超越材料。

这本书可能让我感到困惑,所以如果这不可能并且完全没有必要,请告诉我,谢谢!

【问题讨论】:

  • 感谢大家的帮助,解决了问题!

标签: c# .net windows winforms .net-3.5


【解决方案1】:

问题是范围之一。阅读here 了解有关变量作用域在 C# 中如何工作的一些详细信息。

如果一个变量被声明在外部一个循环,你不能重新声明它里面:

不好

int c = 0;
for(int c = 0; c < list.Count; c++) // Error!
{

}

好的

声明外部,使用内部

int c = 0;
for(c = 0; c < list1.Count; c++)
{
}

for(c = 0; c < list2.Count; c++)
{
}

声明了里面两个循环:

for(int c = 0; c < list1.Count; c++)
{
}

for(int c = 0; c < list2.Count; c++)
{
}

【讨论】:

  • @Philipp - 相同的区别。这个问题是一个范围界定问题。答案已更新为使用 for 循环。
  • 我发现在您的第二个答案中,您可以省略第一个分号之前的所有内容作为速记语法。对我来说比重新分配 0 更有意义。
  • @paul - 相同的缩写 - .net 会将 int 的值默认为 0。
【解决方案2】:

我认为它们的意思如下。

你可以这样做。听到的是你已经在循环之外声明了一个变量并正在使用它。但问题是您可能会覆盖需要在其他地方使用的现有值。

int i = 0;

for (i = 0; i < 100; i++)
{
    // Do something
}

你真正不能做的是这个。在这里,您在内部for 中重新使用外部for 中的变量。

for (int i = 0; i < 100; i++)
{
    for (i = 0; i < 100; i++)
    {
        // Do something
    }
}

【讨论】:

    【解决方案3】:

    你可以这样做

      int i;
      for (i = 0; i < 3; i++)
        foo(i);
      for (i = 0; i < 5; i++)
        bar(i);
    

     for (int i = 0; i < 3; i++)
        foo(i);
     for (int i = 0; i < 5; i++)
        bar(i);
    

    但不是

    int i;
    for (int i = 0; i < 3; i++) //error
      foo(i);
    for (int i = 0; i < 5; i++)
      bar(i);
    

    【讨论】:

      【解决方案4】:

      该说法确实令人困惑,如果我理解正确的话,根据文字我应该无法做到这一点:

      int i;
      for (i = 1; i < 10; i++) { }
      
      for (i = 0; i < 20; i++) { }
      

      但我可以,这显然是有效的。我认为文本的意思是“你不能在任何一个中重新声明它”而不是“你不能在任何一个中使用它”。

      【讨论】:

        【解决方案5】:

        这里的概念是Scope。变量是在某个范围内声明的,并且不能在它之外访问。这有助于定义变量的生命周期以及控制对它的访问。变量可以在类、方法或方法内的条件范围内声明,例如在 if 语句或 for 循环内。

        考虑范围的一种简单方法是您可以访问变量
        在一对花括号{ ... } 下。

        这是一个例子:

            public class TestClass
            {
                int p;  // p's is in the 'TestClass' scope
        
                public void TestFunction1()
                {
        
                    Console.WriteLine(p);   // OK, p in class scope
        
                    //  a lives in the 'TestFunction' scope
                    int a = 1; // Declared outside of any loop.
        
                    for (int i = 0; i < 10; i++)
                    {
                        //  i lives in the scope of this for loop
                        Console.WriteLine(i);
                        //  a is still accessible since this for loop is inside TestFunction1
                        Console.WriteLine(a);
                    }
                    Console.WriteLine(a); // OK, in scope
                    //Console.WriteLine(i); // Error, i out of scope
        
                    //  j also lives in the TestFunction1 scope
                    int j = 0;
                    for (j = 0; j < 20; j++)
                    {
                        //  j still accessible within the loop since the loop is within TestFunction1
                        Console.WriteLine(j);
                    }
        
                    Console.WriteLine(j); // Ok, j still in scope (outside of loop)
                }
        
                public void TestFunction2()
                {
                    Console.WriteLine(p);   // Ok, TestFunction2 is in the TestClass scope like TestFunction1
                    //Console.WriteLine(a);   // Error, a lives in TestFunction1
                    //Console.WriteLine(i);   // Error, allright now we're just getting silly ; )
                }
            }
        

        【讨论】:

          【解决方案6】:

          您可以使用现有变量作为 for 循环的起点。

          我刚开始学习 C# 4 周前,所以会厌倦.. 但语法是:

          int x = 10;
          
          for (x = x ; x < 15; x++) // x starts off as whatever defined above (15)
              {
                  Console.WriteLine("x is: {0}", x);
              }
              // After for is done executing, x will = 15
          

          然后不管出于什么原因,你可以继续做一些其他的逻辑 (当 X

          for (x = x ; x < 30; x++)
              {
                  // Do stuff here
              }
          

          【讨论】:

            【解决方案7】:

            x=x 可以重复使用变量,使其值从一个循环到另一个循环,但它会给你一个警告。 你可能更喜欢这种语法

            for (x+=0; x>10; x++) ;
            

            【讨论】:

              【解决方案8】:

              要考虑的另一种语法,如果要从外部使用变量,而不必重新分配或重新初始化变量,可以省略第一个分号之前的子句 .

              int c = 0;
              for(; c < list1.Count; c++)
              {
              }
              
              // c will start at the ending value list1.Count from the loop above
              for(; c > 0; c--)
              {
              }
              

              【讨论】:

                猜你喜欢
                • 2022-11-15
                • 2021-04-23
                • 1970-01-01
                • 2017-09-04
                • 2012-05-29
                • 1970-01-01
                • 2019-01-26
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多