このJavaコンパイラエラーや正しい文はありますか?

user727062:

数日前、私は、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構文?

スイーパー:

違いStringchar重要です。適用されたときに、いくつかの数値演算子には、charターンcharint(これが呼び出される単項数値昇格)。一方、唯一のバイナリ +演算子は、のために定義されているStringS。

あなたのコードの第二と第三のラインでは、表現は次のように解析されます。

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

単項+に適用される演算子は、char、に式全体を回すint単項数値昇格を通じて。値は、文字の符号化された値に等しいです。だから、式は次のようになります。

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

これは有効です。

しかし、場合cSEPに置き換えることがなかったですsSEP

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

Javaコンパイラは何を知っていない+ sSEPことを意味します。+単項演算子はのために定義されていませんString

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=330127&siteId=1