我正在使用反编译到java代码来研究kotlin。
我发现了一个有趣的细微差别,无法理解它是如何实现的。
这是kotlin代码:
val result = 50 in 1..100
我正在使用intelij idea反编译来查找java代码的等价物,这就是我们所拥有的:
public final class Test14Kt {
private static final boolean result = true;
public static final boolean getResult() {
return result;
}
}
据我所知,kotlinc知道该元素在范围内并在编译阶段将结果变量保存为true。
很酷。但它是如何实现的?
答案 0 :(得分:4)
这很简单constant folding:
常量表达式中的术语通常是简单的文字,例如整数文字2,但它们也可能是在编译时已知其值的变量。请考虑以下声明:
i = 320 * 200 * 32;
大多数现代编译器实际上不会为此语句生成两个乘法指令和存储。相反,它们识别这些构造,并在编译时替换计算值(在本例中为2,048,000)。生成的代码将加载计算值并存储它,而不是加载和乘以多个值。
常量折叠甚至可以使用算术标识。当x是整数类型时,即使编译器不知道x的值,0 * x的值也为零。
在这里,
50 in 1..100 ==
1 <= 50 && 50 <= 100 ==
true && true ==
true