<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
下面有一段程式,指出它的錯誤:
char *r; r = malloc(strlen(s)+strlen(t)); strcpy(r,s); strcat(r,t);
1.下面列舉的兩種寫法是等價的:
char hello[] = "hello"; printf("%sn",hello);//寫法1 printf("%sn",&hello);//寫法2
原因:陣列名hello代表陣列hello首元素的地址。
2.下面的兩種寫法是等價的:
int strlen(char s[]) { /*具體內容*/ } int strlen(char *s) { /*具體內容*/ }
注意下面的兩種寫法:
extern char *hello; extern char hello[];
這兩種寫法雖然是都是正確的,但是不同的形式傳遞給我們的意思卻是完全不一致的,我們要根據具體情況進行使用。
注意:空指標不能對其進行解除參照。
同時注意不能出現下述寫法:
if(strcmp(p,(char*)0)==0) ···
這種寫法是非法的,原因在於庫函數strcmp的實現中會包括一個操作,用於檢視它的指標引數所指向的內容,即對空指標進行了解除參照。
也不能出現下述寫法:
假設p是空指標
printf(p); printf("%s",p); //當然,這兩種寫法是等價的
這種行為是未定義的。
在我們寫回圈是最好這樣來寫:
int i = 0; for(i = 0;i < 10; i++) ···
這樣寫能夠更好的看出迴圈的次數,即10次。
當陣列中有10個元素時,下標的取值範圍為0到9,但是當我們不需要參照這個元素時只需要參照這個元素的地址時,我們可以這樣寫
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; for(int i = 0;&arr[i]<&(arr[10]);i++) ···
這樣可以順利列印出陣列元素從1到10的數位,
ANSI C標準明確允許這種用法:陣列中實際不存在的"溢界"元素的地址位於陣列之外所佔記憶體之後,這個地址可以用於進行賦值和比較。當然,如果要參照該元素,那就是非法的了。對於實際去讀取這個元素的值,這種做法的結果是未定義的,而且極少有編譯器能偶檢測出這個錯誤。當然,如果試圖去修改這個元素,必然會導致程式崩潰,屬於非法存取了!
C語言中只有四個運運算元(&&、||、?:和,)存在規定的求值順序。==運運算元&&和運運算元||首先對左側運算元求值,只有在需要時才對右側運算元求值。==運運算元?:有三個運算元:在a?b:c中。運算元a首先被求值,根據a的值再求運算元b或c的值(此時b或c兩個表示式根據前面a表示式的結果只會執行一個)。逗號運運算元則首先對左側運算元求值,然後"丟棄該值",再對右側運算元求值。
注意:分割函數的引數並非逗號運運算元。例如,x和y在函數f(x,y)中的求值順序是未定義的,而在函數g((x,y))中卻是確定的先x後y的循序。在後一個例子中,函數g只有一個引數。這個引數的值是這樣求得的:先對x求值,然後「丟棄」x的值,接著求y的值。
這種求值順序的存在使得某些「錯誤」的程式變為了正確,且在執行後得出正確的結果:
if(count!=0 && sum/count < smallaverage) ···
注意:C語言中其它所有的運運算元對其運算元求值的順序是未定義的。特別是,賦值運運算元並不保證任何求值循序。
例如:下面的這中從陣列x中複製前n個元素到陣列y中的做法是不正確的,因為它對求值順序做了太多的假設:
i = 0; while(i < n) y[i] = x[i++];
上面的程式碼假設y[i]的地址將在i的自增操作指向之前被求值,但這是不一定的,這依賴於編譯器的具體實現。同樣,下面的這種寫法也是不正確的:
i = 0; while(i<n) y[i++] = x[i];
修改成下面這種寫法即可正常工作:
i = 0; while(i<n) { y[i] = x[i]; i++; }
當然,這種寫法也可以簡寫為:
for(i = 0;i < n;i++) y[i] = x[i];
無符號整數不會發生溢位,這是C語言所規定的,如果結果大於所能表示的最大值M,則模(M+1),也就是發生了截斷現象。
兩個有符號整數進行相加時會發生溢位,而且溢位的結果是未定義的。
下面是一種錯誤的檢查方式:
if(a + b < 0) complain();
因為當a+b
卻是發生溢位時,所有關於結果如何假設都不再可靠。
下面是兩種正確的方式:
//方法一: if((unsigned)a + (unsigned) > INT_MAX) complain(); //方法二: if(a > INT_MAX - b) complain()
C語言種常常通過return 返回一個值來告知作業系統的執行是成功還是失敗,典型的處理方案是。返回值為0表示程式執行成功,返回值為非0則表示程式執行失敗。我們常常會在程式的末尾加上return 0操作。
到此這篇關於C語言 語意陷阱超詳細梳理總結的文章就介紹到這了,更多相關C語言 語意陷阱內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45