幾個有意思的代碼

編程過程中總會遇到一些有趣的代碼,今天小編為大家整理幾個我遇到的且有點意思又簡單易懂的代碼。

幾個有意思的代碼

交換兩個變量的值

比如交換a,b兩個變量的值。(默認它們都是int類型)。經典而又安全的解法是這樣的:

幾個有意思的代碼

藉助第三變量完美的解決了問題,安全又易懂。然而我看到有些人不需要藉助第三變量的,他們的解法是這樣的:

幾個有意思的代碼

這種方法雖然也成功交換了兩個變量的值,但出錯的情況也不容小看。以int類型為例,int類型的變量佔四個字節,一個字節8位,總共是32位。一個int類型的變量能最大表示的二進制數是11111111-11111111-11111111-11111111對應的十進制數是4294967295。而如果我們交換的兩個變量的和超過了這個數就會出錯。出錯在這一步:a+=b。從理論上是約有一半的可能出錯,但從實際上看可能不會,因為我們不會交換這麼大數量的值。其實我做過的程序案例那麼多,我還沒遇到過要交換兩個變量的。第二種方法除了可以省一個變量的內存外,我還沒看到有別的優點。如果你覺得這種方法逼格高一點,那麼請看下面的第三種方法:

幾個有意思的代碼

這種方法用到了異或運算浮:^。異或運算的意思是兩個變量對應的二進制數相應位值是否相異,相異的為1,相同的為0也就是 0^0=0; 1^1=0; 0^1=1; 1^0=1; 比如2^6=4;因為十進制的2對應的二進制為010;十進制的6對應的二進制為110,對應位相異或後得100也就是4。學過邏輯電路的孩子們應該更加清楚異或運算。這種方法逼格更高不過缺陷也更大,因為異或運算屬於位運算,而位運算只能作用於整數類型,也就是說用這種方法不能交換兩個有小數的變量了。

神奇的死循環

有時候下面這段代碼會出現死循環:

幾個有意思的代碼

原本只是想通過for循環讓數組的每一個元素為零,沒想到卻出現了死循環。很多人覺得問題出在i<=10這裡,沒錯這是直接原因,但死循環的根本原因卻是在第一行。編譯器有可能將i的存儲地址緊接在數組之後,當數組越界訪問到a[10]時正好是i的位置將i置0了,也就永遠循環下去了。這就是為什麼每本書都說數組越界會產生意想不到的效果。當然也有可能編譯器不把i的地址放在數組之後,你得看它心情。避免上述錯誤的方法就是養成良好的編程習慣。能用局部變量就不用全局變量,能用作用域小的變量就不用大的,比如上面的i明明就可以放在for循環裡面定義。

以上就是小編要和大家分享的,喜歡我的文章請關注,我們一起學編程。


分享到:


相關文章: