首页 > 解决方案 > 双引号 ("") 与整数连接的目的

问题描述

我刚刚开始阅读“Head First Java”一书。由于下面的代码中没有空格的双引号(“”),有一个练习让我感到困惑。我想我明白了,但看起来这本书并没有解释它,我想确保我是正确的前进。

下面代码中双引号 ("") 的目的是连接两个整数(x 和 y)并防止 + 运算符对输出执行加法吗?看起来就是这样。

以下代码的输出为:00 11 21 32 42。

我删除了双引号,输出给我:0 2 3 5 6。

class Test
{
    public static void main (String[] args) 
    {
       int x = 0;
       int y = 0;

       while ( x < 5)
       {
       y = x - y;
       System.out.print(x + "" + y + " ");
       x = x + 1;
       }
    }
}

标签: java

解决方案


要回答您的直接问题:您是正确的,""可以将 the+转换为串联,而不是加法。但我会提供一些关于这里发生的事情的更多细节。

本书的作者在不解释的情况下使用它可能有点糟糕,因为这似乎是练习中的关键内容(甚至一个简短的脚注说“这只是转换为字符串的简单方法”);但这是大多数 Java 程序员甚至不会考虑需要解释的事情之一,很容易错过;或者,也许他们之前确实解释过它,而你只是错过了它,因为解释的一次性性质。没有指控;就是这样。


我们正在尝试评估表达式x + "" + y + " "以便打印它。因为+left-associative,所以这被评估为

((x + "") + y) + " "

因此,就 include 的效果而言"",问题是如何x + ""评估子表达式。如果""省略了,它将被评估为

(x + y) + " "

Java 中的“数字加法”和“字符串连接”没有单独的运算符:两者都使用+. 因此,Java使用一个简单的规则来决定两者:

如果 + 运算符的任一操作数的类型是字符串,则该操作是字符串连接。

因此,x + ""是字符串连接,但x + y将是数字加法。

如果您查看字符串连接的细节

如果只有一个操作数表达式是字符串类型,则对另一个操作数执行字符串转换(第 5.1.11 节)以在运行时生成字符串。

所以这就是说必须将intinint + String转换为字符串,以便将其与另一个字符串连接,这是非常合理的。这个字符串转换是使用以下方法完成的:

如果Tbyteshortint,则使用new Integer(x)

...

转换是通过调用toString不带参数的引用对象的方法来执行的

(“好像”只是说您实际上不必调用的余地new Integer(x)-实现可以使用Integer.toString(x),或其他方法代替)。

然后,串联定义为

在新创建的字符串中,左侧操作数的字符在右侧操作数的字符之前。

鉴于""没有字符,它与(*)someString + ""具有相同的字符是很正常的。someString

因此,int + ""(or "" + int) 只是将 a 转换为 a 的语法int技巧String。这样做没有其他效果。写这个比Integer.toString(x)or更简洁new Integer(x).toString()

还值得指出的是,如果它是"" + x + y + " ". 但是人眼可能不太清楚xandy不会被添加。


(*) 这里的小细节是连接会产生一个字符串(除非两个操作数是常量表达式,在这种情况下连接是在编译时完成的),即someString + "" != someString,即使(someString + "").equals(someString).


推荐阅读