- C/C++實踐進階之道:寫給程序員看的編程書
- 陳黎娟
- 1961字
- 2020-06-29 11:37:45
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;
- 數字媒體應用教程
- 自己動手實現Lua:虛擬機、編譯器和標準庫
- Python測試開發入門與實踐
- 零基礎入門學習Python
- PhoneGap:Beginner's Guide(Third Edition)
- Linux Device Drivers Development
- WordPress 4.0 Site Blueprints(Second Edition)
- 零基礎趣學C語言
- Microsoft Dynamics AX 2012 R3 Financial Management
- Scratch3.0趣味編程動手玩:比賽訓練營
- R語言數據可視化:科技圖表繪制
- Building Serverless Architectures
- PrimeFaces Blueprints
- Julia High Performance(Second Edition)
- 程序員的成長課