資源簡介
K&R的《C程序設計語言》第二版中文版,高清帶目錄PDF格式
不會換行。在 函數的參數中,只能用表示換行符。如果用程序的換行代替,例 編譯器將會產生一條錯誤信息。 函數永遠不會自動換行,這樣我們可以多次調用該函數以分階段得到一個長的輸 出行。上面給出的第一個程序也可以改與成下列形式: 這段程序與前面的程序的輸出相同 請注意,只代表一個字符。類似于的轉義字符序列為表示無法輸入的字符或不可見 字符提供了一種通用的可擴充的機制。除此之外,語言提供的轉義字符序列還包括:表 示制表符;表示回退符;表示雙引號;表示反斜杠符木身。節將給出轉義字符序 列的完整列表 練習 在你自己的系統中運行 程序。再有意去掉程序中的部分 內容,看看會得到什么出錯信息 練習 散個實驗,當 函數的參數字符串中包含(其中是上面的轉義 字符序列中未曾列出的某一個字符)時,觀察一下會出現什么情況。 變量與算術表達式 我們來看下一個程序,使用公式℃"F打印下列華氏溫度與攝氏溫度對照表 此程序中仍然只包括一個名為 的函數定義。它比前面打印 的程序 長一些,但并不復雜。這個程序中引入了一些新的概念,包括注釋、聲明、變量、算術表達 式、循環以及格式化輸出。該程序如下所示 時,分別 打印華氏溫度與攝氏溫度對照表 溫度表的下限 溫度表的上限 步長 其中的兩行 打印華氏溫度與攝民溫度對照長物 當 時 稱為注釋,此處,它簡單地解釋,該程序是倣什么用的。包含在與之間的字符序列將被 編譯器忽略。注釋可以自由地運用在程序中,使得程序更易于理解。程序中允許岀現空格 制表符或換行符之處,都可以使用注釋。 在語言中,所有變量都必須先聲明后使用。聲明通常放在函數起始處,在任何可執行 語句之前。聲明用于說明變量的屬性,它由一個類型名和一個變量表組成,例如 其中,類型表示其后所列變量為整數,與之相對應的 表示所列變量為浮點數(即, 可以帶有小數部分的數) 類型的取值范圍取決于只體的機器。對于類型, 通常為位,其取值范圍在 之間,也有用位表示的類型。 類 型通常是位,它至少有位有效數字,取值范圍般在 之間 除與 類型之外,語高還提供了其它一些基木數據類型,例如 字符個字節 短整型 長整型 雙精度浮點型 這些數據類型對象的人小也取決于具體的機器。另外,還存在這些基本數據類型的數組、結 構、聯合,指向這些類型的指針以及返回這些類型值的函教。我們將在后續相應的章節中分 別介紹。 在上面的溫度轉換程序中,最開始執行的計算是下列個賦值語句: 它們為變量設置初值。各條語句均以分號結束。 溫度轉換表中的各行計算方式相同,因此可以用循環語句重復輸出各行。這是 循 壞語句的用途: 循環語句的執行方式是這樣的:首先測試圓括號中的條件;如果條件為真 則執行循環體(括在花括號中的條語句);然后再重新測試圓括號中的 條件,如果為真,則再次執行循壞體;當圓括號中的條件測試結果為假 循環結束,并繼續執行跟在 循環語句之后的下一條語句。在本程序中,循環語句后沒 有其它語句,因此整個程序的執行終止 語句的循環體可以是用化括號括起米的一條或多條語句(如上面的溫度轉換程 序),也可以是不用花括號包括的單條語句,例如 在這兩種情況下,我們總是把由 控制的話句縮進一個制表位,這樣就可以很容易地看 岀循環語句中包含哪些語句。這種縮進方式突出了程序的邏輯結構。盡管編譯器并不關心 程序的外觀形式,但正確的縮進以及保留適當空格的程序改計風格對程序的易讀性非常重要。 我們建議每行只書寫一條語句,并在運算符兩邊各加上一個空格字符,這樣可以使得運算的 結合關系更清楚明了。相比而言,花括號的位置就不那么重要了。我們從比較流行的一些風 柊中選擇了一種,讀者可以選擇適合自己的一種風格,并養成一直使用這種風格的好習慣。 在該稈序中,絕人部分工作都是在循環體中完成的。循環體中的賦值語句 用于計算與指定華氏溫度相對應的攝氏溫度值,并將結果賦佰給變量 。在該語句中 之所以把表達式寫成先乘然后再除以而不是直接寫成 其原因是在語言及許多 其它語言中,整數除法操作將執行合位,結果中的任何小數部分都會被舍棄。由于和都 是整數, 相除后經截取所得的結果為,因此這樣求得的所有攝氏溫度都將為 從該例子中也可以看出 函數的一些功能 是一個通用輸出格式化函數, 第章將對此做詳細介紹。該函數的第個參數是待打印的字符串,其中的每個百分號() 表示其它的參數(第二個、第三個、參數)之一進行替換的位置,并指定打印格式。例 如,指定一個整型參數,因此語句 用于打印兩個整數 的值,并在兩者之間留一個制表符的空間()。 函數的第一個參數中的各個分別對應于第二個、第三個、參數,它們在數 目和類型上都必須匹配,否則將出現錯誤的結果。 順便指出, 函數并不是語言本身的一部分,語言本身并沒有定義輸入/輸出 功能。 僅僅是標準庫函數中一個有用的函數而已,這些標準廳函數在語言程序中 通常都可以使用。但是,標準定義了 兇數的行為,因此,對每個符合該標準的 編譯器和庫來說,該函數的屬性都是相冋的。 為了將重點放到講述語言夲身上,我們在第章之前的各章中將不再對輸入/輸出做 更多的介紹,并且,特別將格式化輸入推后到第章講解。如果讀者想了解嶔據輸入,可以 先閱讀節中對 函數的討論部分, 函數類似于 函數,但它用于讀輸 入數據而不是寫輸出數據。 上述的溫度轉換程序存在兩個問題。比較簡單的問題是,由于輸出的數不是右對齊的, 所以輸出的結果不是很美觀。這個問趣比較容易解決:如果在 語句的第一個參數的 中指明打印寬度,則打印的數字會在打印區域內右對齊。例如,可以用語句 打印 的值,這樣, 的值凸個數字寬 的值占個數字寬 輸出的結果如下所示: 弓一個較為嚴重的問題是,由于我們使用的是整型算術運算,因此經計算得到的攝氏溫 度值不太精確,例如,與℃對應的精確的攝氏溫度應該為℃,而不是℃C。為∫得到 更精確的結果,應該用浮點算術運算代替上面的整型算術運算。這就需要對稈序做適當修改。 下面是該程序的又一種版本 這個程序與前一個程廳基本相同,不同的是,它把與 聲明為 類 型,轉換公式的表述方式也更自然一些。在前一個程序中,之所以不能使用 的形式, 是因為按整型除法的計算規則,它們相除并舍位后得到的結果為。但是,常數中的小數點表 明該常數是一個浮點數,因此 是兩個浮點數相除,結果將不被舍位。 如果某個算術運算符的所冇操作數均為整型,則執行整型運算。但是,如果某個算術運 算符有一個浮點型操作藪和一個整型操作數,則在開始運算之前整型操作數將會被轉換為浮 點型。例如,在表達式 ,在運算過稈中將被自動轉換為浮點數再參與運算。 不過,即使浮點常量取的是整型值,在書寫時最好還是為它加上一個顯式的小數點,這樣可 以強調其浮點性質,便于閱讀。 第章將詳細介紹把整型數轉換為浮點型數的規則。在這里需要注意,賦值語句 與條件測試語句 也都是按照這種方式執行的,即在運算之前先把類型的操作數轉換為 類型的操作 數 中的轉換說明 表明待打印的浮點數(即)至少占個字符寬,且不 帶小數點和小數音分; 表明另一個待打印的數( )至少占個字符寬,且小 數點后面有位數字。其輸出如下所示 格式說明可以省略寬度與精度,例如,衣示待打印的浮點數至少有個字符寬 指定待打印的浮點數的小藪點后有兩位小數,但寬度沒有限制;則僅僅要求按照浮點數打 印該數。 按照|進制整型數打印 按照十進制整型數打印,至少個字符寬 按照浮點數打印 按照浮點數打印,至少個字符寬 按照浮點數打印,小數點后有兩位小數 按照浮點數打印,至少個字符寬,小數點后有兩位小數 此外, 睬數還支持下列格式說明:表示八進制數;表示十六進制數 表示字符;表示字符串;表示百分號()本身。 練習 修改溫度轉換程序,使之能在轉換表的頂音打印一個標題 練習 編寫一個程序打印攝氏溫度轉換為相應華氏溫度的轉換表。 語句 對」某個特定任務我們可以呆用多種方法來編寫程序。下面這段代碼也可以實現前面的 溫度轉換稈序的功能: 打印華氏溫度攝氏溫度對照表 這個程序與上節中介紹的程序執行結果相同,但程序本身卻有所不同。最主要的改進在于它 去掉了大部分變量,而只使用了一個類型的變量在新引入的語句中,溫度 的下限、上限和步長都是常量,而計算攝氏溫度的衣達式現在變成了 函數的第三個 參數,它不再是一個單獨的賦值語句。 上幾點改進中的最后一點是語言中一個通用規則的實例:在允許使用某種類型變量 值的任何場合,都可以使用該類型的更復雜的表達式。因為 函數的第三個參數必須 是與 匹配的浮點值,所以可以在此處使用任何浮點表達式 語伺是一種循環語句,它是對 語句的推廣。如果將語句與前面介紹的 語句比較,就會發現語句的操作更直觀一些。圓括號中共包含個部分,各部分 之閂用分號隔廾。第一部分 是初始化部分,僅在進入循坯前執行一次。第二部分 是控制循環的測試或條件部分。循環控制將對該條件求值,如果結果值為貞(),則執行 循環體(本例中的循環體僅包含一個 函數調用話句)。此后將執行第三部分 以將循環變量 增加一個步長,并次對條件求值。如果計算得到的條件值為假( 循環將終止扶行。與 語句一樣,循環語句的循環體可以只有一條語句,也可以是 用花括號括起來的一組語句。初始化部分(第一部分)、條件部分(第二部分)與增加步長部 分(第三部分)都可以是仟何表達式。 在實際編程過程中,可以選擇 與中的仟意一種循環語句,主要要看使用哪一 種更清 語句比較適合初始化和增加步長都是單條語句并且邏輯相關的情形,因為它 將循環控制話句集中放在一起,且比 語句更緊湊。 練習 修改溫度轉換程序,要求以逆序(即按照從度到度的順序)打印溫 度轉換表。 符號常量 在結束討論溫度轉換程序前,我們再來看下符號常量。在程序中使用 等類似 的“幻數”并不是一個好習慣,它們幾乎無法向以后閱讀該程序的人提供什么信息,而且使 程序的修改變得更加困難。處理這種幻數的一種方法是賦予它們有意義的名字。 指 令可以把符號名(或稱為符號常量)定義為一個特定的字符串 名字替換文本 在該定義之后,程序中出現的所有在 中定義的名字(既沒有用引號引起來,也不是 其它名字的一部分)都將用相應的替換文本替換。其中,名字與普通變量名的形式相同:它 們都是以字母打頭的字丹和數字序列;替換文本可以是任何字符序列,而不儀限于數字 其中, 與 都是符號常量,而非變量,因此不需要出現在聲明中。符號 常量名通常用大寫字拼寫,這樣可以很容易與用小寫字母拼寫的變量名相區別。注意 指令行的末尾沒有分號。 字符輸入/輸出 接下來我們看一組與字符型數據處理有關的程序。讀者將會發現,許多程序只不過是這 里所討論的程序原型的擴充版本而已 標準庫提供的輸入/輸出模型非常簡單。無論文木從何處輸入,輸出到何處,其輸入 輸出都是按照字符流的方式處理。文木流是由多行字符構成的字符序列,而每行字符則由 個或多個宇符組成,行末是·個換行符。標準庫負責使每個輸入/輸出流都能夠遵守這模 刑。使用標準庫的語言程序員不必關心在程序之外這些行是如何表示的。 標準庫提供了一次讀/寫一個字符的函數,其中最簡單的是 和 兩個 區數。每次調用時, 函數從文本流中讀入下一個輸入字符,并將其作為結果值返 也就是說,在執行語句 之后,變量中將包含輸入流中的下一個字符。這種字符通常是通過鍵盤輸入的。關」從文 件輸入字符的方法,我們將在第章中討論。 每次調用 函數時將打印一個字符。例如,語句 將把整型變量的內容以字符的形式打印出來,通常是顯示在屏幕上。 與 這兩個函數可以交替調用,輸出的次序與調用的次序·致 文件復制 佶助于 與 函數,可以在不了解其它輸入/輸出知識的情況下編寫出 數量驚人的有用的代碼。最簡單的例了就是把輸入·次個宇符地復制到輸出,其基本思想 如下: 讀一個字符 該字符不是文件結束指示符 輸出剛讀入的字符 讀下一個字符 將上述基本思想轉換為語言程序為 其中,關系運算符表示“不等于” 字符在鍵盤、屏幕或其它的任何地方無論以什么形式表現,它在機器內部都是以位模式 存儲的。類型專門用于存儲這種字符型數據,當然任何整型()也可以用于存儲字 符犁數據。因為某些潛在的重要原因,我們在此使用類型。 這里需要解決如何區分文件中有效數據與輸入結束符的問題。語言采取的解決方法是: 在沒有輸入時 函數將返回一個特殊值,這個特殊值與仁何實際字符都不同。這個 值稱為 ,文件結束)。我們在聲明變量的時候,必須讓它大到足以存 放 函數返回的仟何值。這里之所以不把聲明成類型,是因為它必須足夠人, 除了能存儲任何可能的字符外還要能存儲文件結束符。因此,我們將聲明成類型 定義在頭文件 中,是個整型數,其具體數值是什么并不重要,只要它與 仟何 類型的值都不相同即可。這里使用符號常量,可以確保稈序不需要依賴于其對應的 任何特定的數值 對于經驗比較豐富的語言程序員,可以把這個字符復制程序編寫得更精煉一些。在 語言中,類似于 之類的賦值操作是一個表達式,并且只有一個值,即賦值后左邊變量保存的值。也就是說, 賦值可以作為更大的表達式的一部分出現。如果將為賦值的操作放在 循環語句的測 試部分中,上述字符復制程序便可以改寫成下列形式:
代碼片段和文件信息
評論
共有 條評論