C語言學(xué)習(xí)隨筆剛剛開始學(xué)習(xí)軟件不久,雖然自己正在北京的北大青鳥新興橋培訓(xùn)中心上課,并且學(xué)習(xí)了C語言的基礎(chǔ)知識(shí),但是和實(shí)際工作中需要具備的知識(shí)層面還是差距很大,很多深層次的知識(shí)還是要自己進(jìn)行儲(chǔ)備。二學(xué)期的課程該開始學(xué)習(xí)C++的內(nèi)容了,估計(jì)會(huì)對(duì)C語言的靈活運(yùn)用起到一定的幫助,也希望能對(duì)以前的學(xué)習(xí)領(lǐng)會(huì)更深層次一點(diǎn)兒。 在這里將自己學(xué)習(xí)C語言過程中遇到的一些問題和應(yīng)該注意的內(nèi)容記錄下來,也對(duì)自己的學(xué)習(xí)思路作一下整理,如果能給其他網(wǎng)友帶來一定的幫助的話,那應(yīng)該是一件讓我非常高興的事情了 一、C程序一般遵循的習(xí)慣 1、習(xí)慣上,將主函數(shù) main()放在程序文件的最前面,而其它函數(shù)只在其前面進(jìn)行聲明。 2、對(duì)所有要求成對(duì)出現(xiàn)的符號(hào),如“{}”、“()”、“/* */”等,在輸入時(shí),均成對(duì)輸入,然后再在其中插入需要的內(nèi)容,這樣可以避免遺忘,減少不必要的程序調(diào)試。 3、習(xí)慣上,變量名及函數(shù)名使用小寫,而字符常量使用大寫。 4、盡量選擇具有含義的英文單詞作為變量名及函數(shù)名,這樣對(duì)程序的維護(hù)非常有好處,能不使用縮寫盡量不要使用縮寫,即使采用縮寫,也要做到可以望文生義。 5、良好的習(xí)慣:在雙目運(yùn)算符的左右兩側(cè)各加一個(gè)空格,可以增強(qiáng)程序的可讀性。 6、為了使程序具有良好的可讀性并減少出錯(cuò),凡不要求返回值的函數(shù),都應(yīng)定義返回為空(void),即使函數(shù)類型為整型,也不使用系統(tǒng)的缺省處理(系統(tǒng)缺省會(huì)返回一個(gè)不確定的值)。 如:void function(void) { /****函數(shù)體****/ } 7、使用懸空指針很容易破壞系統(tǒng),所以要避免。 8、全局變量可以作為函數(shù)之間傳遞參數(shù)的一個(gè)手段,但是全局變量太多時(shí),會(huì)使內(nèi)存開銷變大,并且,全局變量在同時(shí)操作時(shí)會(huì)出現(xiàn)問題,所以,應(yīng)該盡量少使用全局變量。 9、盡量避免在混合表達(dá)式中使用自加或者自減運(yùn)算是寫程序的良好習(xí)慣,因?yàn)橛行┉h(huán)境下是右結(jié)合性,有些環(huán)境下卻是左結(jié)合性,這樣會(huì)造成運(yùn)算結(jié)果的不確定性。 10、在寫浮點(diǎn)常量時(shí),最好還是將它們寫成帶小數(shù)點(diǎn),即使該浮點(diǎn)常量取的是整數(shù)值,因?yàn)檫@樣可以強(qiáng)調(diào)其浮點(diǎn)性,便于別人閱讀。 二、在編寫C語言程序時(shí)應(yīng)該注意的一些問題 1、加分號(hào)(;)與不加分號(hào)。 1)在C語言中,分號(hào)代表一條語句的結(jié)束,所有語句必須以分號(hào)結(jié)束,即使是最后一條語句也不例外。 2)這里一定不要忘記加分號(hào)。 do { /*循環(huán)體*/ }while(循環(huán)條件); //是這里了:)
3)宏定義部分不能加分號(hào)。 如:#incllude <stdio.h>
#define SUCC 0
#ifndef _FUNC_H #define _FUNC_H #endif
4)函數(shù)的說明部分不可以加分號(hào)。 如:int function(int) //注意:這里沒有分號(hào) { 函數(shù)體; } 5)這里也沒有分號(hào): for(i=0;i<10;i++ ) //小括號(hào)的后面 while(num<10) //這里也一樣沒有 6)不要混淆: while(循環(huán)條件); 注意:這里的分號(hào)是指while循環(huán)的循環(huán)體是一個(gè)空語句,當(dāng)然這種寫法很不好,但是沒有錯(cuò)誤。 7)還有就是if()、switch()等語句的小括號(hào)后面都不能加分號(hào)。 2、標(biāo)識(shí)符 1) C語言的標(biāo)識(shí)符必須以字母或下劃線開頭,并且由字母、數(shù)字和下劃線組成。 關(guān)鍵字有系統(tǒng)保留,不能作為變量名。 標(biāo)識(shí)符的有效長(zhǎng)度因系統(tǒng)而異。 C語言對(duì)大小寫敏感。 2)通用規(guī)則:在所以可以使用某個(gè)類型的變量的值的地方,都可以使用該類型的更復(fù)雜的表達(dá)式。 3、系統(tǒng)在存儲(chǔ)字符串時(shí),會(huì)自動(dòng)加上一個(gè)‘\0‘作為字符串的結(jié)束符,因此,一個(gè)字符串在存儲(chǔ)時(shí)要比實(shí)際多占用一個(gè)字節(jié)空間。 4、強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換,只是得到一個(gè)所需要的中間量,而被要求進(jìn)行強(qiáng)制轉(zhuǎn)換的原表達(dá)式的類型并不發(fā)生變化。 5、在C語言中,整形和字符型數(shù)據(jù)可以互相轉(zhuǎn)換輸出,系統(tǒng)首先求該數(shù)與256的余數(shù),然后將余數(shù)作為ASCII碼轉(zhuǎn)換成相應(yīng)的字符輸出。 6、switch(表達(dá)式) 這里的“表達(dá)式”,只可以是int,char或枚舉類型中的一種。 7、break語句和continue語句 1)break語句只對(duì)循環(huán)和switch語句有效,continue語句只對(duì)循環(huán)語句有效。 2)循環(huán)嵌套時(shí),break和continue語句只影響包含它們的最內(nèi)層循環(huán),與外層循環(huán)無關(guān)。 8、數(shù)組 1)數(shù)組定義中的“下標(biāo)表達(dá)式”的值表示數(shù)組中的元素個(gè)數(shù),而并不是數(shù)組的最大元素的下標(biāo)。 2)數(shù)組元素的下標(biāo),是元素相對(duì)于數(shù)組起始地址(首地址)的偏移量,所以從0開始順序編號(hào)。 3)數(shù)組名中存放的是一個(gè)地址常量,它代表整個(gè)數(shù)組的首地址,即數(shù)組中第一個(gè)元素的地址。同一個(gè)數(shù)組中的所有元素,按其下標(biāo)順序占用一段連續(xù)的存儲(chǔ)單元。 4)C語言不允許動(dòng)態(tài)定義數(shù)組。 如:int array[]; char s[]; 都是錯(cuò)誤的,編譯檢查無法通過。 5)C語言系統(tǒng)不自動(dòng)檢測(cè)數(shù)組元素的下標(biāo)是否越界,因此,程序員保證下標(biāo)不越界是很重要的?。。。?! 9、C語言規(guī)定函數(shù)定義不允許嵌套,即在一個(gè)函數(shù)的函數(shù)體內(nèi),不能再定義另一個(gè)函數(shù)。 10、如果函數(shù)沒有return語句,并不是代表函數(shù)不返回值,而是返回一個(gè)不確定的值。所以為了明確表示不返回值,可以用void定義。 11、指針和指針變量 1)一個(gè)變量的地址即稱為該變量的指針,通過變量的指針能夠找到該變量。 2)專門用來存儲(chǔ)其它變量地址的變量稱為指針變量。 3)指針變量本身有自己的地址,這和其它類型的變量沒有區(qū)別。但是,指針變量只能用來存放地址。 4)指針聲明時(shí)的"*"和指針運(yùn)算符的"*"是兩個(gè)截然不同的概念。 12、"&"和"*"運(yùn)算符 1)"&"運(yùn)算符是一個(gè)返回操作數(shù)地址的單目運(yùn)算符 2)"*"運(yùn)算符是對(duì)"&"運(yùn)算符的一個(gè)補(bǔ)充,它返回位于這個(gè)地址內(nèi)的變量的值,也是單目運(yùn)算符。 13、數(shù)組與指針有密切關(guān)系。數(shù)組名本身就是該數(shù)組的指針,反之,也可以把指針看成一個(gè)數(shù)組。數(shù)組名和指針實(shí)質(zhì)上都是地址,但是,必須注意,指針是變量,而數(shù)組名是常量。 如:int array[10],*p; p=&a; p++; //正確,因?yàn)閜是變量,可以進(jìn)行自增運(yùn)算 a++; //錯(cuò)誤,因?yàn)閍是常量,不能進(jìn)行自增運(yùn)算 14、scanf()的問題 當(dāng)使用多個(gè)scanf()函數(shù)連續(xù)接收多個(gè)字符變量輸入時(shí),會(huì)存在scanf()函數(shù)將"空格"或"回車"符接收進(jìn)來的情況,而使字符變量?jī)?nèi)存入了我們不需要的值。 對(duì)于這個(gè)問題,可以有如下的解決方法: 1)scanf(" %c",ch); //在"%c"的前面故意留一個(gè)空格
2)scanf("%c",ch1); fflush(stdin); //加入一行清除輸入緩沖的操作 scanf("%c",ch2); 15、結(jié)構(gòu)變量名不是指向該結(jié)構(gòu)的地址,這與數(shù)組名的含義不同。因此,若要取結(jié)構(gòu)中第一個(gè)成員的地址,應(yīng)表示為: &[結(jié)構(gòu)變量名]。 16...... |
|
|