我有以下的代碼中調用代碼#1重新排列變量後爲什麼輸出不同?
Scanner keyboard = new Scanner(System.in);
String s = keyboard.nextLine();
int x = keyboard.nextInt();
double y = keyboard.nextDouble();
System.out.println("String: "+s);
System.out.println("Double: "+y);
System.out.println("Int: "+x);
如果我進入
Hello World
12.1
12
輸出將是
String: Hello World
Double: 12.1
Int: 12
不過,如果我重新安排我的代碼,調用它代碼#2,如
Scanner keyboard = new Scanner(System.in);
int x = keyboard.nextInt();
double y = keyboard.nextDouble();
String s = keyboard.nextLine();
System.out.println("String: "+s);
System.out.println("Double: "+y);
System.out.println("Int: "+x);
和我輸入
12
12.1
編譯器跳過字符串輸入和輸出
String:
Double: 12.1
Int: 12
這是奇數我。我被教導編譯器總是從上到下閱讀。我想象編譯器讀取代碼#2爲
int x = keyboard.nextInt();
首先等待用戶輸入一個整數,以便它可以將其分配給x。然後讀取
double y = keyboard.nextDouble();
等待用戶輸入一個雙因此它可以被分配給y。然後它終於讀取
String s = keyboard.nextLine();
並等待用戶輸入一個字符串,因此它可以將其分配給s。實際上,對我來說,這是編譯器如何讀取代碼#1並輸出所需的。這似乎是一個微妙的差異,重新排列變量,但爲什麼產出如此不同?
您是否更改首先要求的值的順序,並且您希望它以相同的方式工作?我在這裏丟失了一些東西...... –
您也在使用_runtiime_來解析源代碼並生成一個二進制文件的_compiler_,它執行代碼(請注意,「runtime」可能是物理cpu,如一個C程序,但對於Java而言,它是JVM)。如果我編寫了一個從頭到尾讀源文件的編譯器,它將(應該)對__ execution_沒有任何影響。 –