posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Java Puzzler - 數(shù)值處理中容易犯的錯誤

          Posted on 2007-11-10 21:32 ZelluX 閱讀(794) 評論(0)  編輯  收藏 所屬分類: OOP
          Pitfall 1:判斷x的奇偶性
          public static boolean isOdd(int x) {
              
          return x % 2 == 1;
          }
          當(dāng)x為負(fù)奇數(shù)時,x % 2的值為負(fù)數(shù)。
          Note:把 x % 2 == 1 改為 x % 2 != 0

          Pitfall 2:長整數(shù)計算
          long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
          這個表達(dá)式先計算左邊幾個int的乘積,然后再把值轉(zhuǎn)換為long,因此仍會溢出
          Note:把24改成24L

          Pitfall 3:看看這句話的結(jié)果
          System.out.println(12345+5432l);
          Note:5432后面的l很容易被看成1,因此建議使用L表示長整形時都使用大寫。

          Pitfall 4:下面這句話又會是什么結(jié)果
          System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
          Java計算時先用sign-extension把后面一個數(shù)轉(zhuǎn)成long,然后再計算
          Note:盡量避免混合類型計算

          Pitfall 5:這句話呢?
          System.out.println((int) (char) (byte) -1);
          結(jié)果是65535
          Note:char是無符號類型,將char轉(zhuǎn)為int時使用zero-extension

          Pitfall 6:交換變量值
          int x = 1984;
          int y = 2001;
          x ^= y ^= x ^= y;
          最終結(jié)果是x == 0, y == 1984
          Note:Java中操作符是從左往右計算的 (JLS 15.7)
          改成 y = (x ^ (y ^= x) ^ y; 就可以,但是永遠(yuǎn)不要這么做 
           
          Pitfall 7:問號操作符
          char x = 'X';
          int i = 0;
          System.out.print(true ? x : 0);
          System.out.print(false ? i : x);
          輸出結(jié)果為X88
          Note:同樣是混合類型計算導(dǎo)致的問題,建議在條件表達(dá)式中使用類型相同的第二和第三操作符。
           
          Pitfall 8:看似相同的表達(dá)式的不同結(jié)果
          short x = 0;
          int i = 123456;
          1) x += i; // 隱含了類型轉(zhuǎn)換,結(jié)果為-7616
          2) x = x + i; // 編譯無法通過,因?yàn)閾p失了精度 
           
          主站蜘蛛池模板: 西青区| 延川县| 区。| 惠州市| 长武县| 宜君县| 饶河县| 原阳县| 丹阳市| 民乐县| 巴彦县| 长寿区| 甘南县| 景德镇市| 陕西省| 通州区| 抚宁县| 南木林县| 专栏| 鲁山县| 兴和县| 胶南市| 土默特右旗| 内黄县| 兰西县| 阿城市| 佛教| 孟村| 盐边县| 海盐县| 宣武区| 平舆县| 教育| 淳化县| 葫芦岛市| 二连浩特市| 应用必备| 灵山县| 东城区| 朝阳县| 无锡市|