主题:【游戏】不看不知道,一看吓一跳!!! -- Highway
第一个不会死循环,马上退出。
第二个先打印the null set,后physics chemistry biology。
到底是什么情况。注意第二题的做法。
1)先编译两个class.
2) 修改Words,然后志编译它。
再试试看!
java1.4.2_08b
前面的一个题请看一下我的回复,再做一次!
注意第二题的做法。
1)先编译两个class.
2) 修改Words,然后志编译它。
再试试看!
岂不是5.0的bug?这个难算Feature吧。
结果同前面wsxx兄用jsdk1.4.2得出的一样。
第一个,直接跳出,不会死循环。
第二个,先是the null set,后是physics chemistry biology。
这也是我们expected的结果。
第一个,前面你可我服兄解释了,三个条件是互斥的,如果能跳进去死循环,我想应该被视作bug吧!除非“=”的被overload了,含义不同,但c++允许operator overload,java中好像不允许这么做。
第二个,打出physics chemistry biology也没什么不合理的,本来程序就是expect这个结果。
在下不是写Java的,说错的地方请多多指教。
MILLIS_PER_DAY = 86400000=0x5265C00
MICROS_PER_DAY = 86400000000 = 0x141DD76000 > 0xFFFFFFFF (long是32bit?)
去掉溢出的位,实际上是0x1DD76000=500654080
500654080/86400000 = 5.79xxxxx
因为是long,所以取整,为5。
也就是你修改了Words Class后,没有Touch PrintWords.class,只编译了Words.java(假设PrintWords已经发布到了客户手里)。你会发现我们原来以为的run time dymanic loading有了问题。至于为什么,我在下面的帖子里有解释。
第一个问题我们都认为那个条件肯定是false。循环不可能进入。但是在Java 5.0中,它是可以成立的。比如
Integer i = new Integer(0);
Integer j = new Integer(0);
这样,
while (i <= j && j <= i && i != j) {
}
将无限循环。注意,Java 5.0中<=, >=操作符适用于Object,具体比较的时候要先unbox,比的是两个Object的值。而i和j是两个不同的Object,!=是成立的,!=是Object间的比较。
问题是中间结果是在int里存放的,发生了溢出错误,这个问题我们很容易忽略。
没看您老下面的文章。
看来Java,细巧处比C++深奥得多啊!
又试了一下,正如兄言。
多谢指教!
第二个是我反编译了class发现的。
long那个问题,以前我还真没注意过。其实还有类似一个小题,是用float还蒙蔽我们的。在Java里面,float 是 Single-precision floating point,是32-bit的,Range比int还小,不小心就会犯错误。
第一题,俺解题时毫不犹豫地就把 != 给改成 <> 了――java里面原来并没有 != 的嘛.......呵呵呵
看来这才是祸根。