C#使用未分配的局部变量(2个不同的循环,int)

时间:2014-07-22 12:19:01

标签: c#

我一直得到相同的错误消息,我无法弄清楚在哪里放置我的int victimCount,使其不仅可以在while循环内工作,而且还可以将它用于我的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's 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();
        }
    }         
}

6 个答案:

答案 0 :(得分:3)

  

我无法弄清楚在哪里放置我的int victimCount,使其不仅可以在while循环中工作,而且还可以将它用于我的for循环

正确放置变量。编译器抱怨说可以保持未分配状态

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

因为它认为while循环可能永远不会运行。

int victimCount = 0;

应该修复编译错误。

答案 1 :(得分: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's 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's an invalid number.");
            }
        }                 
        for (var i = 0; i <= victimCount; i++)
        {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
            Console.WriteLine("Victim " + f1);
        }

        Console.ReadLine();
    }

答案 2 :(得分:2)

只需为变量指定一个初始值:

int victimCount = 0;

您得到的错误是由于编译器不知道您while中的语句是否会被执行。因此,编译器假定变量victimCount可能没有赋值。如果是,那么您无法将其用于for声明。为了避免这种情况,你可以使用初始的assignemt,我在上面提到过。

答案 3 :(得分:1)

尝试初始化变量:

int victimCount = 0;

例如。

此外,最好将变量声明为接近您需要使用它们的位置,例如在你的for循环中,你可以在那里宣布......

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

因此,您可以从上面的组中删除int i;

答案 4 :(得分:1)

变量位于正确的位置。但是,正如错误消息所示,您的for循环正在读取可能尚未分配的变量。

编译器无法证明while循环至少会运行一次(即使它会运行),因此它无法证明victimCount将具有一个值它到达for循环的时间。

因此,在声明时将默认值指定给victimCount

int victimCount = 0;

另一种方法是使用whilewhile(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's an invalid number.");
    else
        break;
}

答案 5 :(得分:1)

为其指定默认值:

int victimCount = 0;

编译器只是警告你它未被分配,因为你只在第一个循环中分配它,并且编译器不能保证第一个循环将在运行时执行。 (它知道循环条件的运行时值可能导致0次迭代。)