官术网_书友最值得收藏!

6-7 成為C程序員你還需要知道的事情

除了前面的基礎知識,你還需要掌握這些C語言中比較專業的知識。

1.名字的重要性

在程序中經常發現許多以下畫線開頭的變量和函數名,例如:_dos_getdrive或_chmod。一般只在DOS環境中才使用這樣的變量和函數。如果編寫的程序將在DOS、Windows、Macintosh、UNIX或其他一些操作系統下運行,最好不要使用這樣的函數,因為它們很可能在其他系統中不能用。這樣,當要把程序從DOS轉移到其他操作系統上時,必須重新編程。一個函數有兩種命名(implementation),一種是帶下畫線的(_chmod),另一種是不帶下畫線的(chmod)。作為規則,應使用不帶下畫線的變量和函數,在本例中是chmod。

2.C語言區分大小寫字母

當輸入程序時,必須記住在C語言中大小寫字母是區別對待的。作為一個規則,大多數C命令使用小寫字母,大多數常量使用大寫字母,而大多數變量使用的是大小寫字母混合。在C程序中,小寫字母的應用極為廣泛。在下面的程序uppererr.c中,因為使用的是Main,而非C程序中所用的main,所以該程序不能編譯成功:

當編譯程序uppererr.c時,Turbo C編譯器將顯示如下消息:

Link error:Undefined suymbol _main module TURBO_C COS.ASM

Turbo C編譯器返回的這條相對沒有什么意義的消息是因為使用了Main的結果。在這種情況下,只需將Main改為main,重新編譯并執行該程序即可。

3.理解分號的作用

在C程序中,我們會發現分號經常被使用。C程序中的分號有著特殊的意義。大家都知道,程序是計算機所要執行的指令集。使用這些指令時,必須用分號來分隔語句。隨著程序變得越來越復雜,可能一行放不下一個語句。當C編譯器檢查程序時,它使用分號將相鄰的語句分開。C語言的語法定義了分號的用法。如果忽略了分號的用法,將會出現語法錯誤,程序不能通過編譯。

另外,我們經常在某一行代碼中直接用一個“;”號,甚至調試的時候,連續幾行都是“;”號,這是為了期待一個程序延時delay的作用,簡單來說,就是讓程序CPU空轉一下,等待一下,看一下會有什么情況發生。

4.進一步了解連接器

編譯C程序時,另一個被稱作連接器的程序將程序語句和預定義例程連接起來(編譯器提供的),將目標文件轉化為可執行文件。如同編譯過程可檢測到錯誤一樣,連接程序也可能檢測到錯誤。舉個例子,在下面的程序no_print.c中,使用錯誤的print來代替printf:

由于no_print程序并未違反C語法規則,它可以順利通過編譯,生成一個OBJ文件。但Turbo C卻會因為未定義的print語句而顯示如下的錯誤信息:

Error:Funcy\tion 'print'should have a prototype in function main()

因為C譯器不提供名為print的函數,連接器不能生成可執行程序no_print.exe。相反,連接器將顯示如上所示的錯誤信息。編輯源文件有,改正錯誤,將print改為printf,并重新編譯、連接程序。

5.寄存器類型標識符

變量是與程序關聯的內存單元的名字。定義一個變量時,C編譯器將分配內存以存儲變量的值。當程序必須存儲變量時,CPU訪問內存要占用一定的時間,有時可讓編譯器把變量存儲在寄存器中(駐留于CPU本身中)以提高程序的性能。因為數值存儲在寄存器中時,編譯器存儲該數值的速度大大加快,所以程序的執行速度也會更快。寄存器(register)類型標識符可通知編譯器盡量把變量存儲在寄存器中。因為CPU中寄存器的數目有限,編譯器不可能讓某個變量長期占用一個寄存器,所以編譯器只能盡量把變量保存在寄存器中。下列語句說明了register類型標識符的使用方法:

對于程序經常存儲到的變量應當使用register標識符,例如程序每次循環都必須訪問的變量loop。

6.多賦值運算符

如前所述,C使用等號(=)作為賦值運算符。一般情況下,C程序在不同的行給變量賦值,如下所示:

如果想給多個變量賦相同的值,C語言允許同時完成這些賦值操作,如下所示:

count=sum=value=0;

當C遇到多賦值運算符時,它是從右至左賦值的。作為一條規則,多賦值運算符只能用來初始化變量。如果在更復雜的操作中使用這種方法,將降低程序的可讀性。例如下列程序將輸入字符的大寫形式賦給兩個變量:

ltr_save=letter=toupper(getchar());

7.把變量的值賦給另一種類型的變量

類型定義了變量的可存儲數值,以及計算機對該數據進行的操作。C語言提供了四種基本數據類型(整型、浮點型、字符型和雙精度型)。有時可能需要將一個整型變量的值賦給浮點型變量,或相反。作為一條普遍的規律,可以成功地把整型變量的值賦給浮點型變量。但如果要把浮點型變量的值賦給整型變量,那就得小心了。大部分編譯器將截除浮點型數值的小數部分。而另一些編譯器則可能進行四舍五入,而不是截尾(這意味著,當數值的小數部分大于0.5時,這兩種編譯器轉換所得的數值將是不同的)。如果想確保程序把一個浮點型數轉換成整型數的值每次都一樣,需要使用ceil floor函數,這兩個函數將在后面的部分講到。

8.賦給十六進制或八進制值

有些程序有時可能需要使用八進制或十六進制數值。這時,應告訴編譯器用戶將使用非十進制的數值。如果使用以0(零)開頭的數值例如077,C編譯器將把它當作八進制看待。類似地,如果使用以0x開頭的數值,例如0xFF,編譯器將把它當作十六進制看待。下列語句說明了如何使用八進制和十六進制常量:

int octal_value=0227;

int hex_value=0xFF0;

主站蜘蛛池模板: 华容县| 金溪县| 蓬安县| 永登县| 淅川县| 宁晋县| 砀山县| 滨州市| 五指山市| 循化| 永州市| 新营市| 扶余县| 桐乡市| 广元市| 肃北| 苏尼特左旗| 宝兴县| 肇源县| 兴和县| 伊宁市| 苗栗市| 阿合奇县| 定结县| 隆昌县| 山东省| 同江市| 陕西省| 儋州市| 民县| 南皮县| 龙胜| 中宁县| 阳高县| 翁牛特旗| 旬邑县| 衡东县| 上犹县| 海伦市| 湟中县| 苍溪县|