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;
}
}
}
解决方案
要回答您的直接问题:您是正确的,""
可以将 the+
转换为串联,而不是加法。但我会提供一些关于这里发生的事情的更多细节。
本书的作者在不解释的情况下使用它可能有点糟糕,因为这似乎是练习中的关键内容(甚至一个简短的脚注说“这只是转换为字符串的简单方法”);但这是大多数 Java 程序员甚至不会考虑需要解释的事情之一,很容易错过;或者,也许他们之前确实解释过它,而你只是错过了它,因为解释的一次性性质。没有指控;就是这样。
我们正在尝试评估表达式x + "" + y + " "
以便打印它。因为+
是left-associative,所以这被评估为
((x + "") + y) + " "
因此,就 include 的效果而言""
,问题是如何x + ""
评估子表达式。如果""
省略了,它将被评估为
(x + y) + " "
Java 中的“数字加法”和“字符串连接”没有单独的运算符:两者都使用+
. 因此,Java使用一个简单的规则来决定两者:
如果 + 运算符的任一操作数的类型是字符串,则该操作是字符串连接。
因此,x + ""
是字符串连接,但x + y
将是数字加法。
如果您查看字符串连接的细节:
如果只有一个操作数表达式是字符串类型,则对另一个操作数执行字符串转换(第 5.1.11 节)以在运行时生成字符串。
所以这就是说必须将int
inint + String
转换为字符串,以便将其与另一个字符串连接,这是非常合理的。这个字符串转换是使用以下方法完成的:
如果
T
是byte
、short
或int
,则使用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 + " "
. 但是人眼可能不太清楚x
andy
不会被添加。
(*) 这里的小细节是连接会产生一个新字符串(除非两个操作数是常量表达式,在这种情况下连接是在编译时完成的),即someString + "" != someString
,即使(someString + "").equals(someString)
.
推荐阅读
- azure-active-directory - Azure 活动目录服务
- python - 在 Python 中将潜在的布尔值转换为布尔值,有什么缺点吗?
- javascript - rxjs v6 / redux-observable v1.0.0:操作员不能在史诗中工作
- pandas - 如何使用非唯一多索引向熊猫数据框添加新行
- ruby - 改进我的正则表达式以包含包含小数和百分号的数字
- variables - RobotFramework:变量范围
- spring - 在回滚的测试中手动执行事务中的代码
- amazon-web-services - 查看器请求和查看器响应的单个 Lambda@Edge 函数调用
- javascript - 内容丰富的 JS:无法通过匹配参考字段来检索条目
- python - 如何扩大数据框 - 熊猫