第二章节 控制流 01 scanner和m=m++的问题
用户交互Scanner(扫描器)
用完就要关掉I/O流会占用很多资源
需要创建Scanner对象
Scanner scanner = new Scanner(System.in);
通过Scanner类的next()
与 nextLine()
获取输入的字符
用hasNext
与hasNextLine()
判断是否有输入的字符
其中的区别是Next是一个单词遇到空格/回车停止,nextLine是一行单词遇到回车停止
案例
package Scanner;
import java.util.Scanner;
public class Demo06 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入字符");
boolean b = scanner.hasNext(); //暂停
System.out.println(b); //值为true
System.out.println("===============================================");
if(scanner.hasNext()){ // 再次判断有无输入,因为has不会读走字符,所以现在还是hello world在输入流中
String str = scanner.next(); //带走了字符
System.out.println(str); //输出到屏幕
System.out.println("===============================================");
boolean z = scanner.hasNext(); //判断有无输入此时是world
String s = scanner.next();
System.out.println(s);
System.out.println(z);
}
scanner.close();
}
}
重输出结果来看当程序运行到hasNext()时会暂停等待输入,而且判断的时候不会读走字符,但是Next()会走字符
next还有很多其他的扩展 包括nextInt(),nextDouble(),nextbyte()...
今日问题
今天在学习的时候发现了一个问题
public static void main(String[] args) {
int i = 0;
for (;i<10;i++){
int m = 0;
m=m++;
System.out.println(m);
}
}
他的结果居然是全0的!!!
他的逻辑是这样的 m++并不是在使用完后直接+1,他是先将m的值复制到一个临时区,然后对临时的值+1,最后再返回m。
而代码中的m=m++;
执行步骤是
- 先复制m到赋值的临时区为 T;
- ++运行,m=m+1 即m=1;
- 此时右边的m++已经完全执行完了 现在执行赋值语句 =,最后进行赋值 m = T 所以 m = 0 m中的1就被覆盖了
这个问题参考https://blog.csdn.net/qq_31807385/article/details/83988732
https://blog.csdn.net/blackant2/article/details/125420834