西西河

主题:【游戏】不看不知道,一看吓一跳!!! -- Highway

共:💬47 🌺6
全看树展主题 · 分页首页 上页
/ 4
下页 末页
家园 我用1.4.2_08b,都挺正常的啊

第一个不会死循环,马上退出。

第二个先打印the null set,后physics chemistry biology。

家园 这个考试是在Java 5.0下面进行的。我手边没有1.4.2,不知道

到底是什么情况。注意第二题的做法。

1)先编译两个class.

2) 修改Words,然后志编译它。

再试试看!

家园 我的结果是5

java1.4.2_08b

家园 Why 5?

前面的一个题请看一下我的回复,再做一次!

注意第二题的做法。

1)先编译两个class.

2) 修改Words,然后志编译它。

再试试看!

家园 要那样

岂不是5.0的bug?这个难算Feature吧。

家园 说说你是什么结果,怎么想的?
家园 刚刚特意download了JSDK 1.5.0 update 4 (就是Java5.0吧) 试了一下

结果同前面wsxx兄用jsdk1.4.2得出的一样。

第一个,直接跳出,不会死循环。

第二个,先是the null set,后是physics chemistry biology。

这也是我们expected的结果。

第一个,前面你可我服兄解释了,三个条件是互斥的,如果能跳进去死循环,我想应该被视作bug吧!除非“=”的被overload了,含义不同,但c++允许operator overload,java中好像不允许这么做。

第二个,打出physics chemistry biology也没什么不合理的,本来程序就是expect这个结果。

在下不是写Java的,说错的地方请多多指教。

家园 MICROS_PER_DAY溢出了

MILLIS_PER_DAY = 86400000=0x5265C00

MICROS_PER_DAY = 86400000000 = 0x141DD76000 > 0xFFFFFFFF (long是32bit?)

去掉溢出的位,实际上是0x1DD76000=500654080

500654080/86400000 = 5.79xxxxx

因为是long,所以取整,为5。

家园 先说第二个,答案是the chemistry set,如果按照规定的步骤来做的话

也就是你修改了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间的比较。

家园 long在java里面是64位,足够存放MICROS_PER_DAY

问题是中间结果是在int里存放的,发生了溢出错误,这个问题我们很容易忽略。

家园 Sorry

没看您老下面的文章。

看来Java,细巧处比C++深奥得多啊!

家园 明白了

又试了一下,正如兄言。

多谢指教!

家园 客气了。这两个题我也都答错了。第一个答案是上网看来的,

第二个是我反编译了class发现的。

long那个问题,以前我还真没注意过。其实还有类似一个小题,是用float还蒙蔽我们的。在Java里面,float 是 Single-precision floating point,是32-bit的,Range比int还小,不小心就会犯错误。

家园 原来是我不好,呵呵呵

第一题,俺解题时毫不犹豫地就把 != 给改成 <> 了――java里面原来并没有 != 的嘛.......呵呵呵

看来这才是祸根。

家园 != Java里面可是一直有的。&lt;&gt;那是VB里的东西
全看树展主题 · 分页首页 上页
/ 4
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河