Как вы используете существующую переменную в одном или нескольких циклах? - PullRequest
5 голосов
/ 07 ноября 2010

Я пробираюсь через Head First C #, и я немного запутался в своем текущем упражнении. Они заявляют:

Если вы объявляете переменную внутри цикла for - for (int c = 0; ...) - тогда эта переменная действительна только внутри фигурных скобок цикла. Так что если у вас есть два цикла for, которые оба используют переменную, вы либо объявите ее в каждом цикле, либо будете иметь одно объявление вне цикла. И если переменная c уже объявлена ​​вне циклов, вы не можете использовать ее ни в одном из них.

Это звучит противоречиво для меня, почти как если бы вы сказали, что вы можете использовать его снаружи, только если вы объявите это снаружи, но если вы объявите это снаружи, вы не сможете его использовать.

Так ты можешь или не можешь? Я попытался объявить c в двух отдельных циклах for, и это работало нормально, но при объявлении c вне циклов for я не мог найти способ ссылаться на переменную c внутри обоих циклов for, в то время как она также объявлялась снаружи, пытался ли я изменить его значение или нет. Это не требуется для упражнения, я просто пытаюсь впитать все знания, с которыми сталкиваюсь, и пытаюсь выйти за пределы материала.

Книга может сбить меня с толку, поэтому, если это невозможно и совершенно не нужно, просто дайте мне знать, спасибо!

Ответы [ 7 ]

9 голосов
/ 07 ноября 2010

Проблема одна из scoping .Прочитайте здесь , чтобы узнать, как работает область видимости переменных в 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++)
{
}
3 голосов
/ 07 ноября 2010

Вы можете сделать либо

  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);
2 голосов
/ 07 ноября 2010

Утверждение действительно сбивает с толку, если я правильно понимаю, согласно тексту, я не смогу это сделать:

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

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

Но я могу, и это явно верно. Я думаю, что текст означает: «Вы не можете повторно объявить его в одном» вместо «Вы не можете использовать его ни в одном».

1 голос
/ 10 июля 2018

x = x работает для повторного использования переменной, сохраняя ее значение из одного цикла в другой, но выдает предупреждение Вы могли бы предпочесть этот синтаксис

for (x+=0; x>10; x++) ;
1 голос
/ 26 августа 2013

Вы можете использовать существующую переменную в качестве начальной точки цикла 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 <30, что-то еще происходит) ex) </p>

for (x = x ; x < 30; x++)
    {
        // Do stuff here
    }
1 голос
/ 07 ноября 2010

Концепция здесь Область действия .Переменная объявляется в некоторой области видимости и не может быть доступна вне ее.Это помогает определить время жизни переменной, а также контролировать доступ к ней.Переменная может быть объявлена ​​внутри класса, метода или условной области видимости внутри метода, например, в операторе 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 ; )
        }
    }
1 голос
/ 07 ноября 2010

Я думаю, что они имеют в виду следующее.

Вы можете сделать это. Что происходит, так это то, что вы объявили переменную вне цикла и используете ее. Однако проблема в том, что вы можете перезаписать существующее значение, которое вам нужно использовать где-то еще.

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
    }
}
...