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構文?
スイーパー:
違いString
とchar
重要です。適用されたときに、いくつかの数値演算子には、char
ターンchar
にint
(これが呼び出される単項数値昇格)。一方、唯一のバイナリ +
演算子は、のために定義されているString
S。
あなたのコードの第二と第三のラインでは、表現は次のように解析されます。
strOut = "AA" + (+ cSEP) + "BB";
単項+
に適用される演算子は、char
、に式全体を回すint
単項数値昇格を通じて。値は、文字の符号化された値に等しいです。だから、式は次のようになります。
strOut = "AA" + 124 + "BB";
これは有効です。
しかし、場合cSEP
に置き換えることがなかったですsSEP
。
strOut = "AA" + (+ sSEP) + "BB";
Javaコンパイラは何を知っていない+ sSEP
ことを意味します。+
単項演算子はのために定義されていませんString
!