java - 这是 Java 编译器错误还是正确的语句?
问题描述
几天前,我在 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 语法?
解决方案
aString
和 a之间的差异char
是显着的。一些数字运算符在应用于 achar
时会将 thechar
转换为 an int
(这称为一元数字提升)。另一方面,只为 s 定义了二元 运算符。+
String
在代码的第二行和第三行中,表达式解析如下:
strOut = "AA" + (+ cSEP) + "BB";
一元运算+
符在应用于 a 时char
,会将整个表达式转换为int
一元数字提升。该值等于字符的编码值。于是表达式变为:
strOut = "AA" + 124 + "BB";
这是有效的。
但是如果cSEP
要替换为sSEP
:
strOut = "AA" + (+ sSEP) + "BB";
Java 编译器不知道是什么+ sSEP
意思。一+
元运算符未定义为String
!
推荐阅读
- voice - sox.core.SoxError: Stdout: Stderr: sox FAIL formats: 'XXX': WAVE: RIFF header not found when processing voice files from wxrobot
- android - 使用位图将图像文件转换为字节数组
- node.js - 反应应用程序未在具有不同节点和 npm 的计算机上启动
- python-3.x - 如何使用 selenium 和 python 将 Tab 键输入发送到 Web 浏览器
- python - 可迭代对象是原始对象的副本吗?
- php - Apache 和 PHP - 我的服务器返回一个空响应而没有告诉我原因
- postgresql - 为同一数据库服务器上的多个数据库创建连接池(Spring Boot)
- javascript - 使用 Ramda 的地图和深度对象
- r - rhandsontable 下拉菜单隐藏在短数据框中
- mysql - vb.net 将数据源设置为组合框