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