这是Java编译器错误还是正确的语句?

时间:2019-11-05 07:21:21

标签: java

几天前,我在Java代码中打了一个错字,但它编译并运行良好。 (尽管结果很奇怪。)

我的代码是:

public  static  void    main(String args[])  {
    String  strOut;
    char    cSEP = '|';
    String  sSEP = "|";

    strOut = "AA" + cSEP + "BB";    // Correct assignment
    System.out.println(strOut);     // The result is "AA|BB". This is OK.

    strOut = "AA" + + cSEP + "BB";  // No Error : no token between two +
    System.out.println(strOut);     // The result is "AA124BB"

    strOut = "AA" + + sSEP + "BB";  // This is compiler error !!!
    System.out.println(strOut);
}

我找不到第二个作业为什么没有错误并打印124的原因。 (当然,“ |”在ASCII代码中是124。但是为什么是“ 124”,而不是“ |”?)

这是编译器错误吗?还是我不知道的正确Java语法?

3 个答案:

答案 0 :(得分:10)

Stringchar之间的差异非常明显。一些数字运算符应用于char时,会将char转换为int(称为unary numeric promotion)。另一方面,仅为+定义了 binary String运算符。

在代码的第二和第三行中,表达式的解析如下:

strOut = "AA" + (+ cSEP) + "BB";

一元+运算符应用于char时,通过一元数值提升将整个表达式转换为int。该值等于字符的编码值。因此表达式变为:

strOut = "AA" + 124 + "BB";

这是有效的。

但是如果将cSEP替换为sSEP

strOut = "AA" + (+ sSEP) + "BB";

Java编译器不知道+ sSEP是什么意思。未为+定义String一元运算符!

答案 1 :(得分:4)

这是正常的Java(表达式)语法。在表达式中:

"AA" + + cSep

第二个+是一元+运算符,适用于(仅)数字类型。 char类型是Java中的数字类型。

请注意,一元+的优先级高于二进制+,因此上述等价于:

"AA" + ( + cSep )

但是表达式:

"AA" + + sSep

是非法的,因为未为+定义一元String运算符。


但是"AA" + + cSep的实际作用是什么?

让一元+运算符执行一元数值提升,该运算将char转换为int。在上下文中,它等效于:

"AA" + ((int) cSep)

依次相当于:

"AA" + Integer.toString((int) cSep)

这意味着AA后将有一个十进制数字,而不是竖线字符。

参考文献:

答案 2 :(得分:0)

这是正确的Java语法。在Java中,如果我们对字符应用+一元运算符,则它将该字符转换为Unicode值。 就像+'a'一样,它将转换为97,因为的unicode值 字符“ a”为97。

所以在你的情况下 strOut =“ AA” + cSEP +“ BB”;        =“ AA” + +'|' +“ BB”;

+'|'所以这个“ |”将转换为它的unicode值和'|'的unicode值是124。

在String上,我们不能应用一元+运算符,因此在这种情况下  strOut =“ AA” + sSEP +“ BB”; 您遇到错误