提问人:Boris Hartiník 提问时间:11/10/2023 最后编辑:Boris Hartiník 更新时间:11/10/2023 访问量:70
java 中的三元运算符 - 从编译器和 jvm 的角度来看不理解
Ternary operator in java - not understandin from compiler and jvm perspective
问:
我理解正确吗
字节 b =40;
编译器类型检查值是否属于数据类型(字节)范围内 OK,然后JVM分配内存并保留该值?
如果我没记错的话,我的戏剧在这里是三元运算符
字节 A = 10<20?30:40;
编译器知道数据类型和值常量,因此编译器将进行比较并将值分配给变量“a”??所以在这种情况下 jvm 不分配内存?
第二个例子
int a =30,b=20;
字节 c=(a<b)?10:20;
编译器不知道值 a,b 只对 datatypes(int) 第一行进行类型检查,
第二行编译器知道值 10 和 20,但比较将由 JVM 完成(JVM 知道值?因此,JVM 来进行比较并将数字 10 和 20 提升为 int 类型??,因此该数字不能分配给字节变量?...我不知道我在哪里理解为什么数字 20(false) 不能分配给字节......
谢谢
解释运行时编译器类型检查和 jvm 的问题
答:
'...编译器类型检查值是否属于数据类型(字节)范围内 OK,然后JVM分配内存并保留该值?...'
值 40 是一个 int 文字,因此编译器将评估声明的数据类型是否可以包含它。
换言之,以下内容将无法编译。
byte b =1234;
'...编译器知道数据类型和值常量,因此编译器将进行比较并将值分配给变量“a”??所以在这种情况下 jvm 不分配内存?...'
它只会为一个字节分配内存,前提是您提供的值可以适应边界。
这意味着,以下内容将编译。
byte a = 10<20?30:1234;
'...编译器不知道值 a,b 只做类型检查 datatypes(int)-first line ...
。我不知道我在哪里理解为什么数字 20(false) 不能分配给字节......”
解释器不会走得太深。
我想如果你提供一个动态值,它不会评估任何东西。
或者,您可以将 a 和 b 声明为最终值,尽管我不确定这有多实用。
final int a =30,b=20;
byte c= (a<b)?10:20;
评论
int i = 40;
byte b = 40;
char c = '(';
评论
byte c = (byte) ((a < b) ? 10 : 20);
10
20
int
a
b
int
final
int
byte
void foo(byte b) {}
foo(10);