Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,为什么int a=(';a';和+;和#x27;b';和#x27;c';)的输出;是不同形式的System.out.println(';a';b';b';c';+;)_Java - Fatal编程技术网

在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)中添加字符值
您可以验证a、b和c(或任何其他字符)的值

编辑:要解释为什么最后一个输出正确的值而不是抛出错误,请首先按照前面的说明对所有值求和,然后将其转换为字符串,并将“”添加到字符的ASCII值之和。但是,println方法需要一个字符串,这就是它不会抛出任何错误的原因


如果执行
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做更多的研究,一个好的答案真的应该涵盖它。我认为这个答案抓住了实际情况,而且我学到了一些东西。(此外,它坚定地表明这个问题不是重复的。)