小編最開始編程的時候歹嘹,除了英文標點被誤寫成中文標點外,可能被大家普遍遇到的是將比較運算符==誤寫成賦值運算符=层皱,代碼如下所示:
if(x=5) { … }
這里本意是比較變量x是否等于常量5指孤,但是誤將’==’寫成了’=’,if語句恒為真逆粹。如果在邏輯判斷表達式中出現(xiàn)賦值運算符,現(xiàn)在的大多數(shù)編譯器會給出警告信息炫惩。并非所有程序員都會注意到這類警告僻弹,因此有經(jīng)驗的程序員使用下面的代碼來避免此類錯誤:
if(5==x) { … }
將常量放在變量x的左邊,即使程序員誤將’==’寫成了’=’他嚷,編譯器會產(chǎn)生一個任誰也不能無視的語法錯誤信息:不可給常量賦值蹋绽!
+=與=+、-=與=-也是容易寫混的筋蓖。復(fù)合賦值運算符(+=卸耘、*=等等)雖然可以使表達式更加簡潔并有可能產(chǎn)生更高效的機器代碼,但某些復(fù)合賦值運算符也會給程序帶來隱含Bug粘咖,如下所示代碼:
tmp=+1;
該代碼本意是想表達tmp=tmp+1蚣抗,但是將復(fù)合賦值運算符+=誤寫成=+:將正整數(shù)常量1賦值給變量tmp。編譯器會欣然接受這類代碼瓮下,連警告都不會產(chǎn)生翰铡。小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 六二七,零一二讽坏,四六四 】锭魔,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)路呜!裙內(nèi)有開發(fā)工具迷捧,很多干貨和技術(shù)資料分享!
如果你能在調(diào)試階段就發(fā)現(xiàn)這個Bug胀葱,你真應(yīng)該慶祝一下漠秋,否則這很可能會成為一個重大隱含Bug,且不易被察覺抵屿。
-=與=-也是同樣道理庆锦。與之類似的還有邏輯與&&和位與&、邏輯或||和位或|晌该、邏輯非肥荔!和位取反~绿渣。此外字母l和數(shù)字1、字母O和數(shù)字0也易混淆燕耿,這種情況可借助編譯器來糾正中符。
很多的軟件BUG自于輸入錯誤。在Google上搜索的時候誉帅,有些結(jié)果列表項中帶有一條警告淀散,表明Google認為它帶有惡意代碼。如果你在2009年1月31日一大早使用Google搜索的話蚜锨,你就會看到档插,在那天早晨55分鐘的時間內(nèi),Google的搜索結(jié)果標明每個站點對你的PC都是有害的亚再。這涉及到整個Internet上的所有站點郭膛,包括Google自己的所有站點和服務(wù)。Google的惡意軟件檢測功能通過在一個已知攻擊者的列表上查找站點氛悬,從而識別出危險站點则剃。在1月31日早晨,對這個列表的更新意外地包含了一條斜杠(“/”)如捅。所有的URL都包含一條斜杠棍现,并且,反惡意軟件功能把這條斜杠理解為所有的URL都是可疑的镜遣,因此己肮,它愉快地對搜索結(jié)果中的每個站點都添加一條警告。很少見到如此簡單的一個輸入錯誤帶來的結(jié)果如此奇怪且影響如此廣泛悲关,但程序就是這樣谎僻,容不得一絲疏忽。
數(shù)組常常也是引起程序不穩(wěn)定的重要因素坚洽,C語言數(shù)組的迷惑性與數(shù)組下標從0開始密不可分戈稿,你可以定義int a[30],但是你絕不可以使用數(shù)組元素a[30]讶舰,除非你自己明確知道在做什么。
switch…case語句可以很方便的實現(xiàn)多分支結(jié)構(gòu)需了,但要注意在合適的位置添加break關(guān)鍵字跳昼。程序員往往容易漏加break從而引起順序執(zhí)行多個case語句,這也許是C的一個缺陷之處肋乍。對于switch…case語句鹅颊,從概率論上說,絕大多數(shù)程序一次只需執(zhí)行一個匹配的case語句墓造,而每一個這樣的case語句后都必須跟一個break堪伍。去復(fù)雜化大概率事件锚烦,這多少有些不合常情。
break關(guān)鍵字用于跳出最近的那層循環(huán)語句或者switch語句帝雇,但程序員往往不夠重視這一點涮俄。
1990年1月15日,AT&T電話網(wǎng)絡(luò)位于紐約的一臺交換機當(dāng)機并且重啟尸闸,引起它鄰近交換機癱瘓彻亲,由此及彼,一個連著一個吮廉,很快苞尝,114臺交換機每六秒當(dāng)機重啟一次,六萬人九小時內(nèi)不能打長途電話宦芦。當(dāng)時的解決方式:工程師重裝了以前的軟件版本宙址。事后的事故調(diào)查發(fā)現(xiàn),這是break關(guān)鍵字誤用造成的调卑÷丈埃《C專家編程》提供了一個簡化版的問題源碼:小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 六二七,零一二令野,四六四 】舀患,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)气破!裙內(nèi)有開發(fā)工具聊浅,很多干貨和技術(shù)資料分享!
打開網(wǎng)易新聞 查看更多精彩圖片
那個程序員希望從if語句跳出现使,但他卻忘記了break關(guān)鍵字實際上跳出最近的那層循環(huán)語句或者switch語句〉统祝現(xiàn)在它跳出了switch語句,執(zhí)行了use_modes_pointer()函數(shù)碳锈。但必要的初始化工作并未完成顽冶,為將來程序的失敗埋下了伏筆。
將一個整形常量賦值給變量售碳,代碼如下所示:
int a=34, b=034;
變量a和b相等嗎强重?答案是不相等的。我們知道贸人,16進制常量以’0x’為前綴间景,10進制常量不需要前綴,那么8進制呢艺智?它與10進制和16進制表示方法都不相通倘要,它以數(shù)字’0’為前綴,這多少有點奇葩:三種進制的表示方法完全不相通十拣。如果8進制也像16進制那樣以數(shù)字和字母表示前綴的話封拧,或許更有利于減少軟件Bug志鹃,畢竟你使用8進制的次數(shù)可能都不會有誤使用的次數(shù)多!下面展示一個誤用8進制的例子泽西,最后一個數(shù)組元素賦值錯誤:
加群{{466572167:0}}交流學(xué)習(xí)
指針的加減運算是特殊的曹铃。下面的代碼運行在32位ARM架構(gòu)上,執(zhí)行之后尝苇,a和p的值分別是多少铛只?
對于a的值很容判斷出結(jié)果為2,但是p的結(jié)果卻是0x00001004糠溜。指針p加1后淳玩,p的值增加了4,這是為什么呢非竿?原因是指針做加減運算時是以指針的數(shù)據(jù)類型為單位蜕着。p+1實際上是p+1*sizeof(int)。不理解這一點红柱,在使用指針直接操作數(shù)據(jù)時極易犯錯承匣。比如下面對連續(xù)RAM初始化零操作代碼:
由于pRAMaddr是一個指針變量,所以pRAMaddr+=4代碼其實使pRAMaddr偏移了4*sizeof(int)=16個字節(jié),所以每執(zhí)行一次for循環(huán)锤悄,會使變量pRAMaddr偏移16個字節(jié)空間韧骗,但只有4字節(jié)空間被初始化為零。其它的12字節(jié)數(shù)據(jù)的內(nèi)容零聚,在大多數(shù)架構(gòu)處理器中都會是隨機數(shù)袍暴。
對于sizeof(),這里強調(diào)兩點隶症,第一它是一個關(guān)鍵字政模,而不是函數(shù),并且它默認返回?zé)o符號整形數(shù)據(jù)(要記住是無符號)蚂会;第二淋样,使用sizeof獲取數(shù)組長度時,不要對指針應(yīng)用sizeof操作符胁住,比如下面的例子:
我們知道趁猴,對于一個數(shù)組array[20],我們使用代碼sizeof(array)/sizeof(array[0])可以獲得數(shù)組的元素(這里為20)彪见,但數(shù)組名和指針往往是容易混淆的躲叼,而且有且只有一種情況下是可以當(dāng)做指針的,那就是數(shù)組名作為函數(shù)形參時企巢,數(shù)組名被認為是指針。同時让蕾,它不能再兼任數(shù)組名浪规。注意只有這種情況下或听,數(shù)組名才可以當(dāng)做指針,但不幸的是這種情況下容易引發(fā)風(fēng)險笋婿。在ClearRAM函數(shù)內(nèi)誉裆,作為形參的array[]不再是數(shù)組名了,而成了指針缸濒。sizeof(array)相當(dāng)于求指針變量占用的字節(jié)數(shù)足丢,在32位系統(tǒng)下,該值為4庇配,sizeof(array)/sizeof(array[0])的運算結(jié)果也為4斩跌。所以在main函數(shù)中調(diào)用ClearRAM(Fle),也只能清除數(shù)組Fle中的前四個元素了捞慌。
增量運算符++和減量運算符--既可以做前綴也可以做后綴耀鸦。前綴和后綴的區(qū)別在于值的增加或減少這一動作發(fā)生的時間是不同的。作為前綴是先自加或自減然后做別的運算啸澡,作為后綴時袖订,是先做運算,之后再自加或自減嗅虏。許多程序員對此認識不夠洛姑,就容易埋下隱患。下面的例子可以很好的解釋前綴和后綴的區(qū)別皮服。
代碼執(zhí)行后楞艾,y的值是多少?
這個例子并非是挖空心思設(shè)計出來專門讓你絞盡腦汁的C難題(如果你覺得自己對C細節(jié)掌握很有信心冰更,做一些C難題檢驗一下是個不錯的選擇产徊。那么,《The C Puzzle Book》這本書一定不要錯過蜀细。)舟铜,你甚至可以將這個難懂的語句作為不友好代碼的反面例子。但是它也可以讓你更好的理解C語言奠衔。根據(jù)運算符優(yōu)先級以及編譯器識別字符的貪心法原則谆刨,代碼y=a+++--b;可以寫成更明確的形式:
y=(a++)+(--b);
當(dāng)賦值給變量y時,a的值為8归斤,b的值為1,所以變量y的值為9痊夭;賦值完成后,變量a自加脏里,a的值變?yōu)?她我,千萬不要以為y的值為10。這條賦值語句相當(dāng)于下面的兩條語句:
基于內(nèi)容是太多了,小編就暫時先說到這番舆,