这是Java编译器错误还是正确的语句?
几天前,我在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
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
(它的意思是“真的!”,对吧?)。@所有那些自动认为两个正数不可能变成负数的人。。。。“是的,对!”:)我可能会给这个加上一张支票。