淺談防不勝防的unsigned int的運算。本站提示廣大學習愛好者:(淺談防不勝防的unsigned int的運算)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談防不勝防的unsigned int的運算正文
我很早之前就知道,unsigned int與int運算的時分,int會被轉化為unsigned int來停止運算。不斷覺得定這條規則的人是極度反人類的,雖說unsigned int可以表示更大的正值,但畢竟我們不太會把unsinged想像成一個正數,而一個負的int數能夠在有意間就變成了最大的負數。
所以,我對這個問題很慎重。小心翼翼地,不斷沒怎樣出差錯。直到有一天。
第一回合
那是一個陽黑暗媚的午後,我正惬意地刷leetcode。要遍歷vector中除最後一個元素的一切元素。我這樣寫道:
for(int i=0;i<nums.size()-1;++i) bulabula;
沒什麼錯吧?沒錯!提交的時分發現順序呈現了內存訪問錯誤。
作為一個自信的順序員,我自然想到了編譯器出了問題。於是在VS上測試,是沒有問題的!Stupid Leetcode!竟然說我的代碼有問題,我的代碼怎樣能夠有問題?
就在我要保持這一題的時分,我忽然想到了邊界條件,於是把nums清空再測試,VS提示內存訪問錯誤。Soryy Leetcode,是在下輸了……
在停止一番絞盡腦汁之後,我把目光聚焦在了size_t,查了材料後發現,size_t就是個unsigned類型,豁然開朗……nums.size()-1就等於最大的負數,i與之比擬,一定是契合條件的!OH NO!
第二回合
在閱歷了上述事情之後,我普通會這麼寫順序:
for(int i=0;i<(int)nums.size()-1;++i) bulabula;
再也沒有呈現過問題。每次看到他人還寫我之前那樣的代碼,我都會會意一笑,然後通知別人的我心得。直到有一天,我看到一個大牛寫了這樣的代碼:
for(int i=nums.size()-1;i>=0;--i) bulabula;
我想我發現了大牛的錯誤。有了上次的經驗,這次我測試了一下邊界條件。什麼?竟然正常運轉?
在想了很久之後,我得出以下結論:nums.size()-1確實失掉了一個最大的unsigned int,可是把它賦給int的時分,編譯器就傻傻地直接把unsigned int賦給了int,於是int就為-1了。大牛畢竟是大牛……
在學知識的路途上總會有羊腸大道,多走一些羊腸大道,我才干知道有沒有近道!加油加油!
以上就是為大家帶來的淺談防不勝防的unsigned int的運算全部內容了,希望大家多多支持~