【发布时间】:2020-04-22 04:37:02
【问题描述】:
char a = '1'-48; 在 BlueJava 版本 3.1.4 中不显示编译,而 char a = '1'-48.0 显示编译错误。请澄清。
【问题讨论】:
标签: java implicit typecasting-operator
char a = '1'-48; 在 BlueJava 版本 3.1.4 中不显示编译,而 char a = '1'-48.0 显示编译错误。请澄清。
【问题讨论】:
标签: java implicit typecasting-operator
Java 语言规范,5.2. Assignment Contexts 章说:
另外,如果表达式是
byte、short、char或int类型的常量表达式(§15.29):
- 如果变量的类型为
byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用缩小原语转换。
在char a = '1'-48语句中,表达式是int类型的常量表达式,所以赋值有效。
在char a = '1'-48.0语句中,表达式是double类型的常量表达式,所以赋值无效。
它甚至不适用于long,例如char a = '1'-48L 也会失败。
上述允许常量表达式隐式缩小原始转换的规则已添加到语言中,以简化将常量表达式分配给“低于”int 的原始值,因为所有运算符都隐式地将值“提升”为int。这样做是为了“撤消”扩大到int,不允许在没有强制转换的情况下分配任何常量表达式。
【讨论】: