【问题标题】:Is this Java compiler error or correct statement? [duplicate]这是 Java 编译器错误还是正确的语句? [复制]
【发布时间】:2020-03-01 12:42:33
【问题描述】:

几天前,我在 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 语法?

【问题讨论】:

  • 一个字符,像任何其他原语一样,可以用作数值。字符串不能。我在这里没有看到任何错误。
  • @ernest_k 我说错了:像大多数其他原语一样 :)
  • @Stultuske 我急于使用+true(它的意思是“真的!”,对吧?)。
  • @AndyTurner 致所有那些自动假设两个积极因素不可能成为消极因素的人......“是的,对!” :)
  • 我可能会为此向Error Prone添加支票。

标签: java


【解决方案1】:

Stringchar 之间的区别很大。一些数字运算符在应用于char 时,会将char 转换为int(这称为unary numeric promotion)。另一方面,只有 binary + 运算符是为 Strings 定义的。

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

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

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

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

这是有效的。

但如果cSEP 被替换为sSEP

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

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

【讨论】:

    【解决方案2】:

    这是普通的 Java(表达式)语法。在表达式中:

    "AA" + + cSep
    

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

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

    "AA" + ( + cSep )
    

    但表达式:

    "AA" + + sSep
    

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


    但是"AA" + + cSep 实际上是做什么的呢?

    一元+ 运算符执行一元数字提升,它将char 转换为int。在上下文中,它相当于:

    "AA" + ((int) cSep)
    

    这又相当于:

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

    这意味着AA 后面会有一个十进制数字,而不是管道字符。

    参考资料:

    【讨论】:

      【解决方案3】:

      这是正确的java语法。在 java 中,如果我们对一个字符应用 + 一元运算符,那么它将该字符转换为它的 unicode 值。 像 +'a' 然后它会将其转换为 97 因为 unicode 值 字符“a”是 97。

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

      +'|'所以这个'|'将被转换成它的 unicode 值和 '|' 的 unicode 值是 124。

      在 String 上我们不能应用一元 + 运算符,所以在这种情况下 strOut = "AA" + + sSEP + "BB"; 你得到错误

      【讨论】:

        猜你喜欢
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        • 2021-08-07
        • 1970-01-01
        • 2012-08-06
        • 1970-01-01
        相关资源
        最近更新 更多