我目前正在尝试通过用户输入定义两个整数变量。如果用户输入未包含在定义范围内的整数,则会要求用户再次输入,直到用户输入接受的值。
static void Main(string[] args)
{
int a;
int b;
bool isAValid = false;
bool isBValid = false;
while (isAValid == false)
{
Console.Write("Input number from 2 to 20: ");
isAValid = true;
a = Convert.ToInt16(Console.ReadLine());
if (a < 2 || a > 20)
{
isAValid = false;
}
}
while (isBValid == false)
{
Console.Write("Input number from 2 to 20: ");
isBValid = true;
b = Convert.ToInt16(Console.ReadLine());
if (b < 2 || b > 20)
{
isBValid = false;
}
}
}
我要完成的是将用户输入分别保存为 a 和 b ,因此将局部变量值定义为用户输入值。但是,当我在最后一个while循环被破坏后尝试访问局部变量时,我得到&#34; 使用未分配的局部变量 a (或 b )&#34 ;.
任何想法如何定义变量,同时仍然有输入提示循环?
答案 0 :(得分:1)
有趣的是,编译器无法看到始终输入while
循环,并始终初始化a
和b
。
更新:Eric Lippert评论说,为了流量控制分析,所有涉及变量的表达式都被认为是真或假; 甚至是像x*0 == 0
这样的表达式。
我们看到while
条件始终为真,部分原因是我们知道输入的这个小逻辑模式。我们知道循环是什么。 编译器没有。 它看到一个任意条件,并且不能被证明它总是正确的。它只是考虑所有带有变量的表达式是非常数的。
解决这个问题的一种方法是在语言中更好地表达程序的逻辑。这种模式并不罕见:“重复一些事情直到满足条件”。特别是,在任何情况下都至少执行一次。在所有C系列语言中都有一种语言结构:do / while循环。重写a
的循环给出了
do
{
Console.Write("Input number from 2 to 20: ");
isAValid = true;
a = Convert.ToInt16(Console.ReadLine());
if (a < 2 || a > 20)
{
isAValid = false;
}
} while (isAValid == false);
现在我可以在循环后访问a
;编译器认识到分配将得到保证。这同样适用于b
。
这也使我们能够编写更少杂乱的代码。只需要在首次输入while循环时进行“人工”测试,才需要辅助变量isAValid
。测试是人为的,因为我们还没有任何输入,因此无法真正测试任何东西。如果我们确实只在输入之后测试,那么测试数据可用,我们可以将测试正确地置于条件中。归结为
do
{
Console.Write("Input number from 2 to 20: ");
a = Convert.ToInt16(Console.ReadLine());
} while (a < 2 || a > 20);
答案 1 :(得分:0)
要解决您的错误,请声明:
order
而不是:
level
这将初始化您的本地变量并修复您的错误消息。