java for循环里的变量反编译出问题

for(int i=0;i<10;i++){
int k = 10;
}
编译出的class文件,用jd-gui反编译出来的java文件,结果变成了
for(int i=0;i<10;i++){
i = 10;
}
然后如果是
for(int i=0;i<10;i++){
int k = 10;
System.out.println(k);
}
则反编译出来的就是
for(int i=0;i<10;i++){
int k = 10;
System.out.println(k);
}
到底怎么回事呢?是jd-gui反编译发生的错误?还是本来就这样呢?求大神解疑~

6个回答

编译优化,第一个,k是无意义的,没有被用到,所以编译器直接i=10,不循环了,第二个就不一样了,用到k了,所以不能被优化掉

lmlworld
lmlworld 这里的k实际上也是没有意义的,仅仅是个符号而已
大约 5 年之前 回复
lmlworld
lmlworld 回复u013813491:
大约 5 年之前 回复
lmlworld
lmlworld 回复u013813491:
大约 5 年之前 回复
u013813491
下一页天空 可是,我再用了这样的语句: for(int i=0;i<5;i++){ int k = i+1; } 反编译出来的却是 for (int i = 0; i < 5; i++){ int i = i + 1;//这里变这样了 } T^T咋回事呢
大约 5 年之前 回复

只能说在for循环内,最后一个这种定义后无意义的变量,在本地变量中是找不到的,也就是编译出来的class是没有k的,所以反编译肯定也就没有变量K了。
如果你多定义一个结果就不一样了,这结果K有,但m没有了,因为K在本地变量表中能找到。m没有。
for(int i=0;i<5;i++){ int k = i+1; int m=0;}

原理说不清,编译规则不是那么熟,没究那么深。

编译器产生的代码,是原始代码的等价形式,所谓等价,就是相同的输入,相同的结果。
注意是等价形式,而不是相等。所以编译出来的代码反编译回去和你写的不同这很正常。当然,如果不是等价的,那么可能就是反编译程序或者编译器本身的bug了(编译器的bug这个比较罕见)

java编译器做了优化处理,他能找出并消除哪些不会对输出结果产生任何影响的无用代码,即完成了一定的计算后却不被使用的代码。

被编译器优化了,如果变量不需要被读取,就不建议新增变量。反编译进行了优化,但是生成的代码,在逻辑上是不会有问题的。

如果这样计算,k会有重复定义的错误吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问