首页 > 解决方案 > 这是 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 语法?

标签: java

解决方案


aString和 a之间的差异char是显着的。一些数字运算符在应用于 achar时会将 thechar转换为 an int(这称为一元数字提升)。另一方面,只为 s 定义了二元 运算符。+String

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

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

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

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

这是有效的。

但是如果cSEP要替换为sSEP

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

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


推荐阅读