91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言之陷阱與缺陷的示例分析

發布時間:2021-09-09 17:59:58 來源:億速云 閱讀:159 作者:柒染 欄目:開發技術

本篇文章為大家展示了C語言之陷阱與缺陷的示例分析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

一、前言

C語言之陷阱與缺陷的示例分析

二、字符指針

C語言之陷阱與缺陷的示例分析

結論一:復制指針并不會復制指針所指向的內容。兩個指針所指向位置相同,實際為同一個指針。

結論而:開辟兩個數組,即使兩個數組內容相同,地址也絕不相同。

三、邊界計算與不對稱邊界

1.經典錯誤①

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;
}

計算的結果是程序陷入死循環

分析:

1.棧區默認先使用高地址,再使用低地址 

2.數組內元素隨下標增長,地址由低到高變化

C語言之陷阱與缺陷的示例分析

 調試后即可發現,i與arr[9]的地址相差3字節,所以i即為實際不存在的arr[12].

[補充知識:ANSI c標準允許這種用法——數組中溢界元素的地址位于數組所占內存之后,這個地址可以進行賦值和比較,但是不能解引用(若是數組之前存在溢界則語法不允許)]

2.經典錯誤②

十米長的圍欄每一米就需要一根欄桿支撐,則共需要幾根欄桿?                               11

3、小結

欄桿問題你若不假思索可能會回答為10。欄桿問題的根源正是加減一帶來的困惑

對此我們堅持以下原則

原則一:考慮最簡單的特例(如考慮20到10間有幾個數,20-10還要+1嗎。不妨考慮10到10有幾個數)

原則二:仔細計算邊界

而在實際編程中,一個編程技巧則可以"一言以蔽之",即不對稱邊界。

x>=0 && x<16  要優于 x>=0 && x<=15

不對稱邊界上界-下界就是之間所包含的數。

四、求值順序

總結:c語言中只有四個運算符(&& ;|| ;?: ;,)明確規定了求值順序

&&和||先對左邊求值,只在需要時對右邊求值:

if(y!=0 && x/y>a)

如此避免除0錯誤。

特別注意,賦值操作符不保證任何求值順序,即使考慮了優先級和結合性,也會有意想不到的錯誤

int i=0;
while(i<n)
{
    y[i]=x[i++]
}

對于以上的代碼,就不能確定y是否在i自增之前求值。

問題代碼1:c+--c(我們可以根據"大嘴法"判斷為c+(--c)),但c自增的先后不得而知)

問題代碼2:int a=(++i)+(++i)+(++i)  (同理)

問題代碼3:answer=func()-func()*func()    (我們不知道哪個func被先調用)

五、運算符&& ||和!

這三種運算符返回值都為0或1。在結果為真是返回1,結果為假是返回0。

考慮一下代碼,其功能是查詢表中一個特定元素

int i = 0;
while (i < tabsize && tab[i] != x)
{
	i++;
}

現分析將&&替換成&仍然能"正常工作"的原因。

原因一:只要xy的值都限制在0~1,x&&y和x&y的結果始終相同。

原因二:數組結尾之后的下一個元素,只要不改變他的值而僅僅是讀取,沒有什么大的危害

原因三:不同與&&的求值順序,&要求兩邊都要被求值

如果tabsize大小等于tab中元素的個數,即使i=tabsize后還會繼續查找下去,陷入死循環

上述內容就是C語言之陷阱與缺陷的示例分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高青县| 松桃| 富锦市| 屯留县| 江阴市| 横峰县| 陆丰市| 泾川县| 观塘区| 唐海县| 山西省| 元氏县| 遂宁市| 婺源县| 井陉县| 米脂县| 平和县| 哈密市| 治县。| 芮城县| 化州市| 嘉义市| 龙游县| 绿春县| 巴楚县| 翼城县| 泗阳县| 固原市| 曲松县| 邢台县| 巩义市| 成武县| 伊金霍洛旗| 繁昌县| 丰县| 开化县| 济南市| 惠来县| 叙永县| 峨眉山市| 宜君县|