求问这段 Java 代码为什么和预期不符?

2020-03-20 17:19:52 +08:00
 theotheo
import java.util.Scanner;
public class Test {
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
int length = scanner.nextInt(), target = scanner.nextInt(), i = 0;
int[] arr= new int[length];
while(scanner.hasNext() && i < length){
arr[i++] = scanner.nextInt();
}
}
}
例如输入:2 1 7 1,本来程序应该终止,但是这个时候还需要再输入一个,才能终止,请问是为什么?
谢谢大家。
1050 次点击
所在节点    问与答
7 条回复
coderluan
2020-03-20 17:23:19 +08:00
没细看,i++ ,++i ?
Newyorkcity
2020-03-20 17:27:07 +08:00
i++ 表达式,返回增加后的值
++i 表达式 返回增加前的值
两者都导致 i 加一
chainzhao188
2020-03-20 17:29:28 +08:00
才疏学浅,没明白这段代码要干什么
littleylv
2020-03-20 17:37:03 +08:00
scanner.hasNext()
passerbytiny
2020-03-20 17:40:12 +08:00
你这段代码是要干啥,我真得不想花心思去分析。
length 等于你第一次输入的数值,即 2,那么 arr[2]的时候抛出异常(但你的循环是正常结束的,而不是抛异常)。你这个循环,第一次循环 i=0,然后每执行一次循环体 i 自增。第一次循环 i=0,arr[i++] 即 arr[0],没问题;第二次 arr[1],没问题;第二次循环执行后,i=2 ;第三次循环判断的时候,2<length 过不去了,循环就结束了。总共来说,循环结束前,经历了三次 while 判断,两次循环体执行。加上前面代码的 scanner.nextInt(),总共要 5 个。
nziming
2020-03-20 17:42:44 +08:00
i < length 放到前面就可以了, 原因是 scanner.hasNext()是一个阻塞方法, 会阻塞直到接收到输入
littleylv
2020-03-20 17:43:37 +08:00
scanner.hasNext() 是阻塞的,只要没输入,就永远等在那里,不会进入 while 判断

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/654643

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX