2017-08-13 83 views
3

下面的代碼返回一個奇怪的結果。這個問題在某種程度上是46號線 添加String作爲參數傳遞給println解決問題打印Java中連接的多個數組元素

System.out.println("result" + arr[i] + arr[j]+ arr[k]); 
System.out.print("\n" + arr[i] + arr[j]+ arr[k]); 

我不明白爲什麼println是行不通的。如果不在java中插入字符串,是不可能連接數組元素的?

import java.util.Scanner; 
public class Main 
{ 
    public static void main(String Args[]) 
    { 
     System.out.print("How many digits: "); 
     Scanner obj = new Scanner(System.in); 
     int n = obj.nextInt(); 
     int[] arr = new int[n]; 
     for(int i=0; i<n; i++) 
     { 
      System.out.print("Enter number "+ (i+1) +": "); 
      arr[i]=obj.nextInt(); 
     } 
     combinations(arr); 
    } 

    public static void combinations(int[] arr) { 
     int count=0; 
     for(int i=0; i<arr.length; i++) { 
      for(int j=0; j<arr.length; j++) { 
       for(int k=0; k<arr.length; k++) { 
        System.out.println(arr[i] + arr[j]+ arr[k]);//Line 46 
        count++; 
       } 
      } 
     } 
     System.out.print("\n" + "Total combinations: "+ count); 
    } 
} 
+0

arr [i]被添加到arr [j]中...您將需要在兩者之間添加String對象... arr [i]是int並且java的自動類型轉換將int + int轉換爲int而不是in串.. –

+3

問自己一個相反的問題:如果你想得到這三個整數的總和,如果使用'+'運算符連接它們,你會怎麼做? –

+0

'+'可以表示Java中的兩個操作,具體取決於操作數。如果兩個操作數都是數字,那麼它會產生總和,如果它們中至少有一個是字符串,則它是串聯。 – Pshemo

回答

1
System.out.println(arr[i] + arr[j]+ arr[k]); 

當它運行時,它發現彼此相鄰ints所以總結他們

這樣,規則很簡單:

  • String + anythingElse:串聯
  • Number + Number:總和(int, double, float, ...)

爲避免你是強制性的,以增加空String或隔板之間:

System.out.println(arr[i] + ""+ arr[j] +""+ arr[k]); 
System.out.println(arr[i] + "-"+ arr[j] +"-"+ arr[k]); 
+0

*「當它運行時,它會發現'ints'彼此相鄰,因此它們將它們相加。」*否,它不會。它連接它們,因爲第一個值是一個字符串,其他值也轉換爲字符串,並且所有4個值都連接在一起。 – Andreas

+0

@Andreas我只是忘了刪除結果確實^^我的解釋沒有意義,如果你downvote我認爲你可以刪除所以^^ – azro

5

這是因爲+運營商有不同的行爲取決於其操作數:要麼把它添加數字或將其連接字符串。您已將您的數組聲明爲[int]。這意味着,當你這樣做:

arr[i] + arr[j]+ arr[k]; 

你正在計算三個int S的返回int總和。它定義爲in the Java specification爲:

二元+運算符在應用於兩個數值類型操作數時執行加法運算,產生操作數總和。

但是,當你寫:

"result" + arr[i] + arr[j]+ arr[k]; 

,因爲第一個元素是String,Java將所有其他元素轉化爲String S和它們串聯在一起。

這描述in the Java specification爲:

如果只有一個操作數的表達是String類型的情況下,對其它操作數執行的字符串轉換以產生在運行時的字符串。

最後,當你調用System.out.println它會評估給定的參數表現,然後再檢查其類型爲String,並呼籲它toString,如果事實並非如此。

+3

*「因爲一個元素是一個字符串」*是不完整的。這是因爲* first *元素是一個String。如果您最後放置了字符串,則仍然會添加3個數字,並將該和與字符串連接。 – Andreas

+1

我改變了措辭。請注意,如規範中所述,如果它不是第一個是String的元素,則仍然可以通過使用括號來強制轉換。 1 +(2 +「轉換」)將打印「12轉換」。 – Rodrigue