C語言之陷阱與缺陷詳解
一、前言

二、字符指針

結(jié)論一:復(fù)制指針并不會復(fù)制指針?biāo)赶虻膬?nèi)容。兩個(gè)指針?biāo)赶蛭恢孟嗤?,?shí)際為同一個(gè)指針。
結(jié)論而:開辟兩個(gè)數(shù)組,即使兩個(gè)數(shù)組內(nèi)容相同,地址也絕不相同。
三、邊界計(jì)算與不對稱邊界
1.經(jīng)典錯(cuò)誤①
int main()
{
int i = 0; int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for (i = 0; i < 13; i++)
{
arr[i] = 0;
printf("haha");
}
return 0;
}
計(jì)算的結(jié)果是程序陷入死循環(huán)
分析:
1.棧區(qū)默認(rèn)先使用高地址,再使用低地址
2.數(shù)組內(nèi)元素隨下標(biāo)增長,地址由低到高變化

調(diào)試后即可發(fā)現(xiàn),i與arr[9]的地址相差3字節(jié),所以i即為實(shí)際不存在的arr[12].
[補(bǔ)充知識:ANSI c標(biāo)準(zhǔn)允許這種用法——數(shù)組中溢界元素的地址位于數(shù)組所占內(nèi)存之后,這個(gè)地址可以進(jìn)行賦值和比較,但是不能解引用(若是數(shù)組之前存在溢界則語法不允許)]
2.經(jīng)典錯(cuò)誤②
十米長的圍欄每一米就需要一根欄桿支撐,則共需要幾根欄桿? 11
3、小結(jié)
欄桿問題你若不假思索可能會回答為10。欄桿問題的根源正是加減一帶來的困惑
對此我們堅(jiān)持以下原則
原則一:考慮最簡單的特例(如考慮20到10間有幾個(gè)數(shù),20-10還要+1嗎。不妨考慮10到10有幾個(gè)數(shù))
原則二:仔細(xì)計(jì)算邊界
而在實(shí)際編程中,一個(gè)編程技巧則可以"一言以蔽之",即不對稱邊界。
x>=0 && x<16 要優(yōu)于 x>=0 && x<=15
不對稱邊界上界-下界就是之間所包含的數(shù)。
四、求值順序
總結(jié):c語言中只有四個(gè)運(yùn)算符(&& ;|| ;?: ;,)明確規(guī)定了求值順序
&&和||先對左邊求值,只在需要時(shí)對右邊求值:
if(y!=0 && x/y>a)
如此避免除0錯(cuò)誤。
特別注意,賦值操作符不保證任何求值順序,即使考慮了優(yōu)先級和結(jié)合性,也會有意想不到的錯(cuò)誤
int i=0;
while(i<n)
{
y[i]=x[i++]
}
對于以上的代碼,就不能確定y是否在i自增之前求值。
問題代碼1:c+--c(我們可以根據(jù)"大嘴法"判斷為c+(--c)),但c自增的先后不得而知)
問題代碼2:int a=(++i)+(++i)+(++i) (同理)
問題代碼3:answer=func()-func()*func() (我們不知道哪個(gè)func被先調(diào)用)
五、運(yùn)算符&& ||和!
這三種運(yùn)算符返回值都為0或1。在結(jié)果為真是返回1,結(jié)果為假是返回0。
考慮一下代碼,其功能是查詢表中一個(gè)特定元素
int i = 0;
while (i < tabsize && tab[i] != x)
{
i++;
}
現(xiàn)分析將&&替換成&仍然能"正常工作"的原因。
原因一:只要xy的值都限制在0~1,x&&y和x&y的結(jié)果始終相同。
原因二:數(shù)組結(jié)尾之后的下一個(gè)元素,只要不改變他的值而僅僅是讀取,沒有什么大的危害
原因三:不同與&&的求值順序,&要求兩邊都要被求值
如果tabsize大小等于tab中元素的個(gè)數(shù),即使i=tabsize后還會繼續(xù)查找下去,陷入死循環(huán)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
詳解C語言中printf輸出的相關(guān)函數(shù)
這篇文章主要介紹了C語言中printf輸出的相關(guān)函數(shù)總結(jié),是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08
C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的實(shí)現(xiàn)
鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將用C語言實(shí)現(xiàn)單鏈表,需要的可以參考一下2022-06-06
深入探討C++ OpenCV如何實(shí)現(xiàn)圖像矯正
這篇文章主要為大家詳細(xì)介紹了C++ OpenCV如何實(shí)現(xiàn)簡單的圖像矯正功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
C++:函數(shù)對象,STL提供的函數(shù)對象,函數(shù)適配器詳解
這篇文章主要介紹了C++:函數(shù)對象,STL提供的函數(shù)對象,函數(shù)適配器的使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-08-08

