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