这是Java编译器错误还是正确的语句?

这是Java编译器错误还是正确的语句?,java,Java,几天前,我在java代码中输入了一个错误,但它编译后运行良好。(尽管结果很奇怪。) 我的代码是: public static void main(String args[]) { String strOut; char cSEP = '|'; String sSEP = "|"; strOut = "AA" + cSEP + "BB"; // Correct assignment System.out.println(strO

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

字符串和字符之间的差异非常显著。某些数值运算符应用于
char
时,会将
char
转换为
int
(称为)。另一方面,只有二进制
+
运算符被定义为
字符串

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

strOut = "AA" + (+ cSEP) + "BB";
一元
+
运算符应用于
字符
时,通过一元数值提升将整个表达式转换为
int
。该值等于字符的编码值。因此,表达式变成:

strOut = "AA" + 124 + "BB";
这是有效的

但如果将
cSEP
替换为
sSEP

strOut = "AA" + (+ sSEP) + "BB";
Java编译器不知道
+sSEP
是什么意思。未为
字符串定义
+
一元运算符

这是正常的Java(表达式)语法。在表达式中:

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

请注意,一元
+
比二进制
+
具有更高的优先级,因此上述值相当于:

"AA" + ( + cSep )
"AA" + ((int) cSep)
"AA" + Integer.toString((int) cSep)
但表达方式是:

"AA" + + cSep
"AA" + + sSep
是非法的,因为一元
+
运算符未为
字符串定义


但是
“AA”++cSep
实际上做什么呢

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

"AA" + ( + cSep )
"AA" + ((int) cSep)
"AA" + Integer.toString((int) cSep)
这反过来相当于:

"AA" + ( + cSep )
"AA" + ((int) cSep)
"AA" + Integer.toString((int) cSep)
这意味着
AA
后面将有一个十进制数字,而不是管道字符

参考资料:


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

那么你的情况呢 strOut=“AA”++cSEP+“BB”; =“AA”+“|”+“BB”

+所以这个“|”将被转换成它的unicode值,“|”的unicode值是124

在字符串上,我们不能应用一元+运算符,因此在这种情况下 strOut=“AA”++sSEP+“BB”;
出现错误

与任何其他原语一样,字符可以用作数值。一根绳子不行。我在这里没有看到任何错误。@ernest_k我说错了:像大多数其他原语一样:)@Stultuske,我当时正忙着使用
+true
(它的意思是“真的!”,对吧?)。@所有那些自动认为两个正数不可能变成负数的人。。。。“是的,对!”:)我可能会给这个加上一张支票。