解释为什么会出现错误的输出?

Explain why the Wrong Output Happened?

提问人:Avijit Mandal 提问时间:8/17/2020 更新时间:8/17/2020 访问量:68

问:

public class ArrayIntro
{
    public static void main(String[] args)
    {
        int[] a;
        a=new int[10];
        Scanner sc =new Scanner(System.in);
        for(int i=0;i<10;i++)
        {
            a[i]=sc.nextInt();  
        }
        for(int e:a)
        {
            System.out.print(e+' ');
        }
    }
}

输入:1 2 3 4 5 6 7 8 9 10
输出:33343536373839404142

它意味着每个数字增加了 32

Java 数组 io java.util.scanner

评论

0赞 Dawood ibn Kareem 8/17/2020
尝试而不是 - 当您将其添加到数字时,数据类型会做一些疯狂的事情。" "' 'char

答:

1赞 Sagar Gangwal 8/17/2020 #1

只需尝试以下代码即可。

当您在 for 循环内部打印 sout 时,它打印的是 number 和 Space( ' ') 的总和。空间的 ASCII 值为 32,因此您可以看到附加值为 32 的每个元素。

对于ASCII或Unicode,您可以参考此链接,它将为您提供帮助。

只需输入类似 System.out.print(new Integer(' '));,它将打印 32。

如果您只想添加空格,请使用双引号。System.out.print(e+“ ”);.

单引号被视为与 Integer 一起添加的字符和字符将用它们的 ASCII 代码进行总结。

public static void main(String[] args)
    {
        int[] a;
        a=new int[10];
        Scanner sc =new Scanner(System.in);
        for(int i=0;i<10;i++)
        {
            a[i]=sc.nextInt();  
        }
        for(int e:a)
        {
            System.out.print(e+" ");
        }
    }

评论

0赞 Avijit Mandal 8/17/2020
谢谢。但为什么要添加这些呢?
0赞 Sagar Gangwal 8/17/2020
这条线的行为是这样的 1+32 ,2+32 ,3+32,因为空间的 ASCII 是 32。System.out.print(e+' ');
0赞 Sagar Gangwal 8/17/2020
您可以使用双引号代替单引号,如下所示:'System.out.println(e+ “ ”);'
0赞 Dawood ibn Kareem 8/17/2020
我觉得这个答案不能充分解释用值加法和用值加法之间的区别。此外,经常提到 ASCII 非常具有误导性——大多数 Java 值根本没有 ASCII 表示,因此这个答案不适用于它们。charStringchar
0赞 Sagar Gangwal 8/17/2020
@DawoodibnKareem他的问题是为什么每个数字都加 32。所以简单的答案是,当你把单引号的空格放在空格上时,它被认为是空格字符,在 java 中有 32 个 UNICODE 值,这就是为什么它用每个数字加 32 的原因。space character (' ')
1赞 Hari Perisetla 8/17/2020 #2

简单地说,' ' 是 ASCII 中的一个字符,它的值是 32。所以,据我所知,你可能希望它直接打印,这样你就可以用“”替换''。永远记住,单引号用于字符,双引号用于字符串。

对于您的答案,您可以这样做:System.out.print(e+" ");

取而代之的是:System.out.print(e+' ');

0赞 Dawood ibn Kareem 8/17/2020 #3

简而言之,要修复您的程序,您需要使用(带双引号)而不是 ." "' '

问题是运算符在 Java 中有两种不同的含义。+

  • 如果任一个操作数是 ,则表示“将这两个操作数连接在一起”。如果另一个操作数不是 ,那么它就必须以某种方式进行转换,并且有一些关于如何执行此操作的规则。String+String
  • 如果两个操作数都不是 ,则表示“将这两个操作数相加”——也就是说,它们被视为数字。它们可以添加为值、值、值或值,具体取决于数据类型。但如果它们是 ,或者 ,它们将被视为 。这称为二进制数字提升,并在 Java 语言规范中有详细解释。String+doublefloatlongintshortbytecharint

现在在 Java 中,单引号用于分隔文字。所以当你写 时,你是在 .这是加法 - 将 视为 ,而操作数则作为数字相加。对应的数字是 32,因为这是 Java 使用的字符编码中的数值,类似于 UTF-16。与此页面上的其他一些答案相反,它不是 ASCIIchare + ' 'intcharcharint

双引号用于分隔文本。所以如果你写 ,操作数是 an 和 a 。这意味着您不再添加任何内容,而是连接。转换为 first,然后连接为 ,这将为您提供预期的结果。Stringe + " "intStringintString" "