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