本文是TC的第一部分,主要介紹一些TC相關的基礎知識,並著重針對循環、變量等TC基本概念中的易混的淆部分加以辨析,即是一份編程初學者的指南,也可算作是對《C how to program》的一些補充。 在正式進入編程部分之前,讓我們先詳細了解一下Turbo C的編譯環境,以便在編程時可以更加得心應手。
File菜單
Pick--快速讀取最近的9個文件。(真的是很方便的功能,特別是在DOS時代 ^-^)
Write to--把文件內容換名存盤,支持DOS通配符。(相當於現在的Save as...)
OS shell--暫時離開Turbo C回到DOS環境執行DOS命令,輸入命令EXIT即可回到Turbo C.(DOS時代的DOS窗口?)
Run菜單
Program reset--清楚內存中的調試信息,釋放內存空間。(中斷點和變量信息不會被清除)
Go to cursor--運行程序到光標所在位置。
Trace into--以單步方式執行當前程序,當前執行行會以高亮顯示。(此操作可進入被調用函數)
Step over--功能同Trace into,但不會進入被調用函數。
Compile菜單
Make EXE file--編譯、連接程序,生成可執行文件。
Link EXE file--只連接不編譯程序,生成可執行文件。(需要有目標程序即.OBJ文件)
Build all--重新編譯項目裡的所有文件(見project菜單部分),但不進行過時檢查。(即如果源文件的日期比目標文件日期更早,則不對源文件進行編譯)
Project菜單
Project name--選擇一個包含待編譯源文件名的項目文件。(讀者如果給這部分內容比較困惑,可以把問題貼到放飛網的論壇上,將由本人或其它放飛網技術人員給予解答)
Auto dependencies--如果將開關打開,編譯時將檢查源文件與對應的.OBJ文件日期和時間,如時間不同則重新進行編譯。
Options菜單
請參見本站lzc、小壯的《Turbo C 2.0 設置詳解》,這裡不再贅述。
Debug菜單
Evaluate--當程序運行時,這個命令可以查看並修改內存中的變量和其它一些類似的項目。
Call stack--程序運行時用於檢查堆棧情況。
Find function--程序運行時用來顯示指定的函數。
Refresh display--如果編輯窗口偶然被用戶窗口重寫了,可用此命令恢復編輯窗口的內容。
Display swapping--用於控制編輯窗口和用戶窗口的交換條件,有smart, always, none三種模式。
Break/watch菜單
用來控制斷點及監視表達式
看完上面的簡介,相信你已經對TC的功能感到驚訝了,想當初在十幾年以前的DOS時代,能夠擁有一個功能如此強大的編譯器可是眾多程序員夢寐以求的事情呢。所以現在的同學大可不必嫌棄TC界面簡陋,功能有限,著急去碰什麼VC,還是先靜下心來,把TC學好吧。
對TC有了進一步的了解之後,下面讓我們進入C語言本身的部分。
了解了執行過程,現在讓我們來說說語句。語句是組成程序的基本單位,它能完成特定的操作,語句的有機組合序列能實現指定的計算處理功能。比較難於掌握的是流程控制語句,下面我們就對流程控制語句中易混淆的部分進行一下說明。
選擇語句(If和Switch)
一般情況下,用if語句實現簡單分支結構程序,用switch和break實現多分支結構程序。雖然用嵌套if語句也能實現多分支結構程序,但用switch和break實現的多分支結構程序更簡潔明了,這一點初學者應當多加注意。還應注意的是由於表達式的值非0為真,0為假,所以具有值的表達式也可做為if語句的控制條件。
循環語句(for、while和do-while)
首先,讀者應了解一點,一般用某種循環語句寫的程序段,也能用另外兩種循環語句實現。當然,在實際應用中,for語句多用於循環次數明確的問題,而無法確定循環次數的問題采用while語句或do-while語句比較自然。讀者還應注意掌握for語句三個表達式的多種變化,例如省略部分表達式或全部表達式,甚至把循環體也寫入表達式當中,而循環體本身成為了空語句,以滿足循環語句的語法要求。
轉移語句(break、continue、return、goto)
對於break和continue,這裡提醒讀者一下break除了用在switch語句中外,還常被用在循環語句中強制結束循環,而continue則只用於跳過某次循壞。如果某個switch語句存在於循環之中,而switch中又包含了continue語句,則這個continue將跳過整次循環,而非switch中的某個case。return語句請詳見函數部分。goto語句可以方便的在程序的執行流程中進行跳轉,但goto語句會攪亂程序的流程,降低程序的可讀性,在結構化的程序設計之中,不提倡使用goto語句,ANSI C的作者曾說;“Formally, the goto is never necessary, and in practice it is almost always easy to write code without it.”所以在這裡就不對goto語句做更多地介紹了。如果實在想玩一玩的話,就用它來退出深層嵌套吧,例如:
for (...)
for (...){
...
if (disaster)
goto error;
}
...
error: ...
最後,讓我們來討論一下變量,變量是對程序中數據所占用內存空間的一種抽象。我們先來了解一下變量的類型。
ANSI標准規定整形變量屬性表
數據類型
占用字節數
二進制位
取值范圍
int
2
16
-32768--32767
short[int]
2
16
-32768--32767
long[int]
4
32
-2147483648--2147483647
unsigned[int]
2
16
0--65535
unsigned long[int]
4
32
0--4294967295
實數基本類型表
實數類型
存儲字節數
最小數值范圍
有效位
float
4
10^-38--10^38
6-7
double
8
10^-308--10^308
15-16
long double
16
10^-4932--10^4932
18-19
在C中,我們還可以設置變量的存儲屬性,已確定變量的存儲位置,C中定義了4種存儲屬性:auto register extern和static 。
TC中默認的是auto型,作用域為當前函數,在函數結束時存儲空間被釋放。
register型變量直接存於CPU的寄存器中,其特點是大大加快了運算速度,register變量只能是int型或char型,且存在個數限制(TC中為2個),因此register型變量多用來充當計數器變量使用。由於變量儲存在寄存器中,所以無法對其進行地址操作,例如無法使用取地址運算符"&"求register變量的地址。順便提一下,TC會自動把訪問頻繁的變量存入寄存器中(需將相關選項設為on)。
external型變量必須定義在所有函數的外部,為變量開辟存儲空間。在函數中如果要訪問這個變量,需要用extern進行聲明。當然,如果external型變量定義在函數調用之前,extern可以省略。由於extern變量可以方便的隨時調用,所以有人趨向於把大多數變量定義為extern型變量,但是extern變量總是存在於內存之中,不僅占用了大量的存儲空間,而且變量數值容易在無意中被改變,引起不可預見性的錯誤,且使程序難於修改。
對於一些初學者來說,static變量可能比較難於理解,這裡舉個例子來說明static與auto的區別。例如定義變量a分別為static型和auto型,且設其值為1。"int x=1;"的含義是對變量賦初值,等價於下列兩個語句"int x; x=1;",而"static int x=1;"的含義是說明一個static型變量並對其進行初始化,初始化是在程序執行之前,由編譯程序一次性為變量賦的初值"x=1",而在實際運行時不再對變量進行賦值操作。
為了便於理解,特對四種存儲變量總結如下:
四種存儲變量的特征
性能
auto
extern
static
register
外部
內部
記憶能力
no
yes
yes
yes
no
多個函數共享
no
yes
yes
no
no
不同文件共享
no
yes
no
no
no
初始化賦值
random
0
0
0
random
作用域
當前函數
整個程序
當前文件
當前函數
當前函數
搞清楚了變量之後,對TC的基本介紹到此也算告一段落,如果您覺得本文確實為您學習TC提供了一些幫助的話,那麼敬請您關注TC編程手冊之二---函數和數組。