2017-10-05 184 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(“”);,其中当使用(+)添加字符串变量时,所有整数都会形成字符串。尝试使用整数和字符串变量进行不同操作。