![]() ![]() |
C語言程序設(shè)計(jì)教程 ![]()
本書以Visual C++ 6.0為開發(fā)平臺(tái),全面介紹了C語言的基礎(chǔ)知識(shí)、程序結(jié)構(gòu)及程序編寫技巧。全書共分為12章,包括引言、C語言基礎(chǔ)知識(shí)、順序結(jié)構(gòu)程序設(shè)計(jì)、選擇結(jié)構(gòu)程序設(shè)計(jì)、循環(huán)結(jié)構(gòu)程序設(shè)計(jì)、函數(shù)、預(yù)處理、數(shù)組、指針、結(jié)構(gòu)體與共用體、文件、位運(yùn)算。本書內(nèi)容豐富、結(jié)構(gòu)合理、思路清晰、語言簡(jiǎn)練流暢、示例翔實(shí),在準(zhǔn)確講解概念的基礎(chǔ)上力求通俗易懂,大量引入實(shí)例,分析程序設(shè)計(jì)思路,旨在培養(yǎng)學(xué)生的實(shí)踐動(dòng)手能力。每章均配有豐富的例題和習(xí)題,并附有參考答案。本書既可作為普通高校非計(jì)算機(jī)專業(yè)計(jì)算機(jī)公共課的教材,也可作為學(xué)習(xí)C語言程序設(shè)計(jì)的自學(xué)用書。
本書以Visual C++ 6.0為開發(fā)平臺(tái),全面介紹了C語言的基礎(chǔ)知識(shí)、程序結(jié)構(gòu)及程序編寫技巧。全書共分為12章,包括引言、C語言基礎(chǔ)知識(shí)、順序結(jié)構(gòu)程序設(shè)計(jì)、選擇結(jié)構(gòu)程序設(shè)計(jì)、循環(huán)結(jié)構(gòu)程序設(shè)計(jì)、函數(shù)、預(yù)處理、數(shù)組、指針、結(jié)構(gòu)體與共用體、文件、位運(yùn)算。本書內(nèi)容豐富、結(jié)構(gòu)合理、思路清晰、語言簡(jiǎn)練流暢、示例翔實(shí),在準(zhǔn)確講解概念的基礎(chǔ)上力求通俗易懂,大量引入實(shí)例,分析程序設(shè)計(jì)思路,旨在培養(yǎng)學(xué)生的實(shí)踐動(dòng)手能力。每章均配有豐富的例題和習(xí)題,并附有參考答案。本書既可作為普通高校非計(jì)算機(jī)專業(yè)計(jì)算機(jī)公共課的教材,也可作為學(xué)習(xí)C語言程序設(shè)計(jì)的自學(xué)用書。
“C語言程序設(shè)計(jì)”是高校計(jì)算機(jī)專業(yè)和理工科專業(yè)重要的公共基礎(chǔ)課程之一。C語言的功能強(qiáng)大,使用靈活方便,移植性強(qiáng),兼有高級(jí)語言和低級(jí)語言的特點(diǎn),利用C語言可以編寫系統(tǒng)軟件和應(yīng)用軟件。
作者根據(jù)多年的教學(xué)經(jīng)驗(yàn),結(jié)合高校非計(jì)算機(jī)專業(yè)計(jì)算機(jī)基礎(chǔ)教學(xué)的最新大綱,在分析國(guó)內(nèi)外多種同類教材的基礎(chǔ)上,編寫了本書。本書力求通過理論聯(lián)系實(shí)際,采用計(jì)算思維的方法,引導(dǎo)和啟發(fā)學(xué)生掌握思考和解決問題的方法,達(dá)到舉一反三的目的。 本書共分12章,主要內(nèi)容如下: 第1章主要介紹C語言的發(fā)展過程及特點(diǎn)、C語言的結(jié)構(gòu)特點(diǎn)、C語言程序的執(zhí)行過程。 第2章主要介紹C語言的數(shù)據(jù)類型、標(biāo)識(shí)符、常量和變量、運(yùn)算符和表達(dá)式等內(nèi)容。 第3章主要介紹算法的基本概念、C語言的基本語句、數(shù)據(jù)的輸入和輸出等內(nèi)容。 第4章主要介紹if結(jié)構(gòu)、if…else結(jié)構(gòu)、if語句的嵌套、switch語句。 第5章主要介紹while語句、do…while語句、for語句、循環(huán)的嵌套、break和continue語句在循環(huán)結(jié)構(gòu)中的應(yīng)用等內(nèi)容。 第6章主要介紹函數(shù)的基本概念、變量的作用域和存儲(chǔ)類型、內(nèi)部函數(shù)和外部函數(shù)、函數(shù)的遞歸調(diào)用等內(nèi)容。 第7章主要介紹宏定義、文件包含、條件編譯等內(nèi)容。 第8章主要介紹數(shù)組概述、一維數(shù)組、二維數(shù)組、字符數(shù)組與字符串等內(nèi)容。 第9章主要介紹指針概述、指針變量與簡(jiǎn)單變量的關(guān)系、指針與數(shù)組、指針作為函數(shù)的參數(shù)、函數(shù)的返回值為指針、指向指針的指針等內(nèi)容。 第10章主要介紹結(jié)構(gòu)體類型、結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體變量與函數(shù)、共用體數(shù)據(jù)類、枚舉數(shù)據(jù)類型、鏈表的概念等內(nèi)容。 第11章主要介紹C文件的基本概念和分類、文件的基本操作、文件的定位、出錯(cuò)的檢測(cè)等內(nèi)容。 第12章主要介紹位的取反運(yùn)算、左移運(yùn)算、右移運(yùn)算、與運(yùn)算、或運(yùn)算、異運(yùn)算、復(fù)合位運(yùn)算等內(nèi)容。此章為選講章節(jié)。 本書內(nèi)容豐富、結(jié)構(gòu)合理、思路清晰、語言簡(jiǎn)練流暢,書中所有示例都已在Visual C++ 6.0 環(huán)境下調(diào)試并運(yùn)行通過。為了幫助讀者更好地掌握C語言,每章末尾都安排了類型豐富的習(xí)題,并且隨書提供了自主開發(fā)的“C語言輔導(dǎo)學(xué)習(xí)系統(tǒng)”軟件。輔導(dǎo)學(xué)習(xí)系統(tǒng)中有“學(xué)習(xí)指導(dǎo)”、“單元練習(xí)”、“綜合練習(xí)”以及“經(jīng)典算法”等模塊,緊密結(jié)合教學(xué)內(nèi)容,已應(yīng)用于教學(xué)實(shí)踐多年,深受師生好評(píng)。讀者依據(jù)本書循序漸進(jìn)地學(xué)習(xí),可以鞏固基本知識(shí)、培養(yǎng)實(shí)踐能力、增強(qiáng)對(duì)基本概念的理解和解決實(shí)際問題的能力,能夠比較容易地掌握C語言的主要用法。 本書獲內(nèi)蒙古科技大學(xué)教材建設(shè)項(xiàng)目資助,由內(nèi)蒙古科技大學(xué)計(jì)算機(jī)教學(xué)基地的教師編寫,由黃迎久、龐潤(rùn)芳任主編,徐揚(yáng)、賈茹、趙軍富、胡曉燕任副主編。第1章和第2章由黃迎久編寫;第3章、第4章和前言由徐揚(yáng)編寫;第5章和第11章由龐潤(rùn)芳編寫;第6章、第7章和第12章由賈茹編寫;第8章和附錄由趙軍富編寫;第9章和第10章由胡曉燕編寫。全書由黃迎久負(fù)責(zé)統(tǒng)稿。 由于作者水平有限,書中的疏漏和瑕疵在所難免,歡迎廣大讀者批評(píng)指正。 編 者
第1章 引言1
1.1 C語言的發(fā)展過程及特點(diǎn)2 1.1.1 C語言的發(fā)展過程2 1.1.2 C語言的特點(diǎn)2 1.2 簡(jiǎn)單的C語言程序3 1.3 C語言程序的結(jié)構(gòu)5 1.4 C語言程序的執(zhí)行6 1.4.1 編譯源程序6 1.4.2 鏈接目標(biāo)程序6 1.4.3 C語言開發(fā)工具簡(jiǎn)介7 本章小結(jié)12 習(xí)題13 第2章 C語言基礎(chǔ)知識(shí)15 2.1 C語言的數(shù)據(jù)類型16 2.1.1 整型數(shù)據(jù)16 2.1.2 浮點(diǎn)型數(shù)據(jù)18 2.1.3 字符型數(shù)據(jù)19 2.2 標(biāo)識(shí)符、常量和變量20 2.2.1 標(biāo)識(shí)符20 2.2.2 常量21 2.2.3 變量23 2.3 運(yùn)算符與表達(dá)式24 2.3.1 概述24 2.3.2 算術(shù)運(yùn)算符及算術(shù)表達(dá)式25 2.3.3 賦值運(yùn)算符及賦值表達(dá)式26 2.3.4 自增、自減運(yùn)算符27 2.3.5 關(guān)系運(yùn)算符及關(guān)系表達(dá)式28 2.3.6 邏輯運(yùn)算符及邏輯表達(dá)式29 2.3.7 位運(yùn)算符及位運(yùn)算30 2.3.8 條件運(yùn)算符及條件表達(dá)式31 2.3.9 逗號(hào)運(yùn)算符及逗號(hào)表達(dá)式32 2.3.10 數(shù)據(jù)類型的轉(zhuǎn)換32 2.4 小型實(shí)訓(xùn)案例33 本章小結(jié)34 習(xí)題34 第3章 順序結(jié)構(gòu)程序設(shè)計(jì)37 3.1 算法38 3.1.1 算法的概念38 3.1.2 算法的表示39 3.2 結(jié)構(gòu)化程序設(shè)計(jì)的三種基本結(jié)構(gòu)40 3.3 C語言的基本語句40 3.4 數(shù)據(jù)的輸入/輸出42 3.4.1 格式輸出函數(shù)printf( )42 3.4.2 格式輸入函數(shù)scanf( )43 3.4.3 格式字符44 3.4.4 字符輸入/輸出函數(shù)47 3.5 程序應(yīng)用實(shí)例48 3.6 小型實(shí)訓(xùn)案例50 本章小結(jié)51 習(xí)題51 第4章 選擇結(jié)構(gòu)程序設(shè)計(jì)55 4.1 if結(jié)構(gòu)56 4.1.1 if語句56 4.1.2 if…else語句57 4.1.3 if語句的嵌套58 4.2 switch語句60 4.2.1 switch語句的一般格式60 4.2.2 break語句在switch語句中 的應(yīng)用62 4.3 程序應(yīng)用實(shí)例63 4.4 小型實(shí)訓(xùn)案例65 本章小結(jié)66 習(xí)題66 第5章 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)71 5.1 概述72 5.2 while語句72 5.3 do…while語句76 5.4 for語句77 5.5 循環(huán)的嵌套79 5.6 break語句與continue語句80 5.6.1 break語句80 5.6.2 continue語句81 5.6.3 break語句與continue的 比較83 5.7 幾種循環(huán)的比較83 5.8 程序應(yīng)用實(shí)例83 5.9 小型實(shí)訓(xùn)案例89 本章小結(jié)90 習(xí)題90 第6章 函數(shù)95 6.1 函數(shù)概述96 6.1.1 函數(shù)的定義97 6.1.2 函數(shù)的聲明和調(diào)用100 6.1.3 函數(shù)的參數(shù)傳遞105 6.2 變量的作用域和存儲(chǔ)類型107 6.2.1 變量的作用域108 6.2.2 變量的存儲(chǔ)類型110 6.3 內(nèi)部函數(shù)與外部函數(shù)114 6.4 函數(shù)的遞歸調(diào)用116 6.5 程序應(yīng)用實(shí)例117 6.6 小型實(shí)訓(xùn)案例119 本章小結(jié)120 習(xí)題121 第7章 預(yù)處理127 7.1 宏定義128 7.2 文件包含130 7.3 條件編譯131 本章小結(jié)133 習(xí)題133 第8章 數(shù)組137 8.1 概述138 8.2 一維數(shù)組139 8.2.1 一維數(shù)組的定義139 8.2.2 一維數(shù)組的初始化140 8.2.3 一維數(shù)組元素的引用140 8.2.4 一維數(shù)組的應(yīng)用142 8.3 二維數(shù)組147 8.3.1 二維數(shù)組的定義147 8.3.2 二維數(shù)組的初始化148 8.3.3 二維數(shù)組的引用149 8.3.4 二維數(shù)組的應(yīng)用149 8.4 字符數(shù)組與字符串152 8.4.1 字符數(shù)組152 8.4.2 字符串153 8.4.3 字符串處理函數(shù)155 8.4.4 字符數(shù)組的應(yīng)用159 8.5 數(shù)組作函數(shù)參數(shù)160 8.5.1 數(shù)組元素作函數(shù)實(shí)參160 8.5.2 數(shù)組名作函數(shù)實(shí)參161 8.6 小型實(shí)訓(xùn)案例162 本章小結(jié)163 習(xí)題164 第9章 指針171 9.1 指針概述172 9.1.1 指針變量的定義172 9.1.2 指針變量的初始化173 9.1.3 指針變量的引用174 9.1.4 指針的運(yùn)算174 9.2 指針變量與簡(jiǎn)單變量的關(guān)系175 9.3 指針與數(shù)組177 9.3.1 指向一維數(shù)組的指針177 9.3.2 指向多維數(shù)組的指針178 9.3.3 字符指針182 9.3.4 指針數(shù)組185 9.4 指針作為函數(shù)的參數(shù)186 9.5 函數(shù)的返回值為指針188 9.6 指向函數(shù)的指針189 9.6.1 指向函數(shù)的指針變量定義189 9.6.2 函數(shù)指針變量的使用190 9.7 指向指針的指針191 9.8 程序應(yīng)用實(shí)例192 9.9 小型實(shí)訓(xùn)案例194 本章小結(jié)195 習(xí)題196 第10章 結(jié)構(gòu)體與共用體201 10.1 結(jié)構(gòu)體類型202 10.1.1 結(jié)構(gòu)體的概念202 10.1.2 結(jié)構(gòu)體類型的定義202 10.1.3 結(jié)構(gòu)體變量的定義204 10.1.4 結(jié)構(gòu)體變量的初始化205 10.1.5 結(jié)構(gòu)體變量成員的引用206 10.2 結(jié)構(gòu)體數(shù)組208 10.2.1 結(jié)構(gòu)體數(shù)組的定義208 10.2.2 結(jié)構(gòu)體數(shù)組的初始化208 10.2.3 結(jié)構(gòu)體數(shù)組的引用209 10.3 結(jié)構(gòu)體變量與函數(shù)210 10.4 共用體數(shù)據(jù)類型212 10.4.1 共用體類型的聲明212 10.4.2 共用體變量的定義、 初始化及引用213 10.5 枚舉數(shù)據(jù)類型215 10.5.1 枚舉類型的定義215 10.5.2 枚舉變量的定義215 10.5.3 有關(guān)枚舉型數(shù)據(jù)的操作216 10.6 鏈表的概念216 10.6.1 動(dòng)態(tài)分配內(nèi)存217 10.6.2 單鏈表的建立218 10.6.3 從單鏈表中刪除節(jié)點(diǎn)220 10.6.4 向鏈表中插入節(jié)點(diǎn)220 10.7 小型實(shí)訓(xùn)案例222 本章小結(jié)223 習(xí)題223 第11章 文件229 11.1 C語言文件的基本概念與分類230 11.1.1 文件的基本概念230 11.1.2 文件的分類230 11.2 文件的基本操作231 11.2.1 文件類型指針231 11.2.2 打開文件函數(shù)fopen( )232 11.2.3 關(guān)閉文件函數(shù)fclose( )233 11.3 文件的讀寫233 11.3.1 字符讀/寫函數(shù)234 11.3.2 字符串讀/寫函數(shù)237 11.3.3 數(shù)據(jù)塊讀/寫函數(shù)237 11.3.4 格式化讀/寫函數(shù)238 11.4 文件的定位239 11.4.1 rewind()函數(shù)239 11.4.2 fseek()函數(shù)239 11.4.3 ftell()函數(shù)240 11.5 出錯(cuò)的檢測(cè)241 11.6 小型實(shí)訓(xùn)案例242 本章小結(jié)243 習(xí)題243 第12章 位運(yùn)算247 12.1 按位取反運(yùn)算248 12.2 按位左移運(yùn)算249 12.3 按位右移運(yùn)算249 12.4 按位與運(yùn)算250 12.5 按位或運(yùn)算251 12.6 按位異或運(yùn)算252 12.7 復(fù)合位運(yùn)算符253 本章小結(jié)254 習(xí)題254 附錄A C語言的關(guān)鍵字257 附錄B ASCII碼表259 附錄C 常用庫函數(shù)260 附錄D C運(yùn)算符的優(yōu)先級(jí)與結(jié)合性267
第2章 C語言基礎(chǔ)知識(shí)
【本章要點(diǎn)】 * C語言的基本數(shù)據(jù)類型 * C語言的標(biāo)識(shí)符、變量和常量 * C語言程序的運(yùn)算符與表達(dá)式 【學(xué)習(xí)目標(biāo)】 * 掌握C語言的基本數(shù)據(jù)類型的特點(diǎn)及應(yīng)用 * 掌握C語言的標(biāo)識(shí)符、常量和變量的基本知識(shí)及應(yīng)用 * 掌握C語言的各種運(yùn)算符及表達(dá)式的應(yīng)用 2.1 C語言的數(shù)據(jù)類型 數(shù)據(jù)類型是數(shù)據(jù)的基本屬性,描述的是數(shù)據(jù)的存儲(chǔ)格式和運(yùn)算規(guī)則。不同類型的數(shù)據(jù)在內(nèi)存中所需存儲(chǔ)空間的大小是不同的,能夠支持的運(yùn)算、相應(yīng)的運(yùn)算規(guī)則也不同,因而在學(xué)習(xí)C程序時(shí)必須準(zhǔn)確地掌握和運(yùn)用數(shù)據(jù)的數(shù)據(jù)類型。 C語言的數(shù)據(jù)類型分類如圖2-1所示。 圖2-1 C語言的數(shù)據(jù)類型 2.1.1 整型數(shù)據(jù) 1. 基本概念 整型數(shù)據(jù)就是整數(shù),整數(shù)又分為兩大類:有符號(hào)型和無符號(hào)型。有符號(hào)的整數(shù)既可以是正數(shù),也可以是負(fù)數(shù);不帶符號(hào)位(只包含0和正數(shù))的整數(shù)為無符號(hào)整數(shù)。 整型(int)數(shù)據(jù)類型可以用4種修飾符的搭配來描述:signed(有符號(hào))、unsigned(無符號(hào))、long(長(zhǎng)型)和short(短型)。 Visual C++ 6.0環(huán)境下整型數(shù)據(jù)的長(zhǎng)度及取值范圍如表2-1所示。 表2-1 整型數(shù)據(jù)的長(zhǎng)度及取值范圍 數(shù)據(jù)類型 占用字節(jié) 取值范圍 整型(int) 4 -2147483648~2147483647 有符號(hào)整型(signed int) 4 -2147483648~2147483647 無符號(hào)整型(unsigned int) 4 0~4294967295 短整型(short int) 2 -768~767 有符號(hào)短整型(signed short int) 2 -768~767 無符號(hào)短整型(unsigned short int) 2 0~65535 長(zhǎng)整型(long int) 4 -2147483648~2147483647 有符號(hào)長(zhǎng)整型(signed long int) 4 -2147483648~2147483647 無符號(hào)長(zhǎng)整型(unsigned long int) 4 0~4294967295 在C語言中,對(duì)整型數(shù)據(jù)類型的說明可以使用簡(jiǎn)寫方式,如表2-2所示。 表2-2 整型數(shù)據(jù)的簡(jiǎn)寫方式 完整方式 簡(jiǎn)寫方式 short int、signed short int short signed int int long int、signed long int long unsigned short int unsigned short unsigned int unsigned unsigned long int unsigned long 2. 整型數(shù)據(jù)的二進(jìn)制表示 對(duì)于整型數(shù)據(jù),其數(shù)值是以補(bǔ)碼的形式存儲(chǔ)的。正數(shù)的補(bǔ)碼與其二進(jìn)制原碼相同。例如整數(shù)23,其二進(jìn)制形式的存儲(chǔ)結(jié)構(gòu)如圖2-2所示。(在Visual C++ 6.0環(huán)境下,整型數(shù)據(jù)占4個(gè)字節(jié)的存儲(chǔ)單元,每個(gè)字節(jié)含8個(gè)位。) 圖2-2 整數(shù)23的存儲(chǔ)結(jié)構(gòu) 若為負(fù)整數(shù),將該數(shù)絕對(duì)值的二進(jìn)制形式按位取反再加1便可得到該數(shù)的補(bǔ)碼。 例如,求-23的補(bǔ)碼的步驟如下。 第一步,求出23的二進(jìn)制形式:00000000 00000000 00000000 00010111 第二步,按位取反:11111111 11111111 11111111 11101000 第三步,再加1:11111111 11111111 11111111 11101001 2.1.2 浮點(diǎn)型數(shù)據(jù) 1. 基本概念 在計(jì)算機(jī)的運(yùn)算過程中,整型數(shù)據(jù)并不能適用于所有的應(yīng)用,有時(shí)也需要存儲(chǔ)帶小數(shù)的數(shù),這類數(shù)可以用浮點(diǎn)型數(shù)據(jù)(即浮點(diǎn)數(shù))來表示。 浮點(diǎn)數(shù)的小數(shù)點(diǎn)位置是不固定的,可以浮動(dòng)。C語言提供了三種不同的浮點(diǎn)格式。 * float:?jiǎn)尉雀↑c(diǎn)數(shù)。 * double:雙精度浮點(diǎn)數(shù)。 * long double:長(zhǎng)雙精度浮點(diǎn)數(shù)。 當(dāng)精度要求不嚴(yán)格時(shí),比如某人的工資,需要保留兩位小數(shù),float類型就是很恰當(dāng)?shù)念愋。double類型提供更高的精度,對(duì)于絕大多數(shù)用戶來說已經(jīng)足夠用了。long double類型支持極高精度的要求,但很少會(huì)用到。 2. 浮點(diǎn)型數(shù)據(jù)的二進(jìn)制表示 浮點(diǎn)型數(shù)據(jù)與整型數(shù)據(jù)的存儲(chǔ)方式不同,浮點(diǎn)型數(shù)據(jù)是按照指數(shù)形式存儲(chǔ)的。例如浮點(diǎn)數(shù)58.625 的指數(shù)形式為58.625=5.8625×101。其中,5.8625稱為尾數(shù),10的冪次1稱為指數(shù)。 計(jì)算機(jī)在存儲(chǔ)浮點(diǎn)數(shù)的時(shí)候,也要將十進(jìn)制數(shù)轉(zhuǎn)化為二進(jìn)制數(shù)來表示,轉(zhuǎn)化方法是將浮點(diǎn)數(shù)分為整數(shù)部分和純小數(shù)部分,再將整數(shù)部分和純小數(shù)部分分別轉(zhuǎn)化為二進(jìn)制數(shù)。 浮點(diǎn)數(shù)的存儲(chǔ)結(jié)構(gòu)如圖2-3所示,分為3個(gè)部分:符號(hào)位、指數(shù)位和尾數(shù)。符號(hào)位表示數(shù)值的正負(fù);指數(shù)位用于計(jì)算階碼,代表2的冪次;尾數(shù)位為有效小數(shù)位數(shù)。尾數(shù)部分占的位數(shù)越多,浮點(diǎn)數(shù)的有效位越多;指數(shù)部分占的位數(shù)越多,表示數(shù)的范圍就越大。 圖2-3 浮點(diǎn)數(shù)的存儲(chǔ)結(jié)構(gòu) 例如,浮點(diǎn)數(shù)58.625的二進(jìn)制存儲(chǔ)格式如圖2-4所示。 圖2-4 浮點(diǎn)數(shù)58.625的二進(jìn)制存儲(chǔ)格式 提示: * 對(duì)于float類型的浮點(diǎn)數(shù),指數(shù)位占8位,尾數(shù)位占23位。 * 對(duì)于double類型的浮點(diǎn)數(shù),指數(shù)位占11位,尾數(shù)位占52位。 3. 浮點(diǎn)型數(shù)據(jù)的長(zhǎng)度與取值范圍 單精度浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)由于指數(shù)和尾數(shù)的位數(shù)不同,它們的取值范圍也有所不同。浮點(diǎn)型數(shù)據(jù)的長(zhǎng)度及取值范圍如表2-3所示。 表2-3 浮點(diǎn)型數(shù)據(jù)的長(zhǎng)度及取值范圍 類 型 說 明 占用字節(jié) 有效位 取值范圍 float 單精度浮點(diǎn)型 4 6~7 -3.4×10-38~3.4×1038 double 雙精度浮點(diǎn)型 8 15~16 -1.7×10-308~1.7×10308 long double 長(zhǎng)雙精度浮點(diǎn)型 16 18~19 -1.2×10-49~1.2×1049 【實(shí)例2-1】 C語言浮點(diǎn)數(shù)精度示例。 #include<stdio.h> void main() { float x; /* x為單精度類型變量 */ double y;/* y為雙精度類型變量 */ x=123456789.1234;/* 賦予x值 */ y=123456789.1234;/* 賦予y值 */ printf("x=%f\n",x);/* 輸出x的值 */ printf("y=%f\n",y);/* 輸出y的值 */ } 運(yùn)行結(jié)果如圖2-5所示。 圖2-5 實(shí)例2-1的運(yùn)行結(jié)果 從程序的運(yùn)行結(jié)果來看,x顯示的結(jié)果并不等于賦予它的值,而y顯示的結(jié)果等于賦予它的值,說明float(單精度類型)數(shù)據(jù)只能保證前7位是精確的,double(雙精度類型)數(shù)據(jù)的精度可以為15~16位。 2.1.3 字符型數(shù)據(jù) 在C語言中,一個(gè)字符型數(shù)據(jù)在計(jì)算機(jī)的內(nèi)存中占據(jù)一個(gè)字節(jié)的存儲(chǔ)空間,但計(jì)算機(jī)并不是將字符本身存儲(chǔ)到存儲(chǔ)單元中(存儲(chǔ)單元只能存儲(chǔ)二進(jìn)制編碼),而是將字符所對(duì)應(yīng)的ASCII碼值轉(zhuǎn)換為二進(jìn)制的形式存儲(chǔ)到相應(yīng)的存儲(chǔ)單元中。如大寫字母A的ASCII碼值為65,因此,大寫字母A在存儲(chǔ)單元中的存儲(chǔ)形式實(shí)際為整數(shù)65的二進(jìn)制存儲(chǔ)形式,如圖2-6所示。 提示:C語言是將字符常量當(dāng)作整數(shù)來進(jìn)行處理的。字符常量與其對(duì)應(yīng)的ASCII碼值可以相互替代。字符型數(shù)據(jù)可以用字符形式輸出,也可以用整數(shù)形式輸出。字符型數(shù)據(jù)還可以作為整數(shù)參加運(yùn)算。例如: 'A'+10 相當(dāng)于65+10,結(jié)果為75。 通過這種關(guān)系,可以進(jìn)行大小寫字母之間的轉(zhuǎn)換運(yùn)算,大寫字母的ASCII碼值加上就是其對(duì)應(yīng)的小寫字母的ASCII碼值,即大寫字母=小寫字母-。 【實(shí)例2-2】 將大寫字母轉(zhuǎn)換為小寫字母并顯示在屏幕上。 #include<stdio.h> void main() { char ch1,ch2; ch1='M'; ch2=ch1+; printf("ch2=%c\n",ch2); } 程序運(yùn)行結(jié)果: ch2=m 2.2 標(biāo)識(shí)符、常量和變量 2.2.1 標(biāo)識(shí)符 在編寫程序時(shí),需要對(duì)變量、函數(shù)、宏或其他實(shí)體進(jìn)行命名,這些名字稱為“標(biāo)識(shí)符”。標(biāo)識(shí)符只可以使用字母、數(shù)字和下劃線,而且必須以字母或下劃線開頭。標(biāo)識(shí)符的長(zhǎng)度可以是一個(gè)或多個(gè)字符,最長(zhǎng)不允許超過個(gè)字符。 下面是正確的用戶標(biāo)識(shí)符: name、abc12、person_name 下面是不合法的用戶標(biāo)識(shí)符: 2piece不能以數(shù)字開頭 score/student含有既非字母又非數(shù)字的字符 a value含有空格 int與關(guān)鍵字同名 C語言中的標(biāo)識(shí)符區(qū)分大小寫,因此,sum、Sum和SUM分別代表三個(gè)不同的標(biāo)識(shí)符。用戶在編程過程中要特別注意的是:標(biāo)識(shí)符不能和C語言系統(tǒng)中的關(guān)鍵字相同(關(guān)鍵字是C語言系統(tǒng)規(guī)定的具有特定意義的標(biāo)識(shí)符,見附錄A),也不能和用戶自定義的函數(shù)或C語言庫函數(shù)同名。 2.2.2 常量 常量是在程序運(yùn)行過程中,其值不發(fā)生變化的量。在C語言中,常量分為符號(hào)常量和直接常量。 1. 符號(hào)常量 符號(hào)常量是指用一個(gè)標(biāo)識(shí)符表示的常量。符號(hào)常量在使用前必須定義,定義的形式如下: #define <標(biāo)識(shí)符> <常量> 在這里,#define是C語言的預(yù)處理命令。在編輯C語言源程序時(shí),可以直接使用已定義的符號(hào)常量,編譯時(shí)會(huì)對(duì)程序中出現(xiàn)的符號(hào)常量進(jìn)行替換。 【實(shí)例2-3】 了解符號(hào)常量的用法。 #include<stdio.h> #define PI 3.1416 void main() { int r=10; float area; area=PI*r*r; printf("area=%f\n",area); } 程序運(yùn)行結(jié)果: area=314.160000 提示:定義符號(hào)常量的目的是為了提高程序的可讀性,方便程序的調(diào)試和修改,因此在定義符號(hào)常量時(shí),應(yīng)盡可能地表達(dá)它所代表的含義,如前面定義的PI就是代表圓周率3.1416。 2. 直接常量 直接常量是指直接用數(shù)值表示的量,如24、3.14、‘T’、“string”等。直接常量分為整型常量、實(shí)型常量、字符常量、字符串常量、枚舉常量等不同類型的常量。 1) 整型常量 可以采用十進(jìn)制、八進(jìn)制、十六進(jìn)制來表示一個(gè)整型常量。 * 十進(jìn)制:包含0~9中的數(shù)字,但是一定不能以0開頭,如15、-255。 * 八進(jìn)制:只包含0~7中的數(shù)字,必須以0開頭,如017(十進(jìn)制的15)、0377(十進(jìn)制的255)。 * 十六進(jìn)制:包含0~9中的數(shù)字和a~f中的字母,以0x或0X開頭,如0xf(十進(jìn)制的15)、0xff(十進(jìn)制的-1)、0x7f(十進(jìn)制的127)。 表2-4為整型常量在不同進(jìn)制下的表示方法。 表2-4 整型常量的表示方法 整型常量 進(jìn) 制 對(duì)應(yīng)的十進(jìn)制數(shù)值 17 十進(jìn)制 17 017 八進(jìn)制 15 0x17 十六進(jìn)制 23 17L或17l 十進(jìn)制 17 17LU或17lu 十進(jìn)制 17 提示:可以在十進(jìn)制整型常量后面添加“l(fā)”或“u”(“l(fā)”和“u”不區(qū)分大小寫)來修飾整型常量。若添加“l(fā)”(或“L”)則表示該整型常量為“長(zhǎng)整型”,如“17l”;若添加“u”(或“U”)則表示該整型常量為“無符號(hào)型”,如“17u”;若添加“l(fā)u”(或“LU”)則表示該整型常量為“無符號(hào)長(zhǎng)整型”,如“17lu”。 2) 實(shí)型常量 實(shí)型常量常用浮點(diǎn)計(jì)數(shù)法或科學(xué)計(jì)數(shù)法兩種方法表示,如231.46、7.36E-7。 科學(xué)計(jì)數(shù)法要求字母e(或E)的兩端必須都有數(shù)字,而且右側(cè)必須為整數(shù)。如下列科學(xué)計(jì)數(shù)法均是錯(cuò)誤的:e3、2.1e3.2、e。 3) 字符常量 字符常量是由一對(duì)單引號(hào)括起來的單個(gè)字符,如‘A’、‘9’、‘$’等均為字符常量。在這里,單引號(hào)只起定界作用,不代表字符。在C語言中,一個(gè)字符占用一個(gè)字節(jié)的存儲(chǔ)空間,字符在ASCII表中按照其對(duì)應(yīng)的ASCII碼值依次排列。ASCII表詳見附錄B。 除了能直接表示和在屏幕上顯示的字符外,還有一些字符是不能顯示、用來表示不可打印的控制字符和特定功能的字符。如實(shí)例2-1中的“printf(“x=%f \n”,x);”,其中的“\n”就是一個(gè)這樣的控制字符。這種字符稱為“轉(zhuǎn)義字符”。轉(zhuǎn)義字符用反斜杠( \ )后面跟一個(gè)字符或者一個(gè)八進(jìn)制或十六進(jìn)制數(shù)表示。表2-5所示為C語言中常用的轉(zhuǎn)義字符。 表2-5 轉(zhuǎn)義字符 轉(zhuǎn)義字符 意 義 ASCII碼值 \n 換行 10 \t 水平制表符 9 \b 退1格 8 \r 回到本行的開始 13 \f 換頁 12 \\ 反斜杠 92 \' 單引號(hào)字符 39續(xù)表 轉(zhuǎn)義字符 意 義 ASCII碼值 \" 雙引號(hào)字符 34 \0 空字符 0 \ddd 1~3位八進(jìn)制數(shù)所代表的字符 \xhh 1~2位十六進(jìn)制數(shù)所代表的字符 提示: * 字符碼ddd表示1~3位八進(jìn)制數(shù)字,可以不用前綴0。如‘\101’代表ASCII值為八進(jìn)制數(shù)101的字符,八進(jìn)制數(shù)101相當(dāng)于十進(jìn)制數(shù)65,ASCII值為65的字符是大寫字母‘A’。 * 字符碼hh表示1~2位十六進(jìn)制數(shù)字,不能忽略前綴x。如‘\x47’代表ASCII值為十六進(jìn)制數(shù)47的字符,十六進(jìn)制數(shù)47相當(dāng)于十進(jìn)制數(shù)71,ASCII值為71的字符是大寫字母‘G’。 * 單引號(hào)和反斜杠必須用轉(zhuǎn)義字符表示。 4) 字符串常量 字符串常量是由一對(duì)雙引號(hào)括起來的字符序列。如“China”、“a”、“123”等都是字符串常量。雙引號(hào)之間沒有任何字符的字符串常量稱為空字符串。 在C語言中,系統(tǒng)會(huì)自動(dòng)在字符串常量的尾端加入一個(gè)字符‘\0’作為字符串的結(jié)束標(biāo)記,因此,長(zhǎng)度為n個(gè)字符的字符串常量,在內(nèi)存中占用n+1個(gè)字節(jié)的存儲(chǔ)空間。 例如,字符串常量china有5個(gè)字符,則其存儲(chǔ)空間為6個(gè)字節(jié),其存儲(chǔ)形式如圖2-7所示。 圖2-7 字符串常量“china”的存儲(chǔ)形式 在C語言中,處理字符串問題時(shí)經(jīng)常要用到數(shù)組或指針,這部分內(nèi)容將在后續(xù)章節(jié)中講述。 注意:不要混淆字符常量與字符串常量。字符常量是由一對(duì)單引號(hào)括起來的單個(gè)字符,占1個(gè)字節(jié)的存儲(chǔ)空間,如‘s’、‘\101’等;而字符串常量是由一對(duì)雙引號(hào)括起來的字符序列,如“china”,占6個(gè)字節(jié)的存儲(chǔ)空間,其中最后一個(gè)字節(jié)用來存放字符‘\0’。 2.2.3 變量 1. 變量的定義 變量是指在程序運(yùn)行過程中其值可以改變的量。在程序定義變量時(shí),編譯系統(tǒng)就會(huì)給它分配相應(yīng)的存儲(chǔ)單元,用來存儲(chǔ)數(shù)據(jù),變量的名稱就是該存儲(chǔ)單元的符號(hào)地址。 在使用變量之前必須對(duì)其進(jìn)行聲明,為了聲明變量,首先要指定變量的類型,然后說明變量的名字。聲明變量的格式如下: 類型名 變量名表; 提示: * 類型名:必須是有效的C語言數(shù)據(jù)類型,如int、float、double、char等。 * 變量名表:可以是相同類型的若干個(gè)變量名,變量名之間用逗號(hào)隔開。 例如: int number; /*number為整型變量*/ float score, avg ; /*score、avg為單精度實(shí)型變量*/ 通常,變量定義的語句放在函數(shù)的開頭,也可以放在函數(shù)的外部或復(fù)合語句的開頭。 2. 變量的初始化 在程序中為變量賦值的時(shí)候,編譯系統(tǒng)就會(huì)根據(jù)變量名稱找到其對(duì)應(yīng)的存儲(chǔ)單元的地址,將所賦的值存放進(jìn)去。 C語言允許在定義變量的同時(shí)對(duì)變量進(jìn)行初始化。一般形式如下: <類型名> <變量名>=<表達(dá)式>, … ; 例如: int a=3 ;/*定義a為整型變量,初值為3*/ float pi=3.1416,score;/*定義pi、score為單精度實(shí)型變量,pi的初值為3.1416*/ char ch='t' ;/*定義ch為字符型變量,初值為't'*/ 也可以對(duì)定義的變量的一部分賦初值。例如: int length, width=10, area ; 表示定義length、width和area為整型變量,并且對(duì)width賦初值10。 若要對(duì)幾個(gè)變量賦同樣的值,每個(gè)變量應(yīng)分別賦初值,如寫成以下形式: int a=10, b=10, c=10; 而絕不能寫成如下形式: int a=b=c=10; 2.3 運(yùn)算符與表達(dá)式 C語言提供了豐富的運(yùn)算符,除流程控制語句與輸入/輸出操作之外的絕大多數(shù)基本操作都是由運(yùn)算符來處理的。 2.3.1 概述 1. 運(yùn)算符的分類 1) 按運(yùn)算符操作對(duì)象的數(shù)量分類 運(yùn)算符能連接運(yùn)算對(duì)象的個(gè)數(shù)稱為運(yùn)算符的目。C語言中運(yùn)算符的目有如下三種。 * 單目運(yùn)算符:只能連接一個(gè)運(yùn)算對(duì)象,如++、--、&等。 * 雙目運(yùn)算符:可以連接兩個(gè)運(yùn)算對(duì)象,如+、-等。C語言中的運(yùn)算符大多數(shù)屬于雙目運(yùn)算符。 * 三目運(yùn)算符:可以連接三個(gè)運(yùn)算對(duì)象。C語言中只有一個(gè)三目運(yùn)算符,即條件運(yùn)算符。 2) 按運(yùn)算符的性質(zhì)分類 C語言的運(yùn)算符極其豐富,根據(jù)運(yùn)算符的性質(zhì)分類,可分為算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、賦值運(yùn)算符、條件運(yùn)算符、逗號(hào)運(yùn)算符、求字節(jié)數(shù)運(yùn)算符和位運(yùn)算符等。 2. 運(yùn)算符的優(yōu)先級(jí)和結(jié)合方向 優(yōu)先級(jí)是指在使用不同的運(yùn)算對(duì)象進(jìn)行計(jì)算時(shí)的先后次序。比如在算術(shù)運(yùn)算符中,乘、除運(yùn)算符的優(yōu)先級(jí)要高于加、減運(yùn)算符的優(yōu)先級(jí)。C運(yùn)算符的優(yōu)先級(jí)共分為15級(jí),1級(jí)最高,15級(jí)最低。當(dāng)一個(gè)表達(dá)式中出現(xiàn)不同類型的運(yùn)算符時(shí),首先按照它們的優(yōu)先級(jí)順序進(jìn)行運(yùn)算,即先對(duì)優(yōu)先級(jí)高的運(yùn)算符進(jìn)行計(jì)算,再對(duì)優(yōu)先級(jí)低的運(yùn)算符進(jìn)行計(jì)算。當(dāng)兩類運(yùn)算符的優(yōu)先級(jí)相同時(shí),則要按照運(yùn)算符的結(jié)合性確定運(yùn)算順序。圓括號(hào)的優(yōu)先級(jí)高于任何運(yùn)算符。 C語言中運(yùn)算符的優(yōu)先級(jí)關(guān)系為:?jiǎn)文窟\(yùn)算>算術(shù)運(yùn)算>關(guān)系運(yùn)算>邏輯運(yùn)算>條件運(yùn)算>賦值運(yùn)算>逗號(hào)運(yùn)算。 結(jié)合方向是指當(dāng)一個(gè)運(yùn)算對(duì)象連接兩個(gè)同一優(yōu)先級(jí)的運(yùn)算符時(shí),如果先結(jié)合左邊的運(yùn)算符,稱為“自左向右”的結(jié)合方向;如果先結(jié)合右邊的運(yùn)算符,稱為“自右向左”的結(jié)合方向。 各類運(yùn)算符的優(yōu)先級(jí)和結(jié)合性詳見附錄D。 3. 表達(dá)式 由C運(yùn)算符和運(yùn)算對(duì)象構(gòu)成的式子稱為“表達(dá)式”。運(yùn)算對(duì)象可以是常量、變量或函數(shù)。單個(gè)的常量、變量和函數(shù)有時(shí)也可以看作表達(dá)式。 C語言表達(dá)式中的所有成分都必須以線性形式書寫,沒有分式,沒有上下標(biāo)。如數(shù)學(xué)表達(dá)式 轉(zhuǎn)換成C表達(dá)式,應(yīng)寫成 (sin(x)+b)/(a*b)+(a+b)/(a-b) 2.3.2 算術(shù)運(yùn)算符及算術(shù)表達(dá)式 1. 算術(shù)運(yùn)算符 (1)??+:加法運(yùn)算符,或正值運(yùn)算符,如3+5、+3。 (2)??-:減法運(yùn)算符,或負(fù)值運(yùn)算符,如5-2、-5。 (3)??*:乘法運(yùn)算符,如3*5。 (4)??/:除法運(yùn)算符,如5/3。 (5)??%:模運(yùn)算符,或稱求余運(yùn)算符,用于計(jì)算兩個(gè)整數(shù)相除后得到的余數(shù),如5%2的值為1。 算術(shù)運(yùn)算符的優(yōu)先級(jí)與數(shù)學(xué)上的規(guī)定相同,先乘除后加減,同一級(jí)別的一般情況下按自左向右的順序進(jìn)行。 注意: * 對(duì)于除法運(yùn)算符“/”,如果兩個(gè)運(yùn)算對(duì)象都為整數(shù),其意義為“整除”,相除的結(jié)果為整數(shù),如5/3的結(jié)果為整數(shù)1,舍去小數(shù)部分;如果有一個(gè)整數(shù)為負(fù)數(shù),C語言編譯系統(tǒng)將采取“向零取整”的方法,即-5/3=-1,取整后向零靠攏;如果兩個(gè)運(yùn)算對(duì)象中至少有一個(gè)為浮點(diǎn)數(shù),則相除的結(jié)果為double型浮點(diǎn)數(shù),如3.0/2的結(jié)果為1.5。 * 對(duì)于求余運(yùn)算符“%”,其只能應(yīng)用于整型數(shù)據(jù),且計(jì)算結(jié)果的符號(hào)取決于左操作數(shù)的正負(fù)號(hào)。例如: (-10)%3=-1 10%(-3)=1 2. 算術(shù)表達(dá)式 用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象連接起來的符合C語法規(guī)則的式子,稱為“C算術(shù)表達(dá)式”。運(yùn)算對(duì)象包括常量、變量、函數(shù)等。下面是一個(gè)合法的C算術(shù)表達(dá)式: a*b/c-1.5+'a'-sin(x) 算術(shù)表達(dá)式的值就是它的計(jì)算結(jié)果,算術(shù)表達(dá)式的類型就是它的計(jì)算結(jié)果的類型。 2.3.3 賦值運(yùn)算符及賦值表達(dá)式 1. 賦值運(yùn)算符及賦值表達(dá)式 在C語言中,“=”稱為賦值運(yùn)算符,它的作用是將一個(gè)表達(dá)式的值賦給一個(gè)變量。由賦值運(yùn)算符將一個(gè)變量和一個(gè)表達(dá)式連接起來的式子稱為賦值表達(dá)式。一般形式如下: <變量名>=<表達(dá)式> 賦值運(yùn)算符的結(jié)合性是“自右向左”,賦值運(yùn)算符的左邊必須是一個(gè)代表某一存儲(chǔ)單元的變量名(或是具備變量性質(zhì)的、代表某存儲(chǔ)單元的表達(dá)式),賦值運(yùn)算符的右邊可以是任意合法的C表達(dá)式。 賦值運(yùn)算的功能是先求出右邊表達(dá)式的值,然后再把此值賦給運(yùn)算符左邊的變量,也就是把數(shù)據(jù)放入以該變量名標(biāo)識(shí)的存儲(chǔ)單元中。例如: a=10; /* 把整型常量10賦給變量a */ 變量、變量值與存儲(chǔ)單元的關(guān)系如圖2-8所示。 在程序中,可以多次給一個(gè)變量賦值,每賦一次值,相應(yīng)的存儲(chǔ)單元中的數(shù)據(jù)就被更新一次,存儲(chǔ)單元總是存放最后一次所賦的數(shù)據(jù)。 說明: * 賦值運(yùn)算符的優(yōu)先級(jí)只高于逗號(hào)運(yùn)算符,比其他任何運(yùn)算符的優(yōu)先級(jí)都低。如對(duì)于下列表達(dá)式: s=13+2*/6+36/9 * 先計(jì)算賦值運(yùn)算符右邊表達(dá)式的值,再把計(jì)算的結(jié)果賦給變量s。 * 賦值運(yùn)算符右邊的表達(dá)式可以是一個(gè)賦值表達(dá)式。例如: a=b=5; 是合法的。根據(jù)賦值運(yùn)算符“自右向左”的結(jié)合性,它等價(jià)于a=(b=5),最終的結(jié)果是a和b都等于5。 2. 復(fù)合賦值運(yùn)算符 在賦值運(yùn)算符“=”之前加上其他的運(yùn)算符,可以構(gòu)成復(fù)合的賦值運(yùn)算符。C語言共有10種復(fù)合運(yùn)算符:+=、-=、*=、/=、%=為復(fù)合算術(shù)運(yùn)算符,>>=、<<=、&=、^=、|=為復(fù)合位運(yùn)算符。 復(fù)合運(yùn)算符是兩種運(yùn)算符的結(jié)合,它包含兩種運(yùn)算:賦值運(yùn)算、和賦值運(yùn)算符復(fù)合的其他運(yùn)算符的運(yùn)算。 例如: x+=10;/*等價(jià)于 x=x+10*/ x%=3;/*等價(jià)于 x=x%3*/ 如果復(fù)合賦值運(yùn)算符的右邊是一個(gè)表達(dá)式,則相當(dāng)于它含有一對(duì)括號(hào)。例如: x*=y/10-25;/*等價(jià)于 x=x*(y/10-25);*/ 可以借助以下步驟來理解其運(yùn)算規(guī)則。 (1)將“=”右側(cè)的表達(dá)式用括號(hào)括起來:(y/10-25)。 (2)將“=”左側(cè)的內(nèi)容“x*”移到右側(cè):x*(y/10-25)。 (3)最后補(bǔ)上“=”左側(cè)的變量名:x=x*(y/10-25)。 2.3.4 自增、自減運(yùn)算符 C語言提供了自增和自減運(yùn)算符。 自增運(yùn)算符++:功能是將變量的值加1。 自減運(yùn)算符--:功能是將變量的值減1。 “++”和“--”運(yùn)算符都是右結(jié)合方向的單目運(yùn)算符,它們既可以作為變量的前綴,又可以作為變量的后綴。 例如:對(duì)于變量x,++x、--x表示“++”、“--”作為變量x的前綴,x++、x--表示“++”、“--”作為變量x的后綴。 粗略地看,++x和x++都是使x的值加1,但是++x和x++的區(qū)別在于:++x是先將x的值加1,再使用變量x;而x++則是先使用變量x,然后再將x的值加1。例如下面的語句: x=5; y=++x; 執(zhí)行完語句后,x的值為6,y的值也為6。 這是因?yàn)檎Z句“y=++x;”等價(jià)于“x=x+1; y=x;”。 又如下面的語句: x=5; y=x++; 執(zhí)行完語句后,x的值為6,y的值為5。 因?yàn)檎Z句“y=x++;”等價(jià)于“y=x; x=x+1;”。 注意: * “++”和“--”運(yùn)算符只能應(yīng)用于變量,不能應(yīng)用于常量或表達(dá)式。例如,12++、(i*j) -- 都是不合法的。 * “++”、“--”與單目運(yùn)算符具有同一優(yōu)先級(jí),結(jié)合方向都是“自右向左”。因此,對(duì)于“-i++”要理解為“-(i++)”,而不能理解為“(-i)++”,這是因?yàn)?-i)是表達(dá)式,不能做“++”和“--”的操作對(duì)象。 2.3.5 關(guān)系運(yùn)算符及關(guān)系表達(dá)式 1. 關(guān)系運(yùn)算符 關(guān)系運(yùn)算符用于關(guān)系運(yùn)算。關(guān)系運(yùn)算是對(duì)兩個(gè)操作對(duì)象進(jìn)行比較的運(yùn)算,通過比較來判斷兩個(gè)操作數(shù)對(duì)象之間是否存在一定的關(guān)系。 C語言中的關(guān)系運(yùn)算符共有6種,都是雙目運(yùn)算符,結(jié)合方向都是“自左向右”,如表2-6所示。 表2-6 關(guān)系運(yùn)算符及其含義和優(yōu)先級(jí) 關(guān)系運(yùn)算符 含 義 優(yōu)先級(jí) >= 大于等于 高 > 大于 <= 小于等于 < 小于 = = 等于 低 != 不等于 2. 關(guān)系表達(dá)式 用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式連接起來的式子,稱為“關(guān)系表達(dá)式”。 關(guān)系表達(dá)式的值是一個(gè)邏輯值,即“真”和“假”。關(guān)系表達(dá)式所表達(dá)的關(guān)系如果成立,其值為“真”;如果不成立,其值為“假”。 在C語言中沒有專門的邏輯型數(shù)據(jù),而是用0表示“假”,非0的值表示“真”,通常用1來表示“真”。 注意: * 關(guān)系運(yùn)算符連接的表達(dá)式可以是C語言中任意的合法的表達(dá)式。 * 關(guān)系運(yùn)算符的操作對(duì)象可以是字符型數(shù)據(jù)。如表達(dá)式‘a(chǎn)’>‘m’的結(jié)果為0,因?yàn)樽址诖鎯?chǔ)單元中是按照ASCII碼存儲(chǔ)的(‘a(chǎn)’的ASCII碼為97,‘m’的ASCII碼為109),因而字符型數(shù)據(jù)的關(guān)系運(yùn)算比較的其實(shí)是它們的ASCII碼。 * 若變量x、y都是實(shí)型數(shù)據(jù),應(yīng)當(dāng)避免使用關(guān)系運(yùn)算符“x==y”這樣的表達(dá)式,因?yàn)橥ǔ4娣旁诖鎯?chǔ)單元中的實(shí)型數(shù)據(jù)都是有誤差的,因此不可能精確相等,這樣會(huì)導(dǎo)致關(guān)系表達(dá)式的值總為0。 2.3.6 邏輯運(yùn)算符及邏輯表達(dá)式 1. 邏輯運(yùn)算符 邏輯運(yùn)算符用于邏輯運(yùn)算,也就是“真”“假”值的運(yùn)算。C語言提供的邏輯運(yùn)算符及其含義和優(yōu)先級(jí)如表2-7所示。 表2-7 邏輯運(yùn)算符及其含義和優(yōu)先級(jí) 邏輯運(yùn)算符 含 義 優(yōu)先級(jí) ! 邏輯非 && 邏輯與 || 邏輯或 邏輯運(yùn)算符中的“!”為單目運(yùn)算符,其余都是雙目運(yùn)算符。 2. 邏輯表達(dá)式 用邏輯運(yùn)算符將表達(dá)式連接起來的式子,稱為“邏輯表達(dá)式”。邏輯表達(dá)式中的操作對(duì)象可以是C語言中任意合法的表達(dá)式。 邏輯運(yùn)算符主要用于進(jìn)一步明確關(guān)系表達(dá)式的關(guān)系,邏輯表達(dá)式的結(jié)果同關(guān)系表達(dá)式的結(jié)果一樣,只有“真”和“假”。表2-8所示為邏輯運(yùn)算規(guī)則。 表2-8 邏輯運(yùn)算規(guī)則 A B A&&B A||B !A 真 真 真 真 假 真 假 假 真 假 假 真 假 真 真 假 假 假 假 真 表2-8中的A、B均可以是其他關(guān)系表達(dá)式。 對(duì)于由關(guān)系表達(dá)式和邏輯表達(dá)式組成的復(fù)雜表達(dá)式,為了提高運(yùn)行速度,編譯系統(tǒng)會(huì)對(duì)下列特殊的情況作不同的處理。 1)(表達(dá)式1) || (表達(dá)式2) 根據(jù)語法規(guī)則,只要(表達(dá)式1)的值為真,不論(表達(dá)式2)的值為何值,最終表達(dá)式“(表達(dá)式1) || (表達(dá)式2)”的結(jié)果都為真,編譯器不會(huì)對(duì)(表達(dá)式2)進(jìn)行運(yùn)算,但會(huì)檢查其語法是否有錯(cuò)誤。 例如有如下語句: … int x=10,y=20,z; z=(x<y) || (--y); printf("z=%d \n",z); … 因?yàn)楸磉_(dá)式(x<y)的結(jié)果為真,因而不論后面的表達(dá)式為何值,表達(dá)式(x<y)||(--y)的結(jié)果都為真,此時(shí)系統(tǒng)不會(huì)計(jì)算表達(dá)式(--y),y的值也不會(huì)減少,程序運(yùn)行后的結(jié)果為z=1、y=20。 2)??(表達(dá)式1) && (表達(dá)式2) 根據(jù)語法規(guī)則,只要(表達(dá)式1)的值為假,不論(表達(dá)式2)的值為何值,最終表達(dá)式“(表達(dá)式1) && (表達(dá)式2)”的結(jié)果都為假,編譯器不會(huì)對(duì)(表達(dá)式2)進(jìn)行運(yùn)算,但會(huì)檢查其語法是否有錯(cuò)誤。 例如有如下語句: … int x=10,y=20,z; z=(x>y) && (--y); printf("z=%d \n",z); … 因?yàn)楸磉_(dá)式(x>y)的結(jié)果為假,因而不論后面的表達(dá)式為何值,表達(dá)式(x>y)&&(--y)的結(jié)果都為假,此時(shí)系統(tǒng)不會(huì)計(jì)算表達(dá)式(--y),y的值也不會(huì)減少,程序運(yùn)行后的結(jié)果為z=0、y=20。 2.3.7 位運(yùn)算符及位運(yùn)算 位運(yùn)算是指二進(jìn)制位的運(yùn)算,主要針對(duì)整型和字符型數(shù)據(jù)而言。位運(yùn)算符的屬性如表2-9所示。 表2-9 位運(yùn)算符的屬性 位運(yùn)算符 含 義 類 型 結(jié)合性 優(yōu)先級(jí) ~ 按位取反 單目 自右向左 << 位左移 雙目 自左向右 >> 位右移 雙目 自左向右 & 位與 雙目 自左向右 ^ 位異或 雙目 自左向右 | 位或 雙目 自左向右 位運(yùn)算的結(jié)果只有0或1,位運(yùn)算的規(guī)則如表2-10所示。 表2-10 位運(yùn)算的規(guī)則 A B A|B A^B A&B ~A ~B 1 1 1 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 關(guān)于位運(yùn)算的詳細(xì)內(nèi)容,將在第12章中介紹。 2.3.8 條件運(yùn)算符及條件表達(dá)式 條件運(yùn)算符是C語言中唯一的三目運(yùn)算符。由條件運(yùn)算符和運(yùn)算對(duì)象構(gòu)成的表達(dá)式稱為條件表達(dá)式,條件表達(dá)式由“?”和“:”組成,其結(jié)合方向是“自右向左”,一般形式如下: 表達(dá)式1? 表達(dá)式2:表達(dá)式3; 條件表達(dá)式的運(yùn)算過程為:先計(jì)算表達(dá)式1的值,如果表達(dá)式1的值為真(非0),則表達(dá)式2被求值,此時(shí)表達(dá)式2的值就是整個(gè)條件表達(dá)式的值;如果表達(dá)式1的值為假(0),則表達(dá)式3被求值,此時(shí)表達(dá)式3的值就是整個(gè)條件表達(dá)式的值。 【實(shí)例2-4】 條件表達(dá)式示例。 #include<stdio.h> void main() { int a=12,b=24,c; c=a>b ? a+b : a-b; printf("c=%d\n",c); } 程序運(yùn)行結(jié)果: c=-12 條件表達(dá)式是可以嵌套使用的,當(dāng)多個(gè)條件表達(dá)式嵌套使用時(shí),每個(gè)后續(xù)的“:”總是與前面最近且沒有配對(duì)的“?”相聯(lián)系。例如: a>b ? a: c>d ? c:d 相當(dāng)于: a>b ? a: (c>d ? c:d) 如果a=6、b=8、c=12、d=24,則條件表達(dá)式的值為24。 2.3.9 逗號(hào)運(yùn)算符及逗號(hào)表達(dá)式 逗號(hào)表達(dá)式是由逗號(hào)“,”將兩個(gè)表達(dá)式連接起來組成的一個(gè)表達(dá)式。逗號(hào)表達(dá)式的一般形式如下: 表達(dá)式1,表達(dá)式2,…,表達(dá)式n; 逗號(hào)表達(dá)式的求解過程為:先計(jì)算表達(dá)式1,再計(jì)算表達(dá)式2……直至計(jì)算表達(dá)式n,整個(gè)表達(dá)式的結(jié)果就是表達(dá)式n的值。 逗號(hào)表達(dá)式的運(yùn)算優(yōu)先級(jí)是最低的,結(jié)合方向是“自左向右”。 【實(shí)例2-5】 逗號(hào)表達(dá)式示例。 #include<stdio.h> void main() { int x,y; y=(x=3*5,x*3,x+12); printf("y=%d\n",y); } 程序運(yùn)行結(jié)果: y=27 2.3.10 數(shù)據(jù)類型的轉(zhuǎn)換 在C語言程序中,若出現(xiàn)包括不同類型的常量和變量的一個(gè)表達(dá)式,那運(yùn)算結(jié)果會(huì)是什么呢?C語言規(guī)定:不同類型的數(shù)據(jù)在參加運(yùn)算時(shí),要先轉(zhuǎn)換成相同類型的數(shù)據(jù),然后再進(jìn)行運(yùn)算。運(yùn)算結(jié)果的類型就是轉(zhuǎn)換后的類型。C語言的數(shù)據(jù)類型轉(zhuǎn)換分為系統(tǒng)自動(dòng)進(jìn)行的類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換。 1. 系統(tǒng)自動(dòng)進(jìn)行的類型轉(zhuǎn)換 自動(dòng)類型轉(zhuǎn)換的規(guī)則:取值范圍較小的類型向取值范圍較大的類型轉(zhuǎn)換,如圖2-9所示。 注意: * 圖中指向左側(cè)的箭頭表示必須進(jìn)行的轉(zhuǎn)換。char、short型數(shù)據(jù)必須要轉(zhuǎn)換為int型,float型數(shù)據(jù)必須要轉(zhuǎn)換為double型。 * 縱向箭頭表示當(dāng)運(yùn)算對(duì)象為不同數(shù)據(jù)類型時(shí)轉(zhuǎn)換的方向,由低向高轉(zhuǎn)換。例如,int型數(shù)據(jù)與double型數(shù)據(jù)進(jìn)行運(yùn)算時(shí),要先將int型轉(zhuǎn)換為double型,然后兩個(gè)double型數(shù)據(jù)進(jìn)行運(yùn)算,結(jié)果為double型。而不是int型先轉(zhuǎn)換為unsigned型,再轉(zhuǎn)換為long型,最后轉(zhuǎn)換為double型。 【實(shí)例2-6】 數(shù)據(jù)類型轉(zhuǎn)換分析。計(jì)算表達(dá)式120-‘m’+24.67的值。 (1) 計(jì)算120-‘m’:先將字符‘m’轉(zhuǎn)換為整數(shù)109,再計(jì)算120-109,計(jì)算結(jié)果為11。 (2) 計(jì)算11+24.67:由于表達(dá)式中有實(shí)型數(shù)據(jù),因而要先將11和24.67都轉(zhuǎn)換為double型,再進(jìn)行運(yùn)算,結(jié)果為35.670000。 2. 強(qiáng)制類型轉(zhuǎn)換 自動(dòng)類型轉(zhuǎn)換是編譯系統(tǒng)自動(dòng)進(jìn)行的,不需要用戶干預(yù)。C語言允許用戶根據(jù)自己的需要將運(yùn)算對(duì)象的數(shù)據(jù)類型轉(zhuǎn)換為所需的數(shù)據(jù)類型。強(qiáng)制轉(zhuǎn)換的形式如下: (類型名) (表達(dá)式); 功能:強(qiáng)行將表達(dá)式的類型轉(zhuǎn)換為所要求的類型。例如: (int)4.2; /*將實(shí)型數(shù)據(jù)4.2強(qiáng)行轉(zhuǎn)換為整型,結(jié)果為4*/ (float) (x+y);/*將x+y的結(jié)果轉(zhuǎn)換為float型*/ 注意: 強(qiáng)制類型轉(zhuǎn)換之后,原來的變量或表達(dá)式的值并未發(fā)生改變。例如: float a=3.14; 則強(qiáng)制轉(zhuǎn)換表達(dá)式(int)a的數(shù)據(jù)類型為int型,結(jié)果為3;而變量a的數(shù)據(jù)類型仍然是float型,值仍為3.14。 2.4 小型實(shí)訓(xùn)案例 本案例主要應(yīng)用本章所學(xué)的算術(shù)運(yùn)算符以及算術(shù)表達(dá)式的知識(shí),對(duì)一個(gè)三位的整數(shù)進(jìn)行分解。 1. 實(shí)訓(xùn)目的 掌握算術(shù)運(yùn)算符及算術(shù)表達(dá)式的應(yīng)用。 2. 實(shí)訓(xùn)內(nèi)容 假定n是一個(gè)三位的正整數(shù),將其各位上的數(shù)字分解出來,再計(jì)算各位數(shù)字之和。例如整數(shù)n為123,則各位數(shù)字之和為1+2+3=6。 3. 實(shí)訓(xùn)步驟 1) 分析 將n的百位、十位、個(gè)位上的數(shù)字依次分解出來,再計(jì)算它們的和,具體步驟如下。 (1) 計(jì)算n的個(gè)位數(shù)。利用算術(shù)運(yùn)算符“%”,計(jì)算n與10的余數(shù),所得的計(jì)算結(jié)果就是n的個(gè)位數(shù): 個(gè)位數(shù)=n%10; (2) 計(jì)算n的十位數(shù)。利用算術(shù)運(yùn)算符“/”關(guān)于整數(shù)相除的特點(diǎn),即“兩個(gè)整數(shù)相除的結(jié)果仍然為整數(shù)”,將n除以10就可以除掉n的個(gè)位數(shù),再利用求模運(yùn)算符(%)與10求余數(shù),所得的計(jì)算結(jié)果就是n的十位上的數(shù)字: 十位數(shù)=n/10%10; (3) 計(jì)算n的百位數(shù)。將n除以100,得到的結(jié)果就是n的百位數(shù): 百位數(shù)=n/100; (4) 求和。 總和=個(gè)位數(shù)+十位數(shù)+百位數(shù); 2) 編程實(shí)現(xiàn) #include <stdio.h> void main() { int n,g,s,b,sum;/*n表示要分解的整數(shù), g表示個(gè)位的數(shù)字,s表示十位 ?的數(shù)字,b表示百位的數(shù)字,sum表示各位數(shù)字之和 */ n=123; g=n%10; /* 分解出個(gè)位上的數(shù)字 */ s=n/10%10; /* 分解出十位上的數(shù)字 */ b=n/100; /* 分解出百位上的數(shù)字 */ sum=g+s+b; printf("%d\n",sum); } 本 章 小 結(jié) 本章主要介紹了C語言的數(shù)據(jù)類型和各類運(yùn)算符及表達(dá)式,這是編寫C語言程序的基礎(chǔ)。 C語言的基本數(shù)據(jù)類型包括整型、實(shí)型和字符型,整型又分為基本整型、短整型、長(zhǎng)整型,實(shí)型又分為單精度實(shí)型、雙精度實(shí)型。 C語言的運(yùn)算符共分為算術(shù)運(yùn)算符、賦值運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、逗號(hào)運(yùn)算符、條件運(yùn)算符、求字節(jié)數(shù)運(yùn)算符及位運(yùn)算符等,每一種運(yùn)算符都有其結(jié)合方向和運(yùn)算優(yōu)先級(jí)。 C語言不同類型的表達(dá)式是通過不同的運(yùn)算符構(gòu)成的,一個(gè)常量、變量都可以看作一個(gè)表達(dá)式。混合表達(dá)式在運(yùn)算時(shí),要按運(yùn)算符的優(yōu)先級(jí)次序執(zhí)行,當(dāng)一個(gè)運(yùn)算符兩側(cè)的運(yùn)算對(duì)象的數(shù)據(jù)類型不同時(shí),系統(tǒng)會(huì)遵循“先轉(zhuǎn)換,后運(yùn)算”的原則,將數(shù)據(jù)自動(dòng)轉(zhuǎn)換為同一類型后再進(jìn)行運(yùn)算。 習(xí) 題 一、選擇題 1.若變量a是整型數(shù)據(jù),并執(zhí)行了語句“a=‘A’+1.6;”,則正確的敘述是( )。 A.??a的值為字符CB.??a的值是浮點(diǎn)型 C. 不允許字符型和浮點(diǎn)型相加D.??a的值為字符‘A’的ASCII碼值加1 2.下列變量定義中合法的是( )。 A.??int _a=1-0.1e-1;B.??double b=1+5e2.5; C.??long d0=0xfdaL;D.??float 2_and=1-e-3 3.已知各變量的類型定義如下: int k,a,b; long w=5; double x=1.42; 則以下不符合C語言語法的表達(dá)式是( )。 A.??x%(-3)B.??w+=2 C.??k=(a=2,b=3,a+b)D.??a+=a-=(b=4)*(a=3) 4.字符型常量在內(nèi)存中存放的是( )。 A.??ASCII碼B.?? BDC碼C.??內(nèi)部碼D.??十進(jìn)制碼 5.下面錯(cuò)誤的字符串常量是( )。 A.??‘a(chǎn)bc’B.??“12’12”C.??“0”D.??“ ” 6.若有“int n=7, sum=7;”,則計(jì)算表達(dá)式sum=n++,sum++,++n后,sum的值是( )。 A.??7B.??8C.??9D.?10 7.設(shè)“int x=1,y=1;”,表達(dá)式(!x||y--)的值是( )。 A.??0B.??1C.??2D.??-1 8.以下選項(xiàng)中,與k=n++完全等價(jià)的表達(dá)式是( )。 A.??k=n,n=n+1B.??n=n+1,k=n C.??k=++nD.??k+=n+1 9.能正確表達(dá)數(shù)學(xué)關(guān)系“10≤a<100”的表達(dá)式是( )。 A.??10≤a<100B.??(10<=a)&(a<100) C.??(10<=a )||(a<100)D.?(10<=a)&&(a<100) 10.執(zhí)行下列C語言程序段后,變量b的值是( )。 double a=1,b; b=a+5/2; A.??1B.??3C.??3.0D.??3.5 二、填空題 下列程序的功能是:計(jì)算圓的面積,已知半徑r=10。 #include<stdio.h> void main() { ① r=10; /*聲明變量r的數(shù)據(jù)類型 */ ② PI=3.1415926,area;/*聲明語句 */ area=r*r*PI; /* 利用數(shù)學(xué)公式求圓面積 */ printf("%f\n", ③ );/* 輸出計(jì)算結(jié)果 */ } 三、改錯(cuò)題 修改下列程序,使得在屏幕上輸出 1+1/2+2/3+3/4 的計(jì)算結(jié)果。下列程序在每一行“/***********found************/”的下方有一處錯(cuò)誤,請(qǐng)予以改正,程序的其他部分不得改動(dòng)。 #include<stdio.h> void main() { /***********found************/ int sum; sum=1.0+1.0/2+2.0/3+3.0/4; /***********found************/ printf("%d",sum); } 四、編程題 1. 編寫程序,計(jì)算表達(dá)式1-1/2+1/3-1/4+1/5 的計(jì)算結(jié)果。 2. 編寫程序,將一個(gè)大寫字母轉(zhuǎn)換為小寫字母。
你還可能感興趣
我要評(píng)論
|