2017-10-05 5 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

あなたは2つの異なることをしています。 Javaでは連結文字列を出力し、C++では別々の "items"を出力します。 –

+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()は文字列をargsとして受け取り、指定されていない限り、整数を使用しません。 –

+0

@insomniac_tk printlnメソッドには、intを含む複数のオーバーロードされたメソッドがあります。しかし、文字列があるので、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

あなたが任意の括弧をspecidyていなかったので、自分のi1もconcatentateあるので+演算子は、CONCATENATEのために使用されているStringsでは、明示的に、彼らは一緒に合計されることを伝えるために括弧を使用する必要があります。

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.range(0, 5) 
     .mapToObj(i -> "Value #" + (i + 1) + " = " + (i * i)) 
     .forEach(System.out::println); 
2

+あなたが式を評価する場合は、連結のようなものを意味し、括弧

(i + 1)のないI + 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バージョンでは、すべて+であるため、すべて左から右に評価されます。

+0

これはクールです。ありがとうm8! –

0

問題はsystem.out.println( "");にあり、文字列変数で(+)を使用して追加すると、すべての整数が文字列につながります。

関連する問題