带整数连接的双引号(“”)的目的

时间:2019-10-09 05:33:31

标签: java

我刚开始写《 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;
       }
    }
}

2 个答案:

答案 0 :(得分:6)

要回答您的直接问题:您正确地知道,""可以将+变成串联,而不是加法。但是,我将提供更多有关此处发生情况的详细信息。

不作解释就使用此书,可能对本书的作者有些不利,因为这似乎是练习中的关键(即使是简短的脚注,“这只是转换为字符串的一种简便方法”) );但这是大多数Java程序员甚至不考虑需要解释的事情之一,非常容易错过;或者,也许他们确实早先做了解释,而您却错过了,因为这种解释的随意性。没有指控;就是这样。


我们正在尝试对表达式x + "" + y + " "进行求值以进行打印。由于+left-associative,因此其评估为

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

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

(x + y) + " "

Java中没有单独的用于“数字加法”和“字符串连接”的运算符:都使用+。因此,Java uses a simple rule在两者之间做出决定:

  

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

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

如果您查看the specifics of string concatenation

  

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

因此,这是说int中的int + String必须转换为字符串,才能将其与另一个字符串连接,这是很合理的。而此string conversion使用以下命令完成:

  

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

     

...

     

该转换就像通过调用无参数的引用对象的toString方法一样执行

(“好像”只是摆动空间,表明您实际上不必必须调用new Integer(x)-实现可以使用Integer.toString(x)或其他方法)。

然后,串联is defined as

  

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

鉴于""没有字符,someString + ""someString(*)具有相同的字符是很简单的。

因此,int + ""(或"" + int)只是将int转换为String的语法技巧。这样做没有其他效果。相比Integer.toString(x)new Integer(x).toString()来说,编写此代码要花些时间。

还值得指出的是,它与"" + x + y + " "相同。但这在人眼中似乎不太清楚xy将不会被添加。


(*)这里有一点点细节,就是串联产生一个 new 字符串(除非两个操作数是常量表达式,在这种情况下,串联是在编译时完成的),即{{1 }},即使someString + "" != someString

答案 1 :(得分:5)

  

下面代码中双引号(“”)的目的是   连接两个整数(x和y),并防止+运算符   对输出执行加法运算?

就是这样。另一种可能是

SUM (CASE WHEN MRP.STOCK_TYPE  = 'A' THEN MRP.QUANTITY ELSE 0 END) AS 'Uncovered Qty', 
SUM (CASE WHEN MRP.STOCK_TYPE <> 'A' THEN MRP.QUANTITY ELSE 0 END) AS 'Blank Qty'

它的可读性差很多。就像在print(String.valueOf(x) + String.valueOf(y) + " ") 中一样,也可以在一开始就强制使用String类型,只要我们在开始使用"" + x + y + " "运算符之前就处理String。