C # Использование неназначенной локальной переменной (2 разных цикла, int)

1

Я получаю такое же сообщение об ошибке все время, и я не могу понять, где положить мой int victimCount, чтобы он работал не только внутри цикла while, но и использовать его для цикла for for. Предложения?

namespace FibonacciSequence
{
    class Program
    {
        static void Main(string[] args)
        {            
            int i;
            int victimCount;
            double f1 = 0;
            double f2 = 1;
            double f3 = 0;

            bool running = true;

            while (running)
            {
                Console.Write("Enter the number of victims so we can predict the next murder, Sherlock: ");
                victimCount = int.Parse(Console.ReadLine());

                if (victimCount == 1)
                {
                    Console.Write("that an invalid number.");
                }
                else
                {
                    running = false;
                }
            }                 
            for (i = 0; i <= victimCount; i++)
            {
                f3 = f1 + f2;
                f1 = f2;
                f2 = f3;
                Console.WriteLine("Victim " + f1);
            }

            Console.ReadLine();
        }
    }         
}
  • 0
    спасибо за ответы, новобранец проблема решена :)
Теги:

6 ответов

3
Лучший ответ

Я не могу понять, где положить мой int victimCount, чтобы он работал не только внутри цикла while, но и использовать его для цикла for for.

Переменная установлена правильно. Компилятор жалуется, что здесь может остаться неназначенным

for (i = 0; i <= victimCount; i++)

потому что он считает, что в while петля никогда не может работать.

int victimCount = 0;

должен исправить ошибку компиляции.

2

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

если вы измените свое выражение на

int victimCount = 0;

вы больше не получите ошибку компиляции, и если вы по какой-то причине не назначили ее, цикл for не будет итерации.

на самом деле компилятор мог бы заметить, что ваш код действительно присваивает переменной значение, но разрешает это более общим образом, чтобы компилятор мог решить проблему NP-Complete, которая могла бы навсегда (буквально), что, конечно, было бы плохая вещь, поэтому компилятор не пытается быть настолько умным в обнаружении.

Вы можете пропустить текущую переменную и просто использовать victimCount. в то же время вы, вероятно, должны изменить свой тест на то, что анализировалось с консоли

static void Main(string[] args)
    {            
        var victimCount=0;
        var f1 = 0.0;
        var f2 = 1.0;
        var f3 = 0.0;

        while (victimCount<2)
        {
            Console.Write("Enter the number of victims so we can predict the next murder, Sherlock: ");
            //see if you can parse it and that the number is larger than 1
            //that assuming that not only 1 is invalid 
            //but also 0 and negative numbers
            //using tryparse ensures that even if the user types letters
            //your program won't crash
            if(!int.TryParse(Console.ReadLine(),out victimCount) || victimCount < 2){
                Console.Write("that an invalid number.");
            }
        }                 
        for (var i = 0; i <= victimCount; i++)
        {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
            Console.WriteLine("Victim " + f1);
        }

        Console.ReadLine();
    }
2

Просто назначьте начальное значение вашей переменной:

int victimCount = 0;

Ошибка, которую вы получаете из - за того, что компилятор не знает, если заявления в ваше while будет выполняться. Следовательно, компилятор предполагает, что переменной victimCount не может быть присвоено значение. Если да, то вы не можете использовать его в своем заявлении for. Чтобы этого избежать, вы можете использовать начальное назначение, указанное выше.

1

Попробуйте инициализировать переменную:

int victimCount = 0;

например.

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

for (var i = 0; i <= victimCount; i++)

поэтому вы можете удалить int i; из группы выше.

1

Назначьте это значение по умолчанию:

int victimCount = 0;

Компилятор просто предупреждает вас, что он не назначен, потому что вы назначаете его только в первом цикле, и компилятор не может гарантировать, что первый цикл будет выполняться во время выполнения. (Он знает, что время выполнения условия цикла может привести к 0 итерациям.)

1

Переменная находится в правильном месте. Однако, как говорится в сообщении об ошибке, ваш цикл for читает переменную, которая еще не была назначена.

Компилятор не может доказать, что в while цикл будет выполняться по крайней мере один раз (даже если он будет), поэтому он не может доказать, что victimCount будет иметь значение к тому времени, когда он достигает for цикл.

Таким образом, присвойте значение по умолчанию victimCount когда вы его объявите.

int victimCount = 0;

Альтернатива была бы помочь компилятору доказать, что в while цикл будет выполняться по крайней мере один раз, используя while(true) и break:

while (true)
{
    Console.Write("Enter the number of victims so we can predict the next murder, Sherlock: ");
    victimCount = int.Parse(Console.ReadLine());

    if (victimCount == 1)
        Console.Write("that an invalid number.");
    else
        break;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню