我刚开始写《 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;
}
}
}
答案 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使用以下命令完成:
如果
T
是byte
,short
或int
,请使用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 + " "
相同。但这在人眼中似乎不太清楚x
和y
将不会被添加。
(*)这里有一点点细节,就是串联产生一个 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。