代码:
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]);
}
}
}
输出:
tk@insomniac-tk:~$ java Foo
Value #01 = 0
Value #11 = 1
Value #21 = 4
Value #31 = 9
Value #41 = 16
那么,这里发生了什么?我在哪里弄乱我的Java代码?我的意思是为什么在java中, i+1
表示字面上的 i
concat 1
?
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]);
}
}
}
尝试此
在Strings
中,+
操作员用于连接,因此,由于您没有任何括号,因此您的 i
和 1
也是偶发的总和在一起:
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);
表示concat之类的东西,如果您希望将表达式评估到括号中
(i 1)不是i 1
此行:
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();
,因为在这种情况下,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
Java和C 程序不同的关键原因是因为使用的运算符不同:
System.out.println("Value #" + i+1 + " = " + x[i]); // Java
cout << "Value # " << i + 1 << " = " << x[i] << endl; // C++
+
操作员具有更高的优先级,因此在超载<<
运算符之前进行了添加。
在Java版本中,它都是+
s,因此它们都从左到右进行评估。
问题在system.out.ut.println(");中,当使用( )与字符串变量添加( )时,所有整数都将串联到字符串中。整数和字符串变量。
您不能简单地将整数添加到字符串中。您必须将整数转换为带有integer.tostring(int)的字符串,然后将返回的值添加到字符串中。