淺談防不勝防的unsigned int的運算
我很早之前就知道,unsigned int與int運算的時候,int會被轉(zhuǎn)化為unsigned int來進行運算。一直覺得定這條規(guī)則的人是極度反人類的,雖說unsigned int可以表示更大的正值,但畢竟我們不太會把unsinged想像成一個負數(shù),而一個負的int數(shù)可能在無意間就變成了最大的正數(shù)。
所以,我對這個問題很慎重。小心翼翼地,一直沒怎么出過錯。直到有一天。
第一回合
那是一個陽光明媚的午后,我正愜意地刷leetcode。要遍歷vector中除最后一個元素的所有元素。我這樣寫道:
for(int i=0;i<nums.size()-1;++i) bulabula;
沒什么錯吧?沒錯!提交的時候發(fā)現(xiàn)程序出現(xiàn)了內(nèi)存訪問錯誤。
作為一個自信的程序員,我自然想到了編譯器出了問題。于是在VS上測試,是沒有問題的!Stupid Leetcode!居然說我的代碼有問題,我的代碼怎么可能有問題?
就在我要放棄這一題的時候,我突然想到了邊界條件,于是把nums清空再測試,VS提示內(nèi)存訪問錯誤。Soryy Leetcode,是在下輸了……
在進行一番絞盡腦汁之后,我把目光聚焦在了size_t,查了資料后發(fā)現(xiàn),size_t就是個unsigned類型,恍然大悟……nums.size()-1就等于最大的正數(shù),i與之比較,肯定是符合條件的!OH NO!
第二回合
在經(jīng)歷了上述事情之后,我一般會這么寫程序:
for(int i=0;i<(int)nums.size()-1;++i) bulabula;
再也沒有出現(xiàn)過問題。每次看到別人還寫我之前那樣的代碼,我都會會意一笑,然后告訴他人的我心得。直到有一天,我看到一個大牛寫了這樣的代碼:
for(int i=nums.size()-1;i>=0;--i) bulabula;
我想我發(fā)現(xiàn)了大牛的錯誤。有了上次的教訓,這次我測試了一下邊界條件。什么?居然正常運行?
在想了很久之后,我得出以下結(jié)論:nums.size()-1的確得到了一個最大的unsigned int,可是把它賦給int的時候,編譯器就傻傻地直接把unsigned int賦給了int,于是int就為-1了。大牛畢竟是大牛……
在學知識的道路上總會有羊腸小道,多走一些羊腸小道,我才能知道有沒有近道!加油加油!
以上就是小編為大家?guī)淼臏\談防不勝防的unsigned int的運算全部內(nèi)容了,希望大家多多支持腳本之家~
相關(guān)文章
C++實現(xiàn)inline hook的原理及應用實例
這篇文章主要介紹了C++實現(xiàn)inline hook的原理及應用,需要的朋友可以參考下2014-08-08C語言數(shù)據(jù)結(jié)構(gòu)系列隊列篇
本章我們將學習 "隊列" ,首先介紹隊列的概念和結(jié)構(gòu),然后我們將著重講解棧的實現(xiàn)。我們從零開始寫隊列的接口,并從零開始步步解讀。本章將繼續(xù)鞏固畫思路草圖的能力,只要思路草圖畫好了,就可以很輕松地將其轉(zhuǎn)換成代碼2022-02-02notepad介紹及插件cmake編譯過程(替代notepad++)
這篇文章主要介紹了notepad介紹及插件cmake編譯過程(替代notepad++),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03