2017-10-05 171 views
0

代碼:整型參數被解釋爲字符串參數在Java中

class Foo 
{ 
    public static void main(String[] args) 
    { 
     int x[] = new int[5]; 
     for(int i=0;i<5;i++) 
      x[i]=i*i; 

     for(int i=0;i<5;i++) 
     { 
      System.out.println("Value #" + i+1 + " = " + x[i]); 
     } 
    } 
} 

輸出:

[email protected]:~$ java Foo 
Value #01 = 0 
Value #11 = 1 
Value #21 = 4 
Value #31 = 9 
Value #41 = 16 

那麼,這是怎麼回事呢?我在哪裏搞亂我的java代碼?我的意思是爲什麼在Java中,i+1意思是i concat 1

+5

級聯從左到右完成。所以''Value#「+ i'首先被執行,Sting + Integer被解釋爲字符串連接。使用括號表示要在連接之前執行i + 1。 –

+0

你正在做兩件不同的事情。在Java中,您打印一個串聯的字符串,並在C++中打印單獨的「項目」。 –

+0

解決方法:''System.out.println(「Value#」+(i + 1)+「=」+ x [i]);' – Jesper

回答

4
public class Foo 
{ 
    public static void main(String[] args) 
    { 
    int x[] = new int[5]; 
    for(int i=0;i<5;i++) 
     x[i]=i*i; 

    for(int i=0;i<5;i++) 
     { 
      System.out.println("Value # " + (i+1) + " = " + x[i]); 
     } 
    } 
} 

試試這個

+1

是的!有效!糾正我,如果我錯了,每一個System.out.println()接受字符串作爲參數,除非指定明確不會使用整數? –

+0

@insomniac_tk println方法將有多個重載方法,包括一個用於整數的方法。但是,因爲有字符串,所以使用接受String參數的println方法 –

+1

@JohnD是的,這是合理的。感謝m8! –

-2

你不能簡單地添加一個整數轉換成字符串。您必須使用Integer.toString(int)將整數轉換爲字符串,然後將返回的值添加到字符串中。

+2

這顯然是錯誤的,字符串連接會自動將整數轉換爲字符串 - 閱讀[JLS中的]部分(https://docs.oracle.com/javase/specs/jls/se8/html/jls-15。 html#jls-15.18.1) – UnholySheep

4

Strings+運營商用於串連,是因爲你沒有specidy任何括號,你i1也concatentate,你需要使用括號明確地告訴他們要和在一起:

for (int i = 0; i < 5; i++) { 
    System.out.println("Value #" + (i + 1) + " = " + x[i]); 
} 

要獲取:

Value #1 = 0 
Value #2 = 1 
Value #3 = 4 
Value #4 = 9 
Value #5 = 16 

下一步是,另一種方式利用IntStream,它會做相同的:

IntStream.range(0, 5) 
     .mapToObj(i -> "Value #" + (i + 1) + " = " + (i * i)) 
     .forEach(System.out::println); 
2

的+意味着像CONCAT,如果你想表達進行評估放入括號

第(i + 1)不是我+ 1

2

這條線:

System.out.println("Value #" + i+1 + " = " + x[i]); 

,特別

"Value #" + i+1 + " = " + x[i] 

是對下面的代碼語法糖:

new StringBuffer().append("Value #") 
        .append(i) 
        .append(1) 
        .append(" = ") 
        .append(x[i]) 
        .toString(); 

你想要的是這樣的:

"Value #" + (i+1) + " = " + x[i] 

這將轉化爲

new StringBuffer().append("Value #") 
        .append(i+1) 
        .append(" = ") 
        .append(x[i]) 
        .toString(); 
+0

Java新手在這裏。所以沒有得到大部分,但我仍然嘗試了i + 1的括號,並且工作正常! –

2

因爲在這種情況下, ,Java將i附加到您的字符串,然後是1到你的字符串。

評估值第一(和產生你在這裏期待的結果),你必須通知你想它追加之前評估值的Java,使用括號:

System.out.println("Value #" + (i+1) + " = " + x[i]); 

輸出

Value #1 = 0 
Value #2 = 1 
Value #3 = 4 
Value #4 = 9 
Value #5 = 16 
2

的關鍵原因的Java和C++程序不同的是,因爲使用的運算符是不同的:

System.out.println("Value #" + i+1 + " = " + x[i]); // Java 
cout << "Value # " << i + 1 << " = " << x[i] << endl; // C++ 

+運營商有一個higher precedence,因此在超載<<運營商之前完成添加。

在Java版本中,它全部是+ s,所以它們都從左到右進行評估。

+0

哇,這很酷。感謝m8! –

0

問題出在system.out.println(「」);,其中當使用(+)添加字符串變量時,所有整數都會形成字符串。嘗試使用整數和字符串變量進行不同操作。