拿到机上测了下,发现以下问题;
byte a = 1; //编译器检测一下int结果有没有越界,没有
byte a1 = 134; //报错:这里就表明编译器检测出int越界了
byte b = 2;
byte c = 1+126; //不报错
byte c = 1+127; //报错:表明编译器在两int型相加时,还检测结果是否大于byte的最大值
byte c = a + 1; //报错:表明编译器看到有int型与a相加时,但编译忘记了a是多少了,都不知a是多少那就没法运算了,直接报错
//报错:编译器a +b 运算时,他却突然忘a b 的值是多少(张老说过编译器是一行一行检查的,但还是能记住a b 什么类型),没法检查运算结是否越界;
//只好报错
byte c = a + b;
byte d = (byte)(a+b);//强转的,一定行,不查了
//这个阶段虚拟机,应不会参与进来的,反正觉得它参与了不合常理
但是:编译没说它忘了a b 是多少,而是报int不能转为byte
Multiple markers at this line
- Duplicate local variable c
- Type mismatch: cannot convert from int to byte
你说的介些,俺们都晓得...俺也实验了N次
你木有说byte c = a + b ;编译不通过到底是因为啥...请表态哈...
请盆友们来点猛料,,力求简洁.作者: wahaha 时间: 2013-2-28 08:34
哥们,辛苦了...你用心了
你说的介些,俺们都晓得...俺也实验了N次
你木有说byte c = a + b ;编译不通过到底是因为啥...请表态哈...
请盆友们来点猛料,,力求简洁.作者: 谢洋 时间: 2013-2-28 10:09
夏添 发表于 2013-2-28 08:34
哥们,辛苦了...你用心了
你说的介些,俺们都晓得...俺也实验了N次
我语文学得不好,表达不行啊!
先明确一点,编译器是一行行的检查有没有错的,所以说它忘了之前做过的事(这是张老师说的,不是我说,错了不关我的事)。
当编译器检查到byte c = a + b;
1,先做的是转为int型再相加;
2,然后试图检测这两变量运算结果是否大于127,但这时编译器根本不知道变量a b 的值多少;
3,既然都没知到a b 值是多少,肯定检测不出 a b 相加的结查是否大于127;
4,这时候编译器是选择报错还是不报错?很明显它选择了报错:哥们这代码结果我算不出来,你写的,你自己看着办吧
5,疑问?编译器知道变量a b 的地址?如果知道,为什么不根据地址把a b 的结果取出来看一下不就完了?作者: wahaha 时间: 2013-2-28 13:04