在Java中,为什么int a=(';a';和+;和#x27;b';和#x27;c';)的输出;是不同形式的System.out.println(';a';b';b';c';+;)
原来的问题是这样的在Java中,为什么int a=(';a';和+;和#x27;b';和#x27;c';)的输出;是不同形式的System.out.println(';a';b';b';c';+;),java,Java,原来的问题是这样的 public class test { public static void main(String[] args){ int i = '1' + '2' + '3' + ""; System.out.println(i); } } 这给了我一个错误: Exception in thread "main" java.lang.Error: Unresolved compilation problem: Type mi
public class test {
public static void main(String[] args){
int i = '1' + '2' + '3' + "";
System.out.println(i);
}
}
这给了我一个错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from String to int
然后我更改了代码,如下所示:
public class test {
public static void main(String[] args){
int i = '1' + '2' + '3';
System.out.println(i);
}
}
public class test {
public static void main(String[] args){
System.out.println('a'+'b'+'c'+"");
}
}
输出为150
但当我这样编写代码时:
public class test {
public static void main(String[] args){
int i = '1' + '2' + '3';
System.out.println(i);
}
}
public class test {
public static void main(String[] args){
System.out.println('a'+'b'+'c'+"");
}
}
输出变为294
我想知道为什么。- 第一个不编译,因为您在末尾连接了一个字符串,这导致该值是一个无法直接转换为int的字符串
- 第二个字符的输出是150,因为字符1,2,3的ASCII值是49,50,51,在进行加法时返回150
- 最后一个的输出是294,因为您正在ASCII表(97+98+99)中添加字符值
如果执行
Integer.parseInt('1'+'2'+'3'+'),则第一个选项可以工作代码>第一个是不可能的,因为您不能用这种方式将字符串
转换为int
第二种方法很有效,因为char
s是一种数字,所以添加char
s就是添加真正的数字。Char'1'
是数字49(见ASCII表),因此总和为49+50+51,即150
第三个是这样工作的,因为+
是一个左括号运算符,这意味着'a'+'b'+'c'+''
应该读作(('a'+'b')+'c')+''
<代码>'a'
具有ASCII代码97,因此您具有294+“”
。然后Java知道is应该将值转换为字符串
,以便能够连接这两个字符串。最后是字符串294
。将上一个代码修改为以下System.out.println('a'+'b'+('c'+))
您将看到结果将是195c
您必须注意,System.out.println
是一种用于将值(不同类型)转换为其字符串
表示形式的方法。这始终是可能的,因为每个int
都可以转换为它的字符串
表示形式,但反之亦然;并非每个字符串
都是int
的表示形式(因此Java不会让您这么简单地执行此操作)。当您执行此操作时
int i = '1' + '2' + '3';
JVM对给定数字的ASCII码求和。结果是150
当您添加空的字符串
时,您试图将int
/字符
与字符串
相加。这是不可能的。您可以将char
隐式转换为int
,反之亦然,因为它们是基本类型。不能对String
对象执行此操作,因为它们不是基本体,而是引用。这就是为什么会出现错误
执行println
操作时,首先对基本值求和,然后自动将装箱到引用类型中,因此将总和装箱到字符
对象中。空的字符串
转换为字符
,然后添加到第一个字符中。因此,结果是一个字符
对象,其ASCII码为294。然后调用字符的toString
方法,因为println(Object)
方法就是这样做的。结果是294
我希望这将有助于您理解正在发生的事情:)首先:[int I='1'+'2'+'3'+'';]
如果压缩空字符串值,则将其转换为字符串对象,然后字符串对象无法转换为int
第二:[inti='1'+'2'+'3';]
char上的二进制算术运算升级为int。它等于:
[int i=49+50+51]-总计:150
第三:[System.out.println('a'+'b'+'c'+');]
在这种情况下,您可以将'a'+'b'+'c'(即294)转换为字符串(+“”),然后将结果打印为字符串值,这样就可以了。150和294之间的区别在于,您没有对相同的字符求和('1','2','3'与'a','b','c')。@RC mot a replicate,不包括添加字符串时发生的情况。@djechlin,选择的答案,回答它。@yunandtidus这个问题太密集/太长了。对这个问题的简明回答有很多价值。尽管下面的简明答案有点不完整,但我还是把它选了上去。@yunandtidus例如,为什么int x='a'+'b'+'c'+''不好,而System.out.println('a'+'b'+'c'+'')好?这是一个多样化的问题,但我当然不想惩罚OP做更多的研究,一个好的答案真的应该涵盖它。我认为这个答案抓住了实际情况,而且我学到了一些东西。(此外,它坚定地表明这个问题不是重复的。)