国产TS紫迹丝袜高跟鞋在线,一区二区三区国产自产视频免费,67pao国产人成视频,午国产午夜激无码毛片不卡

愛碼網(wǎng)專注于資源免費(fèi)下載

Java解惑之表達(dá)式謎題(謎題1:奇數(shù)性)

謎題1:奇數(shù)性

Java解惑之表達(dá)式謎題(謎題1:奇數(shù)性)-第1張圖片

下面的方法意圖確定它那唯一的參數(shù)是否是一個(gè)奇數(shù)。這個(gè)方法能夠正確運(yùn)轉(zhuǎn)嗎?  

public static boolean isOdd(int i){
             return i % 2 == 1;
}

奇數(shù)可以被定義為被2整除余數(shù)為1的整數(shù)。表達(dá)式 i % 2 計(jì)算的是 i 整除 2 時(shí)所產(chǎn)生的余數(shù),因此看起來這個(gè)程序應(yīng)該能夠正確運(yùn)轉(zhuǎn)。遺憾的是,它不能;它在四分之一的時(shí)間里返回的都是錯(cuò)誤的答案。 為什么是四分之一?因?yàn)樵谒械?int 數(shù)值中,有一半都是負(fù)數(shù),而 isOdd 方法對于對所有負(fù)奇數(shù)的判斷都會失敗。在任何負(fù)整數(shù)上調(diào)用該方法都回返回false ,不管該整數(shù)是偶數(shù)還是奇數(shù)。 這是 Java 對取余操作符(%)的定義所產(chǎn)生的后果。該操作符被定義為對于所有的 int 數(shù)值 a 和所有的非零 int 數(shù)值 b,都滿足下面的恒等式:  

(a / b) * b + (a % b) == a

換句話說,如果你用b整除a,將商乘以b,然后加上余數(shù),那么你就得到了最初的值 a 。該恒等式具有正確的含義,但是當(dāng)與 Java 的截尾整數(shù)整除操作符相結(jié)合時(shí),它就意味著:當(dāng)取余操作返回一個(gè)非零的結(jié)果時(shí),它與左操作數(shù)具有相同的正負(fù)符號。 當(dāng) i 是一個(gè)負(fù)奇數(shù)時(shí),i % 2 等于-1而不是1, 因此 isOdd 方法將錯(cuò)誤地返回 false。為了防止這種意外,請測試你的方法在為每一個(gè)數(shù)值型參數(shù)傳遞負(fù)數(shù)、零和正數(shù)數(shù)值時(shí),其行為是否正確。 這個(gè)問題很容易訂正。只需將 i % 2 與0而不是與1比較,并且反轉(zhuǎn)比較的含義即可:  

public static boolean isOdd(int i){
             return i % 2 != 0;
}

如果你正在在一個(gè)性能臨界(performance-critical)環(huán)境中使用isOdd方法,那么用位操作符AND(&)來替代取余操作符會顯得更好:  

public static boolean isOdd(int i){
              return (i & 1) != 0;
}

總之,無論你何時(shí)使用到了取余操作符,都要考慮到操作數(shù)和結(jié)果的符號。該操作符的行為在其操作數(shù)非負(fù)時(shí)是一目了然的,但是當(dāng)一個(gè)或兩個(gè)操作數(shù)都是負(fù)數(shù)時(shí),它的行為就不那么顯而易見了。 

本文鏈接:http://fangxuan.com.cn/article/278.html

網(wǎng)友評論

熱門文章
隨機(jī)文章
熱門標(biāo)簽
側(cè)欄廣告位