《C語言程序設計基礎》課件第2章_第1頁
《C語言程序設計基礎》課件第2章_第2頁
《C語言程序設計基礎》課件第2章_第3頁
《C語言程序設計基礎》課件第2章_第4頁
《C語言程序設計基礎》課件第2章_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第2章C語言中的基本數(shù)據(jù)與運算——C語言基本元素2.1常量2.2變量2.3數(shù)據(jù)類型與存儲結構2.4算術表達式實訓任務三

熟悉數(shù)據(jù)類型,掌握常量、變量的正確使用實訓任務四

熟悉C語言中算術表達式的書寫與求值

C語言的基本元素有哪些?

從一般的語言體系來講,一種語言最基本的內容是語言元素。C語言的基本元素是構成C程序語句的基本成分。從C程序的功能來講,一個C語言程序就是對一個問題的特定數(shù)據(jù)進行存儲、加工處理,并將結果輸送給用戶,因此程序最基本的內容應是基本數(shù)據(jù)與運算。

C語言的基本元素包括基本字符集、數(shù)據(jù)、表達式和函數(shù)。

(1)?C語言的基本字符集是ASCII碼表中的一些基本字符。在C語句中對使用的字符一般都有具體的規(guī)定,這里不再專門介紹。

(2)數(shù)據(jù)。C語言中的數(shù)據(jù)是C語句的組成部分,又是C程序加工處理的對象。數(shù)據(jù)對象各種各樣,在C語言中劃分為不同的數(shù)據(jù)類型。一種數(shù)據(jù)類型代表了一種數(shù)據(jù)對象的邏輯結構,而且定義了它的存儲結構。C語言允許使用的數(shù)據(jù)類型如圖2.1所示。類型名稱后括號內的字符是定義該類型數(shù)據(jù)的關鍵字。

圖2.1C語言中允許使用的數(shù)據(jù)類型

C語言中的數(shù)據(jù)按其在程序中的表現(xiàn)形態(tài)又可分為常量和變量。

(3)表達式。表達式既是C語句的組成部分,又是C程序中對數(shù)據(jù)進行運算的主要方式。表達式有算術表達式、關系表達式、邏輯表達式等。

(4)函數(shù)。函數(shù)可以出現(xiàn)在C語句中,是語句的構成部分,但函數(shù)又是C程序的功能模塊,貫穿于C語言程序設計的始終,這將在后續(xù)章節(jié)中介紹。

從上述內容可知,C語言的基本元素包含的內容也較廣泛,有些內容需要具備一定的C語言知識才能夠理解。本章先從盡快進入C語言程序設計學習的角度,只介紹最基本的數(shù)據(jù)類型和算術表達式,其他內容將在后續(xù)章節(jié)介紹。

2.1常

何謂常量?常量有哪些類型?常量在程序中如何表示?

常量是在程序中以數(shù)學中常數(shù)的形式出現(xiàn)的數(shù)據(jù)。常量在程序運行過程中其值始終保持不變,這是相對于變量而言的。其實,常量就是常數(shù)數(shù)據(jù)。不同類型的常量在程序中的書寫形式是不同的。

2.1.1整型常量

整型常量用數(shù)學中的整數(shù)形式書寫,如10、105、2386、-1、-20、-15678等。在C語言中,整型常量除采用十進制數(shù)外,還可以采用八進制和十六進制數(shù)表示。八進制數(shù)和十六進制數(shù)實際上是二進制數(shù)的縮寫。

八進制整數(shù):以0開頭,作為八進制數(shù)的標識,后跟八進制基本數(shù)字0~7。如0123表示八進制數(shù)123,即十進制數(shù)83;-011表示八進制數(shù)-11,即十進制數(shù)-9。

十六進制整數(shù):以0x開頭,作為十六進制數(shù)的標識,后跟十六進制基本數(shù)字0~9,A,B,C,D,E,F(xiàn)。如0x12F表示十六進制數(shù)12F,即十進制數(shù)303;-0x1B表示十六進制數(shù)-1B,即十進制數(shù)-27。2.1.2實型常量

1.小數(shù)形式

小數(shù)形式實數(shù)是以數(shù)學中的小數(shù)形式書寫,如0.01、123.456、-5.78、1.0、12.0等。注意:如果一個實數(shù)沒有小數(shù)位,必須在數(shù)的末尾加小數(shù)點,或將小數(shù)點后的小數(shù)部分寫為“0”;否則,就按整數(shù)處理。例如,12.和12.0都是正確的實數(shù)。

2.指數(shù)形式

指數(shù)形式的實數(shù)與數(shù)學中的指數(shù)形式不同,用字母“e”或“E”表示數(shù)學指數(shù)中的底數(shù)“10”,指數(shù)不能寫成上標形式,而應與所有字符平等書寫,“e”或“E”之前必須有數(shù)字,“e”或“E”后面必須為整數(shù)。例如,12.34e3代表12.34×103,-346.87e-25(代表-346.87×10-25,0.145E25代表0.145×1025。e4和12e2.5是錯誤的寫法,因為e4的e前無數(shù)字,12e2.5的e后面是小數(shù)。

指數(shù)形式的實數(shù)與數(shù)學中的寫法不同,因此務必注意,一定要從學習C語言之初就養(yǎng)成習慣。2.1.3字符常量

1.普通字符

普通字符以單撇號界定,如'a'、'A'、'3'、'0'、'?'、'#'?都表示字符常量。字符常量必須是單個字符,如?'ab'、'12'?就不是字符常量了。

注意:數(shù)字作為字符常量就不代表數(shù)字值了,它的值是ASCII碼。例如?'3'?的值是48(見附錄A)。

2.轉義字符

C程序中還允許使用一種特殊形式的字符常量,即轉義字符,它是單撇號界定的以“\”開頭的字符序列。例如,前面在printf函數(shù)中已用過的?'\n',它代表一個“換行符”。'\t'?代表將輸出位置跳到下一個tab位置(制表位置),一個tab位置是向后跳8個字符位的位置。這是一種在屏幕上無法顯示的“控制字符”,在程序中也無法用一般形式的字符來表示,只能采用這樣的特殊形式來表示。常用的以“\”開頭的特殊字符見表2.1。表2.1轉義字符及其作用2.1.4字符串常量

字符串常量是一個字符序列作為一個數(shù)據(jù)對象。它是用雙撇號界定的一個字符序列。例如,"boy"、"123"?是兩個字符串常量。注意不要把字符串界定符雙撇號寫成單撇號。如'boy',這樣的寫法既不表示字符串常量,也不表示字符常量。2.1.5符號常量

在C程序中,可以將一個常量定義成一個符號,用符號來表示所定義的常量。這樣,可以給程序設計帶來很大便利。一般在程序的開頭,用預處理指令進行定義。其一般形式如下:

#define符號常量數(shù)據(jù)

例如:

#definePI3.1415926

在程序中,在定義后的的任意地方,都可以用PI來表示3.1425926。PI就是符號常量。在程序設計中,如果一個常量比較冗長,或一個常量要在多處書寫,將該常量定義成符號常量,會帶來極大便利。一方面,可避免冗長數(shù)據(jù)書寫容易出錯的問題;另一方面,如果一個常量在程序中多處出現(xiàn),要改變此數(shù)據(jù)必須多處修改,定義成符號常量后,只要在定義處修改即可。在定義符號常量時,標識符采用“顧名思義”的習慣,為與變量有所區(qū)分,常將字母大寫。例如,要定義商品價格常量符號,可用“PRICE”作為符號名。

2.2變

2.2.1變量的內涵

一個變量就代表一個數(shù)據(jù)的存儲單元??梢园岩粋€存儲單元比作存放一個數(shù)據(jù)的盒子,如圖2.2所示。盒子中存放了數(shù)據(jù),這個數(shù)據(jù)可以多次取出來使用,也可以將一個新數(shù)據(jù)存放在盒子中,但新數(shù)據(jù)存入時,舊數(shù)據(jù)就自然丟掉了。盒子里面的內容(數(shù))是變量的值。存儲單元隨時可存入新數(shù),在程序運行過程中,一個變量的值隨時可發(fā)生變化,正是從這個意義上稱之為變量的。

圖2.2存儲單元示意圖

2.2.2變量的定義

程序中使用的變量必須先定義,后使用。只有定義了的變量,程序編譯時,系統(tǒng)才會給其分配相應的存儲單元。變量定義的一般形式為

類型符

變量名;

其中,類型符可以是圖2.1中基本類型中的各種數(shù)據(jù)類型后標注的關鍵字,例如,整型用int,字符型用char,單精度浮點型用float,雙精度浮點型用double。類型關鍵字規(guī)定了變量的類型,也就是變量值的類型。從數(shù)據(jù)存儲的角度來講,不同類型的數(shù)據(jù),系統(tǒng)給其分配不同長度的存儲單元。例如,系統(tǒng)給char型數(shù)據(jù)分配一個字節(jié)的存儲單元,給int型數(shù)據(jù)分配4個字節(jié)的存儲單元。只有定義了類型,系統(tǒng)才能給變量分配相應長度的存儲單元。

變量名是變量所表示的數(shù)據(jù)對象的名稱。從存儲器的特性來說,每一個存儲單元都有一個編號,稱之為地址,對存儲單元中數(shù)據(jù)的存取,必須要給出單元地址。因高級程序設計語言中不涉及硬件特性,所以通過變量名來使用變量的值。從原理上講,變量名就代表存儲單元地址。了解這一原理概念,對理解變量的操作是非常有用的。也就是說,變量名是存放數(shù)據(jù)的存儲單元的標識符。

C語言規(guī)定標識符只能由字母、數(shù)字和下劃線三種字符組成,且首字符必須是字母或下劃線。下面列出的是合法的標識符,也是合法的變量名:

Sum,average,_total,student_name,lotus_1_2_3下面列出的是不合法的標識符和變量名:

M.D.John,¥123,#33,3D64,a>b

在C語言標識符中,大寫字母與小寫字母被認為是兩個不同的字符。因此,Sum和sum,class和Class是兩個不同的標識符。一般地,變量名用小寫字母表示,這已成為C語言中約定俗成的變量命名方法。

在選擇變量名和其他標識符時,應養(yǎng)成“顧名思義”的習慣,即選有含義的英文單詞(或其縮寫)作標識符。如sum表示和數(shù),average表示平均值,total表示總數(shù)。這樣可提高程序的可讀性。從以上變量定義語句可以看出,一個定義語句可以定義一個變量,也可以定義多個變量,但在一個語句中定義的多個變量必須是同類型的,變量之間要用逗號分隔。

例2.1

整型變量的定義與使用。

2.3數(shù)據(jù)類型與存儲結構

2.3.1整型數(shù)據(jù)的存儲結構

整型數(shù)據(jù)在存儲器中用補碼的形式存儲。C語言標準中沒有具體規(guī)定各種類型數(shù)據(jù)所占存儲單元的長度,但在各種編譯系統(tǒng)中都有自己的規(guī)定。整型數(shù)據(jù)常見的存儲長度與值的范圍,在表2.2中列出。

表2.2整型數(shù)據(jù)常見的存儲長度和值的范圍整型數(shù)為什么要區(qū)為分帶符號數(shù)和無符號數(shù)呢?在實際應用中,有些數(shù)只取正值,如學號、年齡、存款額等,為了充分利用變量值的取值范圍,可定義為無符號型。因為有符號數(shù)據(jù),存儲的最高位表示符號位。定義成無符號數(shù),就不需要符號位。這樣,在同樣的存儲長度下,無符號類型數(shù)就是有符號類型數(shù)的2倍,即擴大了無符號類型的數(shù)值范圍。無符號類型關鍵字是在帶符號類型關鍵字前加上unsigned。不加unsigned的類型,都為帶符號整型。2.3.2字符型數(shù)據(jù)的存儲結構

字符型數(shù)據(jù)在存儲器中存儲的是字符的ASCII代碼,一個字符型數(shù)據(jù)只占一個字節(jié),數(shù)值范圍為0~255,若取值范圍超出0~255,則出錯。

2.3.3實型(浮點型)數(shù)據(jù)的存儲結構

實型數(shù)據(jù)是以指數(shù)形式存放在存儲單元中的。一個實數(shù)表示為指數(shù),可以有不止一種形式,如3.1416可以表示為3.14159×100,0.314159×101,0.0314159×102,31.4159×10-1等。顯然,小數(shù)點位置在浮動,同時指數(shù)的值也在改變。由于小數(shù)點位置可以浮動,所以把實數(shù)的指數(shù)形式稱為浮點型。一個實數(shù)在程序中的指數(shù)表示形式可有多種,但它在計算機內部的存儲形式及程序的輸出結果中都只有一種規(guī)范化的指數(shù)形式。把小數(shù)部分中小數(shù)點前的數(shù)字為0、小數(shù)點后的第1位數(shù)字不為0的指數(shù)表示形式稱為規(guī)范化的指數(shù)形式,如0.314159×101就是實數(shù)3.14159的規(guī)范化指數(shù)形式。

實數(shù)在存儲時,系統(tǒng)把小數(shù)和指數(shù)兩個部分分別存放,如圖2.3所示。圖中是以十進制數(shù)來示意的。實際上,計算機是用二進制數(shù)表示小數(shù)部分,用2的冪次的二進制數(shù)表示指數(shù)部分。小數(shù)部分和指數(shù)部分各占多少位,C標準中并無規(guī)定,是由各編譯系統(tǒng)自行規(guī)定的。小數(shù)部分的位數(shù)決定了實數(shù)表示的精度,位數(shù)越多,數(shù)的有效位數(shù)越多,精度也就越高。指數(shù)部分的位數(shù)越多,則數(shù)值的取值范圍就越大。圖2.3指數(shù)存儲示意圖常見的3種類型實數(shù)的存儲長度、有效數(shù)字和取值范圍如表2.3所示。TurboC對longdouble型分配16個字節(jié)的存儲長度。VisualC++6.0對longdouble型分配8個字節(jié)的存儲長度。

表2.3實型數(shù)據(jù)的存儲長度、有效數(shù)字和取值范圍 2.4算術表達式

2.4.1基本算術運算符與表達式

1.基本算術運算符

C語言中的基本算術運算符見表2.4。

表2.4基本算術運算符

2.運算符的優(yōu)先級與結合性

C語言規(guī)定了運算符的優(yōu)先級和結合性。在表達式求值時,先按運算符的優(yōu)先級高低次序進行。5個基本算術運算符的優(yōu)先級是先*、/、%,后+、-。如a-b*c,b的左側是減號,右側是乘號,因乘號優(yōu)先于減號,所以,相當于a-(b*c)。如果一個運算對象兩側的運算符的優(yōu)先級相同,如a-b+c,則按規(guī)定的結合方向處理。C語言規(guī)定了運算符的結合方向(結合性)?;舅阈g運算符的結合方向為“自左至右”,又稱為“左結合性”,即運算對象先與左側的運算符結合。因此,b先與減號結合,進行a-b運算,再執(zhí)行加c運算。關于“結合性”的概念在其他一些高級語言中是沒有的,是C語言的特點之一,需認真加以理解。

3.混合運算的數(shù)值類型轉換

如果一個表達式中包含了不同數(shù)據(jù)類型的運算對象,在進行運算時,不同類型的數(shù)據(jù)先要轉換成同一類型,然后進行運算。轉換的規(guī)則是:把存儲長度短的類型向存儲長度長的類型轉換。各種數(shù)據(jù)類型間的一般轉換順序可表示如下:

(short,char)→int→unsigned→long→float→double

算術運算符是雙目運算符,一個運算符涉及兩個運算對象,一次轉換只在兩種不同類型間進行。例如int型與double型數(shù)據(jù)進行運算,先將int型數(shù)據(jù)轉換成double型,然后進行運算,結果是double型。假設已定義i為int型變量,f為float型變量,d為double型變量,l為long型變量,分析下面表達式的運算:

10+'a'+i*f-d/e

計算機執(zhí)行時從左至右掃描,運算次序為:

(1)進行10+?'a'?的運算,先將?'a'?轉換成整數(shù)97,運算結果為107。

(2)由于“*”比“+”優(yōu)先,先進行i*f的運算,將i轉換成float型,運算結果為float型。

(3)整數(shù)107與i*f的積相加。先將整數(shù)107轉換成實數(shù)(小數(shù)點后加若干個0,即107.000…00),結果為float型。

(4)將變量e化成double型,d/e的結果為double型。

(5)將10+'a'+i*f的結果與d/e的商相減,結果為double型。

上述表達式運算過程中的類型轉換是由系統(tǒng)自動進行的。在某些情況下,需要在程序中設置操作數(shù)類型的轉換,這樣的轉換方式稱為強制轉換。如%運算要求兩運算數(shù)必須是整型數(shù),如果在程序中遇到一個或兩個運算數(shù)不是整型數(shù),就需要強制轉換。

強制類型轉換的一般形式為

(類型符)(表達式)

需要說明的是,在強制類型轉換時,得到一個所需類型的中間變量,原來變量的類型未發(fā)生變化。例如:

(int)x

如果已定義x為float型,進行強制類型轉換后得到一個int型的中間變量,它的值等于x的整數(shù)部分,而x的類型不變,仍為float型。

分析:從程序的運行結果可以看出,x強制轉換為int型并賦給變量i,輸出i的值,即整型,x仍為float型,保持原值不變。

從上述內容可知,有兩種類型轉換:一種是在運算時不必由用戶指定,系統(tǒng)自動進行的類型轉換;另一種是強制類型轉換。當自動類型轉換不能達到目的時,可以用強制類型轉換。如x為float型,則“x%3”不合法,必須用“(int)x%3”。2.4.2自加、自減運算符與表達式

1.自加、自減運算符與表達式

自加運算符(++)和自減運算符(--)都是單目運算符,只作用于單個變量,使變量的值加1或減1。它們各有兩種使用方式:一種是變量在運算符前,另一種是變量在運算符后。

例如:

i++表示先引用i的值,再使i的值加1(i=i+1)。

++i表示先使i的值加1(i=i+1),再引用i的值。

i--表示先引用i的值,再使i的值減1(i=i-1)。

--i表示先使i的值減1(i=i-1),再引用i的值。

以上表達式的求值,可通過下列程序驗證。

分析:程序中4個表達式求值都是在變量i的初值為3的基礎上進行的。執(zhí)行“a1=i++;”時,先把變量i的值3賦給變量a1,再使變量i的值加1,變量i的值變?yōu)?。執(zhí)行“a2=++i;”時,先使變量i的值加1,變?yōu)?,再賦給變量a2,變量i和a2的值都為4。執(zhí)行“s1=i--;”時,先把變量i的值3賦給變量s1,再使變量i的值減1,變?yōu)?。執(zhí)行“a2=--i;”時,先使變量i的值減1,變?yōu)?,再賦給變量s2,變量i和s2的值都為2。

特別強調:自增運算符(++)和自減運算符(--)只能用于變量,而不能用于常量或表達式,如5++或(a+b)++都是不合法的。因為加1或減1后的值仍要存放在原變量中,常量和表達式是不能存儲值的。

2.++和--的結合性

++和--的結合方向是“自右至左”,也稱為“右結合性”。如果有-i++,i的左面是負號運算符,右面是自加運算符。如果i的原值等于3,若按左結合性,相當于(-i)++,而(-i)++是不合法的,因為對表達式不能進行自加、自減運算。從附錄C可知,負號運算符和“++”、“--”運算符同優(yōu)先級,而結合方向為“自右至左”(右結合性),即它相當于-(i++)。++和--的結合性可通過下例程序來驗證。

分析:先使用i的值3,輸出-i的值-3,然后i增值為4。表達式-i++的結合性為-(i++),執(zhí)行時,先用i的值3取負號,將-3賦給a1,再對i加1,i的值變?yōu)?。表達式-++i的結合性為-(++i),執(zhí)行時,先將i的值3加1后取負號,再將-4賦給a2。

3.自加、自減運算符表達式使用中需注意的問題

C運算符和表達式使用靈活,利用這一點可以巧妙地處理許多在其他語言中難以處理的問題,但使用中也有一些需要注意的問題:

(1)注意不同系統(tǒng)對表達式的求值順序的差異,避免求值奇異。例如,i的初值為3,有以下表達式:

(i++)+(i++)+(i++)表達式的值是多少呢?有的系統(tǒng)按照自左而右順序求解括號內的運算,求完笫1個括號的值后,實現(xiàn)i自加,i值變?yōu)?,再求第2個括號的值,結果表達式相當于3+4+5,即12。而另一些系統(tǒng)(如TurboC和VisualC++6.0)把3作為表達式中所有i的值,因此3個i相加,得到表達式的值為9,在求出整個表達式的值后再實現(xiàn)自加3次,i的值變?yōu)?。應該避免出現(xiàn)這種歧義性。如果編程者的原意是想得到12,可以寫成下列語句:

i=3;

a=i++;

b=i++;

c=i++;

d=a+b+c;執(zhí)行完上述語句后,d的值為12,i的值為6。雖然語句多了,但不會引起奇異,無論程序移植到哪一種C編譯系統(tǒng)運行,結果都一樣。

(2)注意運算符的組合。C語言中有的運算符為一個符號,有的運算符由兩個符號組成,如果有多個運算符連寫在一個表達式中,怎樣組合運算符呢?如i+++j,是理解為(i++)+j,還是理解為i+(++j)呢?C編譯系統(tǒng)在處理時,盡可能多地自左而右,將若干個字符組成一個運算符(在處理標識符、關鍵字時也按同一原則處理)。i+++j被理解為(i++)+j而不是i+(++j)。為避免誤解,最好采取便于理解的寫法,不要寫成i+++j的形式,而應寫成(i++)+j的形式。

(3)注意不同系統(tǒng)在調用函數(shù)時實參數(shù)的求值順序的差異,避免求值奇異。C標準對函數(shù)參數(shù)的求值順序并無統(tǒng)一規(guī)定。例如,i的初值為3,如果有下面的函數(shù)調用語句:

printf("%d,%d",i,i++);

在有的系統(tǒng)中,從左至右求值,輸出“3,3”。在有些系統(tǒng)中,對函數(shù)參數(shù)的求值順序則是自右而左,上面printf函數(shù)中要輸出兩個表達式的值,先輸出第2個表達式i的值3,然后執(zhí)行i++,使i加1變?yōu)?,因此輸出的是“4,3”。為了避免這種求值的奇異,最好改寫成函數(shù)參數(shù)求值與處理順序無關的形式。如將上面的語句改為

j=i++;

printf("%d,%d",j,i);

由于編譯系統(tǒng)的處理方法不同而引起的差異問題,并不是C語言標準,不必死記,必要時上機測試一下即可。但遇到問題時,應知道問題可能出在哪里。

2.4.3賦值運算符與表達式

1.基本的賦值運算符與表達式

“=”就是賦值運算符。用賦值運算符構成表達式的一般形式為

變量=表達式

這里的“=”不是表示數(shù)量相等的關系,而是表示一種“賦值”操作。其作用就是把右側表達式的值賦給左側的變量。也就是說,表達式的運算結果使變量具有賦值號右側表達式的值。從變量的內涵意義來講,就是把右側表達式的值存放到變量所標識的存儲單元中。將賦值表達式作為表達式的一種,使賦值操作也可以出現(xiàn)在賦值語句中,而且還可以出現(xiàn)在其他語句中。這是C語言靈活性的一種表現(xiàn)。賦值運算符的結合方向為“自右至左”,又稱為“右結合性”。如a=b=c=5等價于a=(b=(c=5)),操作次序為:5賦給c,c的值賦給b,b的值賦給a。

例如:

a=5+(c=6)的處理步驟是c=6→5+c→a=5+c,表達式的值為11,變量a的值是11,變量c的值是6。

a=(b=4)+(c=6)的處理步驟是c=6→b=4→b+c→a=b+c,表達式的值為10,變量a的值是10,變量b的值是4,變量c的值是6。

a=(b=10)/(c=2)的處理步驟是c=2→b=10→b/c→a=b/c,表達式的值為5,變量a的值是5,變量b的值是10,變量c的值是2。

程序中的表達式在程序運行時,由計算機自動處理。但在程序設計中,或程序調試中往往需要分析表達式的求值。復雜表達式的求值要根據(jù)運算符的優(yōu)先級和結合性(見附錄C)分析處理順序。初學者最好通過上機運行一個簡單程序來驗證表達式的求值,幫助對復雜表達式求值的理解。

分析:在printf的最后一個輸出項直接寫表達式,輸出結果就是該表達式的值。利用printf函數(shù),可以輸出變量、表達式的值。這里只要模仿使用就行了,關于輸出格式描述符,將在后面章節(jié)介紹。

2.賦值過程中的類型轉換

如果賦值運算符左側變量與右側表達式的類型不一致,在賦值時,系統(tǒng)自動進行類型轉換。類型轉換的一般規(guī)則是:把右側表達式的值轉換為左側變量的類型再進行賦值操作。

(1)將浮點型數(shù)據(jù)(包括單、雙精度)賦給整型變量時,舍棄浮點數(shù)的小數(shù)部分,只將整數(shù)值賦給變量。

VisualC++6.0輸出float型與double型數(shù)據(jù)的有效數(shù)字都是6位,其他系統(tǒng)則未必。

(3)將一個double型數(shù)據(jù)賦給float型變量時,應先將雙精度數(shù)轉換成單精度數(shù),即只截取其前面6~7位有效數(shù)字,存放到float型變量的存儲單元中。應注意被賦值的雙精度數(shù)的大小不超出float型變量的數(shù)值范圍,否則將可能產生溢出。

將一個float型數(shù)據(jù)賦給double型變量時,數(shù)值不變,有效位數(shù)擴展到雙精度型。

(4)字符型數(shù)據(jù)賦給整型變量時,將字符的ASCII代碼賦給整型變量,不存在數(shù)據(jù)丟失問題。

(5)將一個存儲長度長的整型數(shù)據(jù)賦給一個存儲長度短的整型變量時,將按等長度截取低字節(jié)值存放到短變量存儲單元中。

從存儲結構看,353的二進制數(shù)為0000000101100001,將低字節(jié)01100001賦給字符變量c,其十進制數(shù)值為97,對應的是字符?'a'?的ASCII代碼,高字節(jié)將截斷丟失。

一般來說,將存儲長度長的類型數(shù)據(jù)賦給存儲長度短的類型變量,會發(fā)生數(shù)據(jù)截斷丟失的問題,實際應用中要盡量避免。

3.復合賦值運算符與表達式

在賦值運算符“=”之前加上其他運算符,可以構成復合賦值運算符。凡是二目運算符,都可以與賦值運算符一起組合成復合賦值運算符。C語言中有10種復合賦值運算符,即+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。其中,后5種是有關位運算的,將在后面章節(jié)學習。

使用復合賦值運算符,按照一般賦值表達式的形式,可構造出各種表達式。下面是使用復合賦值運算構造表達式的例子:

a+=3等價于

a=a+3

x*=y+8等價于

x=x*(y+8)

x%=3等價于x=x%3

賦值表達式中可以包含復合賦值運算符。例如下面的表達式是一個正確的賦值表達式:

a+=a-=a*a

如果a的初值為12,此賦值表達式的求解步驟如下:

(1)進行(a-=a*a)的運算,相當于a=a-a*a,a的值是12-144=-132;

(2)進行(a+=-132)的運算,相當于a=a+(-132),a的值為-132+(-132)=-264。

2.4.4逗號運算符與表達式

C語言中“,”也可以作為一種運算符,用它將兩個以上表達式連接起來就構成了逗號表達式。逗號表達式的一般形式為

表達式1,表達式2,表達式3,…,表達式n

逗號運算符的作用是將若干表達式“串聯(lián)”起來,確定這些表達式的求值順序。逗號表達式的求值順序是從左到右依次求表達式1,表達式2,…,最后求表達式n的值。逗號運算符在C語言的所有運算符中優(yōu)先級最低,具有左結合性(見附錄C)。事實上,它僅能確定被連接表達式的求值順序。但它作為一個表達式,應該具有值。逗號表達式的值是最后一個表達式的值。下面列舉幾個逗號表達式,分析它們的求值。例如:

3+5,6+8

先求3+5的值,得8,再求6+8的值,得14,逗號表達式的值為14。

再如:

a=3*5,a*4

此表達式是算術表達式、賦值表達式和逗號表達式的混合。根據(jù)運算符的優(yōu)先級和結合性,應該把a=3*5看作逗號表達式中的表達式1,把a*4看作逗號表達式中的表達式2。因此應先求a=3*5的值,經計算和賦值后得到a的值15,再求a*4的值,求解值為60。整個逗號表達式的值為60。又如:

x=(a=3,6*3)

x=a=3,6*3

這兩個表達式是不同的表達式。前一個是賦值表達式,將一個逗號表達式的值賦給x,x的值等于18。后一個是逗號表達式,包括一個賦值表達式和一個算術表達式,x的值為3,整個逗號表達式的值為18。一個逗號表達式可以作為逗號表達式中的表達式,構成復合的逗號表達式。例如:

(a=3*5,a*4),a+5

把(a=3*5,a*4)作為逗號表達式的表達式1,a+5作為逗號表達式的表達式2。(a=3*5,a*4)又是一個逗號表達式,先處理a=3*5,得到a的值為3*5,等于15,再處理a*4,運算結果為15×4=60。處理a+5,得20。整個表達式的值為20。

逗號表達式的求值,尤其是復合逗號表達式的求值不容易理解。下面通過程序的運行來驗證上述表達式的求值。

其實,逗號表達式無非是把若干個表達式“串聯(lián)”起來。在許多情況下,使用逗號表達式的目的只是想分別得到各個表達式的值,而并非一定需要得到整個逗號表達式的值,逗號表達式最常用于循環(huán)語句(for語句)中,詳見第5章。

需注意的是,逗號在逗號表達式中是運算符,但在C語言中也有不作為運算符使用的情況,要根據(jù)逗號出現(xiàn)的地方加以區(qū)分。如函數(shù)參數(shù)列表中用逗號來作為間隔符使用:

printf("%d,%d,%d",a,b,c);

其中的“a,b,c”并不是一個逗號表達式,而是作為3個輸出項間的分隔符。這一點在前面printf函數(shù)的使用中應該有所體會。如果改寫為

printf("%d",(a,b,c));

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論