• [专项]3道改错题


    https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247485288&idx=2&sn=979549be49574329ec34b9a975641802&chksm=ebd63844dca1b152191672f532076764426325a3e107b03911a2b41a362fb924fb4502d5fb60&mpshare=1&scene=1&srcid=05011t6ONYAn8LYxZIr4Nt2u&key=de24ae3f14cbe38cb50a8d74986dfd1bb60994d6fc67e9fbae466d808accb746ed8277c71b5937c960646520a225bb610bd2be45483d2cb0ed8ca30ea2ed8a99a07c995dfc5f503f8b16191066d19f74&ascene=0&uin=MTA2NzUxMDAyNQ%3D%3D&devicetype=iMac+MacBookAir6%2C2+OSX+OSX+10.10.5+build(14F2511)&version=11020012&lang=zh_CN&pass_ticket=NknpvTY%2BXgidav4niSdJVi4ruL4JdS7CISGIfkolDGcBmQhfQaF%2BmqlmtS63BG6v

    https://www.cnblogs.com/gw811/archive/2012/10/17/2727109.html

    Java解惑》

    读前须知:

      各位朋友,此篇文章只是本人测试的结果,我的知识和思维必定有限,因此,此篇文章还存在缺陷,如有不正确的地方请大家指出,我及时改正。

     

      各位看客、牛人,不要小看这几到题啊,来尝试一下找错误吧,小弟先附上自己的理解(当然是经过测试的),一起交流吧。

     

      看看你能中几枪......

     

    巨人网络2013校园招聘Java程序员笔试题:

    1、改错题(指出错误之处并对其进行修改)

     

    1.1、下列代码的错误之处

    public class Question1 {
       /**
        * 判断是否为奇数
        * @param i
        * @return true 为奇数 false 为偶数
        */

       public static boolean isOdd(int i){
           return i%2==1;
       }
       /**
        * @param args
        */

       public static void main(String[] args) {
           for(int i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++i){
               boolean isOdd=isOdd(i);
               System.out.println(String.format("i=%d,isOdd=%b", i, isOdd));
           }
       }
    }

     

     

    1.1错误:

    • for语句是死循环; 

    • 判断int型是否为奇数return i%2==1错误,应该为:return i%2!=0;

    • Mysuny这位朋友提出判断是否为奇数用i&1最好,我表示赞成,return (i&1)==1;

    测试代码1:

    public class Question1Test2 {
       /**
        * 判断是否为奇数
        * @param i
        * @return true 为奇数 false 为偶数
        */

       public static boolean isOdd(int i){
           return i%2==1;
       }
       /**
        * @param args
        */

       public static void main(String[] args) throws Exception {
           for(int i=Integer.MAX_VALUE-5;i<=Integer.MAX_VALUE;++i){
               boolean isOdd=isOdd(i);
               System.out.println(String.format("i=%d,isOdd=%b", i, isOdd));
               Thread.sleep(500);
           }
       }
    }

     

    结果:

    i=2147483642,isOdd=false
    i=2147483643,isOdd=true
    i=2147483644,isOdd=false
    i=2147483645,isOdd=true
    i=2147483646,isOdd=false
    i=2147483647,isOdd=true
    i=-2147483648,isOdd=false
    i=-2147483647,isOdd=false
    i=-2147483646,isOdd=false   
    //注意:这将引出此程序的第二个错误!

     

    public class Question1Test3 {
       public static void main(String[] args{
           System.out.println("整数的最小值:"+Integer.MIN_VALUE);
           //    整数的最小值:-2147483648
           System.out.println("整数的最大值:"+Integer.MAX_VALUE);
           //    整数的最大值:2147483647
           System.out.println("Integer.MAX_VALUE+1:"+(Integer.MAX_VALUE+1));
           //    Integer.MAX_VALUE+1:-2147483648
       }
    }

     

    测试代码二:

    public class Question1Test5 {
       /**
        * 判断是否为奇数
        * @param i
        * @return true 为奇数 false 为偶数
        */

       public static boolean isOdd(int i){
           int j=i%2;
           System.out.println("i%2="+j);
           return j==1;
       }
       /**
        * @param args
        */

       public static void main(String[] args) {
           for(int i=-10;i<=0;++i){
               boolean isOdd=isOdd(i);
               System.out.println(String.format("i=%d,isOdd=%b", i, isOdd));
           }
       }
    }

     

    运行结果:

    i%2=0
    i=-10,isOdd=false
    i%2=-1
    i=-9,isOdd=false
    i%2=0
    i=-8,isOdd=false
    i%2=-1
    i=-7,isOdd=false
    i%2=0
    i=-6,isOdd=false
    i%2=-1
    i=-5,isOdd=false
    i%2=0
    i=-4,isOdd=false
    i%2=-1
    i=-3,isOdd=false
    i%2=0
    i=-2,isOdd=false
    i%2=-1
    i=-1,isOdd=false
    i%2=0
    i=0,isOdd=false

     

    通过测试二及其运行结果我们可以看到当为负int型的数据时,与2的余数为-1而不是1。

     

    正确写法:

    public class Question1Test4 {
       /**
        * 判断是否为奇数
        * @param i
        * @return true 为奇数 false 为偶数
        */

       public static boolean isOdd(int i){
           return i%2 != 0;
       }
       /**
        * @param args
        */

       public static void main(String[] args) {
           for(int i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++i){
               boolean isOdd=isOdd(i);
               System.out.println(String.format("i=%d,isOdd=%b", i, isOdd));
               if(i == Integer.MAX_VALUE)
                   break;
           }
       }
    }
     

    if(i == Integer.MAX_VALUE) 

    break;

    max+1 =min

     

    1.2、下列代码的错误之处

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

     

     

     

     

    1.2错误:int类型数值计算超出范围的问题

    1.2的运行结果是:5,大家是不是感觉很奇怪啊,为什么不是1000呢?

     

    测试程序1如下:

    public class Question2Test {
       public static void main(String[] args{
           int i = 24 * 60 * 60 * 1000 * 1000;
           long li = 24 * 60 * 60 * 1000 * 1000;
           long l = 24 * 60 * 60 * 1000 * 1000L;
           System.out.println("i=" + i);
           //    i=500654080
           System.out.println("li=" + li);
           //    li=500654080
           System.out.println("l=" + l);
           //    l=86400000000
           System.out.println(Integer.MAX_VALUE);
           //    2147483647
       }
    }

     

    从测试结果我们可以看出:24*60*60*1000*1000 的结果明显超出了int类型的表达范围,在运算的过程中运算结果仍然为int型,超出范围就截取后64位作为运算的结果。因此,我们看到虽然定义了long型变量li,但结果仍然是截取后的结果。

     

    测试程序1中仍然存在问题,我们在测试程序2中指出。

     

    测试程序2如下:

    public class Question2Test2 {
       public static void main(String[] args{
           long l1 = 24*60*60*1000*1000*1000L;
           long l2 = 24L*60*60*1000*1000*1000;
           System.out.println(l1);
           //    500654080000
           System.out.println(l2);
           //    86400000000000
       }
    }

     

    我想大家都可以看懂我写测试程序2的用意,我就不在多说......

     

    正确写法如下:

    public class Question2Test3 {
       public static void main(String[] args) {
           final long MICROS_PER_DAY=24L*60*60*1000*1000;
           final long MILLIS_PER_DAY=24L*60*60*1000;
           System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
           //    1000
       }
    }
     
     

     

    1.3、下列代码的错误之处

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

     


     

    1.3正确     (本人这么觉得)

     

    测试程序1:

    public class Question3Test1 {
       public static void main(String[] args) {
           System.out.println("byte类型的最大值:"+Byte.MAX_VALUE);
           //    byte类型的最大值:127
           for(byte b=(byte)(Byte.MAX_VALUE-5);b<Byte.MAX_VALUE;b++){
               System.out.println("b="+b);
               if(b==0x90)
                   System.out.println("Joy!");
           }
       }
    }

     

    运行结果:

    b=122
    b=123
    b=124
    b=125
    b=126

     

    由于1.3程序的for循环中 b<Byte.MAX_VALUE  而并不是 b<=Byte.MAX_VALUE ,所以没有出现1.1中的错误。

     

    有人觉得0x90超出了byte类型的表示范围[-128,127],但是我并不觉得在这里是错误,因为题目也没有特殊要求。

  • 相关阅读:
    CODEVS4650 破损的键盘
    洛谷P1656 炸铁路
    洛谷 P3225 [HNOI2012]矿场搭建
    1265 四点共面
    1406: [AHOI2007]密码箱
    1193: [HNOI2006]马步距离
    1800: [Ahoi2009]fly 飞行棋
    1923: [Sdoi2010]外星千足虫
    I
    2017CCPC秦皇岛G ZOJ 3987Numbers(大数+贪心)
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106580.html
Copyright © 2020-2023  润新知