Java 带整数串联的双引号(“”)的用途

Java 带整数串联的双引号(“”)的用途,java,Java,我刚开始写第一本Java书。有一个练习让我大吃一惊,因为下面的代码中有双引号,没有空格。我想我已经弄明白了,但这本书似乎并没有解释这一点,我想确保我前进的方向是正确的 下面代码中的双引号是否用于连接两个整数x和y,并防止+运算符对输出执行加法?看起来就是这样 以下代码的输出为:00 11 21 32 42 我删除了双引号,输出结果是:0 2 3 5 6 class Test { public static void main (String[] args) { i

我刚开始写第一本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;
       }
    }
}
下面代码中双引号的目的是 连接两个整数x和y,并防止+运算符 对输出执行加法

这就是事实。另一种选择是

print(String.valueOf(x) + String.valueOf(y) + " ")

它的可读性要差得多。字符串类型也可以在开始时强制执行,就像在+x+y+中一样,只要我们在开始使用+运算符之前处理字符串。

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

这本书的作者在没有解释的情况下使用它可能有点不好,因为这似乎是练习中的一个关键问题,甚至一个简短的脚注说这只是一种简单的转换为字符串的方法;但这是大多数Java程序员都不会想到需要解释的事情之一,很容易错过;或者,也许他们早就解释过了,而你们只是错过了,因为解释的随意性。没有指控;事情就是这样

我们试图计算表达式x++y+,以便打印它。因为+是,所以将其计算为

((x + "") + y) + " "
(x + y) + " "
因此,就包含的效果而言,问题是如何计算子表达式x+。如果省略了,则其评估为

((x + "") + y) + " "
(x + y) + " "
Java中没有用于数字相加和字符串串联的单独运算符:两者都使用+。因此,Java需要在两者之间做出选择:

如果+运算符的任一操作数的类型为字符串,则该操作为字符串串联

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

如果你调查:

如果只有一个操作数表达式为String类型,则在运行时对另一个操作数执行字符串转换§5.1.11以生成字符串

这意味着int+String中的int必须转换成一个字符串,以便将它与另一个字符串连接起来,这是非常合理的。这是通过以下方式实现的:

如果T是byte、short或int,则使用新的Integerx

转换是通过调用引用对象的toString方法来执行的,没有参数

就好像说您实际上不必调用新的Integerx,这只是一个回旋的空间——实现可以使用Integer.toString或其他方法

然后,连接:

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

如果没有字符,那么someString+将具有与someString*相同的字符,这一点非常正确

因此,int+或+int只是将int转换为字符串的语法技巧。这样做没有其他效果。写这个比Integer.toStringx或新Integerx.toString要简单

同样值得指出的是,如果它是+x+y+,它也会起同样的作用。但是,对于人眼来说,x和y不会被加上,这可能就不那么清楚了


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

否则它也会进行整数加法1++2是12,但1+2是3-更好的方法是将int转换为字符串,即使用Integer.valueOf方法。目的是强制java将+解释为字符串串联而不是整数加法。不要亲自投票-这不是Facebook或Reddit。无论是谁投票否决了你,他都可能希望你下次在我为避免重复问题而搜索时更加努力。请记住,SO不仅仅是为了回答您的问题,而是为了创建一个资源来帮助许多用户继续前进。在这种情况下,重复只会增加噪音。是的,如果下一位选民解释投票结果会更好,但这正是人们现在的情况,而不仅仅是这样。@ScaryWombat Integer.valueOfx返回一个整数。你是说Integer.toStringx吗。因为你说过更好的方法是将int转换成字符串…@biscuit-不止一种方法可以转换成sk
在catOr中,您可以使用单独的打印语句。@Andy Turner嗯,打印该值的方法有几十种。但code golf将是一个更好的展示它们的地方。