【发布时间】:2012-06-16 00:52:32
【问题描述】:
int i = 0;
int k = Integer.parseInt("12");
int j = k;
System.out.println(i+1 + " " + j+1);
奇怪的是收到的输出是
1 121
我无法弄清楚这个基本区别。请帮帮我。
【问题讨论】:
int i = 0;
int k = Integer.parseInt("12");
int j = k;
System.out.println(i+1 + " " + j+1);
奇怪的是收到的输出是
1 121
我无法弄清楚这个基本区别。请帮帮我。
【问题讨论】:
如下使用括号
System.out.println((i+1) + " " + (j+1));
来自docs
+ 运算符在语法上是左结合的,不管它是否 后来通过类型分析确定表示字符串连接 或加法。在某些情况下,需要小心才能获得所需的结果。 例如,表达式:
a + b + c 总是被认为是意思:(a + b) + c
将此扩展到您的场景
i+1 + " " + j+1
变成了
(((i + 1) + " ") + j)+1
因为 i 是一个 int 所以 (i + 1) = 1 ,简单的加法
" " 是String 因此((i + 1) + " ") = 1 WITH SPACE(字符串连接)
类似地,当添加j 和最后一个1 时,它被添加到String 因此String 发生连接,这证明了你得到的输出是合理的。 p>
见
【讨论】:
int i = 0;
int k = Integer.parseInt("12");
int j = k;
System.out.println(i+1 + " " + (j+1));
基本上当你把 + " " + 放在这个 java 之后只是将值附加为字符串。
当你把 (j+1) 放在括号中时,它的优先级会更高,它会首先执行它并执行求和运算。
【讨论】:
那是因为" "。
每当一个字符串出现时,java 不会在此之后进行任何计算,只是将其附加为字符串。
因此,在您的情况下,i+1 被计算为1,但" " + j+1 中包含字符串。所以,它只是附加在一起形成121
【讨论】:
" ".concat(j).concat(1)(或使用 StringBuilders 的类似版本,具体取决于您的代码和 JVM 版本)。它猜不出你想要什么,所以从左到右的解释很自然。
01 121...它在概念上像(0+1) + " ".append(j).append(1)
您看到此行为的原因是+ 运算符的序列是从左到右计算的。所以它被评估为好像带括号的:
System.out.println((((i + 1) + " ") + j) + 1);
第一个运算符将两个 int 值相加并产生一个 int 值。下一个+ 将int 添加到String 并生成String。之后,一切都是字符串连接。你可以引入自己的括号来得到你想要的结果。
【讨论】:
当你使用" " 之后的表达式被评估为字符串。
在表达式周围使用方括号( 和) 可以解决手头的问题。
System.out.println(i+1 + " " + (j+1));
【讨论】:
+ 运算符为加法和字符串连接重载你正在做的是字符串连接而不是加法。使用括号执行加法。
【讨论】:
parseint 基本上会返回 int(看 Java API),而 Java 中只有一种 int 类型。在本例中,您使用了“”,java 会将其视为字符串。在任何操作中,请确保不要将字符串与计算混淆。始终使用括号将字符串与计算分开。
【讨论】:
发生这种情况是因为 + 运算符已经离开关联性并且有一个带有字符串的重载函数,所以当你有这个时
int i = 0;
int k = Integer.parseInt("12");
int j = k;
i+1 + " " + j+1
它首先求和
i + 1 给出 1 然后它求和 1 + " ",它使用它的重载函数来连接 1 和“”,因此它给出一个值为“1”的字符串。之后它对"1 " + j 求和,并且由于其中一个操作数是字符串,所以它执行相同的行为等等。
【讨论】:
Interger.parseInt(String str) 是一个包装类方法,用于将 String obj 类型转换为原始数据类型 (int)。这通常用于集合框架中,用于将原始数据类型转换为对象,反之亦然
【讨论】: