巨人網絡的三道坑爹改錯題


一次筆試引發的血案

讀前須知:

  各位朋友,此篇文章只是本人測試的結果,我的知識和思維必定有限,因此,此篇文章還存在缺陷,如有不正確的地方請大家指出,我及時改正。

  各位看客、牛人,不要小看這幾到題啊,來嘗試一下找錯誤吧,小弟先附上自己的理解(當然是經過測試的),一起交流吧。

  看看你能中幾槍。。。

  巨人網絡2013校園招聘Java程序員筆試題:

1、改錯題(指出錯誤之處並對其進行修改)

  1.1、下列代碼的錯誤之處

  --

  --

 1 public class Question1 {  2     /**
 3  * 判斷是否為奇數  4  * @param i  5  * @return true 為奇數 false 為偶數  6      */
 7     public static boolean isOdd(int i){  8         return i%2==1;  9  } 10     /**
11  * @param args 12      */
13     public static void main(String[] args) { 14         for(int i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++i){ 15             boolean isOdd=isOdd(i); 16             System.out.println(String.format("i=%d,isOdd=%b", i, isOdd)); 17  } 18  } 19 } 

  1.2、下列代碼的錯誤之處

  --

  --

1 public class Question2 { 2     public static void main(String[] args) { 3         final long MICROS_PER_DAY=24*60*60*1000*1000; 4         final long MILLIS_PER_DAY=24*60*60*1000; 5         System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY); 6  } 7 }

  1.3、下列代碼的錯誤之處

  --

  --

1 public class Question3 { 2     public static void main(String[] args) { 3         for(byte b=Byte.MIN_VALUE;b<Byte.MAX_VALUE;b++){ 4             if(b==0x90) 5                 System.out.println("Joy!"); 6  } 7  } 8 }

 


  1.1錯誤:

    1、for語句是死循環; 

    2、判斷int型是否為奇數return i%2==1錯誤,應該為:return i%2!=0;

    3、Mysuny這位朋友提出判斷是否為奇數用i&1最好,我表示贊成,return (i&1)==1;

  測試代碼1:

 1 public class Question1Test2 {  2     /**
 3  * 判斷是否為奇數  4  * @param i  5  * @return true 為奇數 false 為偶數  6      */
 7     public static boolean isOdd(int i){  8         return i%2==1;  9  } 10     /**
11  * @param args 12      */
13     public static void main(String[] args) throws Exception { 14         for(int i=Integer.MAX_VALUE-5;i<=Integer.MAX_VALUE;++i){ 15             boolean isOdd=isOdd(i); 16             System.out.println(String.format("i=%d,isOdd=%b", i, isOdd)); 17             Thread.sleep(500); 18  } 19  } 20 }

  結果:

1 i=2147483642,isOdd=false
2 i=2147483643,isOdd=true
3 i=2147483644,isOdd=false
4 i=2147483645,isOdd=true
5 i=2147483646,isOdd=false
6 i=2147483647,isOdd=true
7 i=-2147483648,isOdd=false 8 i=-2147483647,isOdd=false 9 i=-2147483646,isOdd=false 注意:這將引出此程序的第二個錯誤!
 1 public class Question1Test3 {  2     public static void main(String[] args) {  3         System.out.println("整數的最小值:"+Integer.MIN_VALUE);  4         // 整數的最小值:-2147483648
 5         System.out.println("整數的最大值:"+Integer.MAX_VALUE);  6         // 整數的最大值:2147483647
 7         System.out.println("Integer.MAX_VALUE+1:"+(Integer.MAX_VALUE+1));  8         // Integer.MAX_VALUE+1:-2147483648
 9  } 10 }

  測試代碼二:

 1 public class Question1Test5 {  2     /**
 3  * 判斷是否為奇數  4  * @param i  5  * @return true 為奇數 false 為偶數  6      */
 7     public static boolean isOdd(int i){  8         int j=i%2;  9         System.out.println("i%2="+j); 10         return j==1; 11  } 12     /**
13  * @param args 14      */
15     public static void main(String[] args) { 16         for(int i=-10;i<=0;++i){ 17             boolean isOdd=isOdd(i); 18             System.out.println(String.format("i=%d,isOdd=%b", i, isOdd)); 19  } 20  } 21 }

  運行結果:

 1 i%2=0
 2 i=-10,isOdd=false
 3 i%2=-1
 4 i=-9,isOdd=false
 5 i%2=0
 6 i=-8,isOdd=false
 7 i%2=-1
 8 i=-7,isOdd=false
 9 i%2=0
10 i=-6,isOdd=false
11 i%2=-1
12 i=-5,isOdd=false
13 i%2=0
14 i=-4,isOdd=false
15 i%2=-1
16 i=-3,isOdd=false
17 i%2=0
18 i=-2,isOdd=false
19 i%2=-1
20 i=-1,isOdd=false
21 i%2=0
22 i=0,isOdd=false

  通過測試二及其運行結果我們可以看到當為負int型的數據時,與2的余數為-1而不是1。

  正確寫法:

 1 public class Question1Test4 {  2     /**
 3  * 判斷是否為奇數  4  * @param i  5  * @return true 為奇數 false 為偶數  6      */
 7     public static boolean isOdd(int i){  8         return i%2 != 0;  9  } 10     /**
11  * @param args 12      */
13     public static void main(String[] args) { 14         for(int i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++i){ 15             boolean isOdd=isOdd(i); 16             System.out.println(String.format("i=%d,isOdd=%b", i, isOdd)); 17             if(i == Integer.MAX_VALUE) 18                 break; 19  } 20  } 21 }

 

  1.2錯誤:int類型數值計算超出范圍的問題

  1.2的運行結果是:5,大家是不是感覺很奇怪啊,為什么不是1000呢?

  測試程序1如下:

 1 public class Question2Test {  2     public static void main(String[] args) {  3         int i = 24 * 60 * 60 * 1000 * 1000;  4         long li = 24 * 60 * 60 * 1000 * 1000;  5         long l = 24 * 60 * 60 * 1000 * 1000L;  6         System.out.println("i=" + i);  7         // i=500654080
 8         System.out.println("li=" + li);  9         // li=500654080
10         System.out.println("l=" + l); 11         // l=86400000000
12  System.out.println(Integer.MAX_VALUE); 13         // 2147483647
14  } 15 }

  從測試結果我們可以看出:24*60*60*1000*1000 的結果明顯超出了int類型的表達范圍,在運算的過程中運算結果仍然為int型,超出范圍就截取后64位作為運算的結果。因此,我們看到雖然定義了long型變量li,但結果仍然是截取后的結果。

  測試程序1中仍然存在問題,我們在測試程序2中指出。

  測試程序2如下:

 1 public class Question2Test2 {  2     public static void main(String[] args) {  3         long l1 = 24*60*60*1000*1000*1000L;  4         long l2 = 24L*60*60*1000*1000*1000;  5  System.out.println(l1);  6         // 500654080000
 7  System.out.println(l2);  8         // 86400000000000
 9  } 10 }

  我想大家都可以看懂我寫測試程序2的用意,我就不在多說了。。。

  正確寫法如下:

1 public class Question2Test3 { 2     public static void main(String[] args) { 3         final long MICROS_PER_DAY=24L*60*60*1000*1000; 4         final long MILLIS_PER_DAY=24L*60*60*1000; 5         System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY); 6         // 1000
7  } 8 }

  1.3正確     (本人這么覺得)

  測試程序1:

 1 public class Question3Test1 {  2     public static void main(String[] args) {  3         System.out.println("byte類型的最大值:"+Byte.MAX_VALUE);  4         // byte類型的最大值:127
 5         for(byte b=(byte)(Byte.MAX_VALUE-5);b<Byte.MAX_VALUE;b++){  6             System.out.println("b="+b);  7             if(b==0x90)  8                 System.out.println("Joy!");  9  } 10  } 11 }

  運行結果:

1 b=122
2 b=123
3 b=124
4 b=125
5 b=126

  由於1.3程序的for循環中 b<Byte.MAX_VALUE  而並不是 b<=Byte.MAX_VALUE ,所以沒有出現1.1中的錯誤。

  有人覺得0x90超出了byte類型的表示范圍[-128,127],但是我並不覺得在這里是錯誤,因為題目也沒有特殊要求。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM