几天前,我在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语法?
答案 0 :(得分:10)
String
和char
之间的差异非常明显。一些数字运算符应用于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”; 您遇到错误