我一直得到相同的错误消息,我无法弄清楚在哪里放置我的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();
}
}
}
答案 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;
另一种方法是使用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's an invalid number.");
else
break;
}
答案 5 :(得分:1)
为其指定默认值:
int victimCount = 0;
编译器只是警告你它未被分配,因为你只在第一个循环中分配它,并且编译器不能保证第一个循环将在运行时执行。 (它知道循环条件的运行时值可能导致0次迭代。)