Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么/如何将整数设置为-1使我的while循环工作?_Java_Performance_Loops_While Loop - Fatal编程技术网

Java 为什么/如何将整数设置为-1使我的while循环工作?

Java 为什么/如何将整数设置为-1使我的while循环工作?,java,performance,loops,while-loop,Java,Performance,Loops,While Loop,这是我的密码。这相当简单,我只是让用户猜一猜,然后告诉他们数字是正确的,高还是低。为了不断地问,我做了一个while循环 尽管如此,我不知道为什么,也不知道它是如何工作的。我将int初始化为-1以进行猜测,它似乎可以工作。为什么不初始化它就不能工作,为什么一开始是负数。这样做似乎有点不合适。我猜这不是常见的做法 再次感谢!:) }在您的案例中,没有硬性规定将-1作为猜测值。您甚至可以将其初始化为大于101的值或0-101之间以外的任何数字 或者,如果不想对其进行初始化,可以使用如下所示的do w

这是我的密码。这相当简单,我只是让用户猜一猜,然后告诉他们数字是正确的,高还是低。为了不断地问,我做了一个while循环

尽管如此,我不知道为什么,也不知道它是如何工作的。我将int初始化为-1以进行猜测,它似乎可以工作。为什么不初始化它就不能工作,为什么一开始是负数。这样做似乎有点不合适。我猜这不是常见的做法

再次感谢!:)


}

在您的案例中,没有硬性规定将-1作为猜测值。您甚至可以将其初始化为大于101的值或0-101之间以外的任何数字

或者,如果不想对其进行初始化,可以使用如下所示的do while循环:

int guess;
do {
    System.out.print("\nEnter your guess: ");

   guess = input.nextInt();


   if (guess == number)
       System.out.println("you are correct, the number is " + number);
   else if (guess > number)
       System.out.println("your guess is too high");
   else
       System.out.println("your guess is too low");
} while (guess != number);
-1是一个哨兵值。也就是说,对于您的程序来说,它是一个无效的值,特别是,它不是
(int)(Math.random()*101)
(顺便说一句,它生成一个介于0和100之间的数字,而不是1和100之间的数字)返回的任何值


避免
guess
的“双重任务”的一种方法是将循环更改为无条件循环,然后使用
break
在猜测正确的情况下中断循环。像这样:

while (true) {
   System.out.print("\nEnter your guess: ");

   int guess = input.nextInt();

   if (guess == number) {
       System.out.println("you are correct, the number is " + number);
       break;
   } else if (guess > number) {
       System.out.println("your guess is too high");
   } else {
       System.out.println("your guess is too low");
   }
}

(请注意,我在
if
块中添加了大括号,以便在分支中可以有多个语句。)这可能是最干净的方法。

Java是一种强类型语言,因此需要先定义变量,然后才能使用它

您必须先定义
guess
,然后才能使用它。只要
guess
最初定义为非数字的任何内容,循环就可以工作

您可以这样定义
guess
,以确保它是不同的。你永远不会想这么做。我只是想说明,几乎任何初始值都可以用来初始化
guess

int guess = number - 1;
您还可以使用do..while循环来最初不分配它。这是最好的方法,因为你没有做任何假设

int guess;
do {
   System.out.print("\nEnter your guess: ");

   guess = input.nextInt();


   if (guess == number)
       System.out.println("you are correct, the number is " + number);
   else if (guess > number)
       System.out.println("your guess is too high");
   else
       System.out.println("your guess is too low");
}while(guess != number);

此循环运行一次,并直接从用户输入分配
guess
,而不必在自己之前分配它。

您使用-1作为标志()值。这是一个不允许用户猜测的值,因此表示尚未进行猜测。如果您根本不初始化它,那么它将从零开始,标志值将为零,不允许用户猜测零,并且随机数永远不应为零

换句话说,您应该能够使用零作为您的标志值。但是,您是Math.random()似乎不排除零。请看

//generate random number between 1 and 100
int number = (int)(Math.random() * 101);
应该是

int number = (int)(Math.random() * 100) + 1;
Math.random()
的范围为[0,1]。这意味着包括0,但不包括1。您现有的代码将从0到100中选择数字。您告诉用户您将从1到100中选择数字。除非您打算作弊,否则需要修复

这也是一个需要测试的噩梦般的bug,因为它只发生1%的时间。请仔细阅读
Math.random()
的文档

如果你编写一个测试,直到
被执行为止,那么每个数字都应该能够执行,它只有在你没有bug的时候才会停止。就像噩梦般的是,如果你正确编程,让它循环459次,那么它没有偶然选择0的概率只有1%。所以你不应该这样做我得等很久才考。如果你介意的话,我可以告诉你考试背后的数学原理


也可以考虑<<代码> do,而Road,这样你就不需要首先设置一个标志。但是,当你需要修改你的<代码>数学。line.

因为您在while循环中将变量guess与数字进行比较,所以编译器强制您为该变量设置默认值。既然问题已经得到了回答,我想指出类名应该以大写字母开头,而不是类似camelCase的字段和方法。因此
numGuess
应该是
NumGuess
。你能告诉我你想如何比较
number
的值吗?编译器也不能,因此他需要
guess
中的值。看看Random。nextInt(inti):好的。那么接下来的问题是,为什么我必须事先声明这个值?我是在告诉循环吗“嘿,他们将猜测0-100之间的某个值,但我首先将该值设置为-1,因为它不是我设置的参数的一部分"?有点迷路。@user3457747您不必这样做。您可以使用
do
/
while
循环,正如Kassym的回答中所解释的那样。我想我只是混淆了用于条件的猜测和来自if语句内部用户的“猜测”,在这种情况下,您最好使用
do
/
while
,其中,
guess
将不会执行“双重任务”.:-)明白了。仍然使用我所拥有的作为示例,如果我将“int guess==1;”更改为类似“int guess loop==1;”的值,它为什么不起作用?即使我猜对了数字,循环也不会终止。int guess=number-1是一个混球。它在语义上不正确。它只是碰巧起作用。如果你你将要使用一个标志值,请不要在没有充分理由的情况下将其随机化。你的维护开发人员会感谢你的。因此,你在这里首先运行用户的猜测,通过循环?因此int guess=-1;while(guess!=number)因此,条件中的猜测不是用户的猜测?@CandiedOrange,我同意。这更像是一个例子,几乎任何值都可以使用,只要它与初始数值不同。这不是我会做的事情。do while至少运行一次。这样,你就不必随机分配初始猜测。你可以得到
int number = (int)(Math.random() * 100) + 1;