2

我收到以下错误。使用未分配的局部变量 markduplicate。我不明白为什么?该程序在数组中查找重复项。我一直试图弄清楚,我觉得我很接近。谢谢您的帮助。

using System;

class duplicate 
{
    static void Main() 
    {
    const int Array_Size = 5;
    int [] number = new int [Array_Size];
    int i;

    for ( i = 0; i < Array_Size; i++) 
    {
        Console.Write("Element " + i + ":    ");
        number[i] = Int32.Parse(Console.ReadLine());
        if (number[i] < 9 || number[i] > 101)
        {
            Console.WriteLine("Enter Number between 10 - 100");
            number[i] = Int32.Parse(Console.ReadLine());
        }
    }

    bool markduplicate;
    for (i = 0; i < Array_Size; i++)
    {
        for (int j = 0; j < Array_Size; j++) 
        {
            if (i != j)
            {
                if (number[j] == number[i])
                {
                    markduplicate = true;
                }
            }

            if (markduplicate != true) 
            {
                Console.WriteLine("Element " + i + "    " + number[i]);
            }
        }
    }
}

}

4

5 回答 5

4

这是因为 C# 的代码分析器检测到存在通过您的程序的路径,当markduplicate' 的值在对其进行任何分配之前将被引用时。具体来说,这将在嵌套循环的第一次迭代期间发生,此时ij都为零:if (i != j)包含赋值的块不会执行,因此将markduplicate在下if一条语句中检索 的值。

要解决此问题,请更改

bool markduplicate;

bool markduplicate = false;

在声明中。

于 2013-04-02T01:03:32.073 回答
1

编译器认为您可以在设置if (markduplicate != true)之前点击该行markduplicate

如果您认为编译器错误,请在声明 eg 时给它一个值bool markduplicate = true;。如果您分析并认为编译器是正确的,请相应地调整您的代码。

另外:if (markduplicate != true)被认为是糟糕的风格。改为使用if(!markduplicate)

于 2013-04-02T01:05:52.680 回答
0

你已经声明了布尔变量markduplicate,但是你没有给它一个初始值——编译器不知道它最初应该是真还是假。

在这种情况下,很明显你希望它最初是错误的,所以放这个:

bool markduplicate = false;

它现在将被编译。

于 2013-04-02T01:04:15.420 回答
0

在您的代码中,(i != j)在它为真之前为假,因此您正在检查没有分配任何内容的变量的值。

您需要在其声明中为 markduplicate 分配一个值,或者您需要确保任何导致对其值进行条件检查的路径都首先分配了一个值。

于 2013-04-02T01:06:13.337 回答
0

您必须分配markdefault给其中一个truefalse在您的声明中。否则,如果number [j] != number [i], thenmarkdefault将不会被赋值并且if markduplicate != true无法被评估。

于 2013-04-02T01:08:14.117 回答