基本數(shù)據(jù)類型運算符與表達式.ppt_第1頁
基本數(shù)據(jù)類型運算符與表達式.ppt_第2頁
基本數(shù)據(jù)類型運算符與表達式.ppt_第3頁
基本數(shù)據(jù)類型運算符與表達式.ppt_第4頁
基本數(shù)據(jù)類型運算符與表達式.ppt_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

2 基本數(shù)據(jù)類型、運算符與表達式,河南理工大學 C語言程序設(shè)計編寫組,重點、難點,本章重點: C語言的基本數(shù)據(jù)類型 變量的定義、賦值、初始化以及使用方法 基本運算符的運算規(guī)則及優(yōu)先級別 表達式的構(gòu)成規(guī)則和計算 數(shù)據(jù)類型轉(zhuǎn)換的意義和實質(zhì) 本章難點: 數(shù)據(jù)類型的作用及注意事項 自增、自減運算符的使用 運算符優(yōu)先級別 混合表達式運算 類型轉(zhuǎn)換及轉(zhuǎn)換過程中出現(xiàn)的誤差,內(nèi)容提要,2.1 C語言的數(shù)據(jù)類型 2.2常量和變量 2.2.1常量 2.2.2 變量 2.3 整型數(shù)據(jù) 2.3.1 整型常量的表示 2.3.2 整型變量 2.3.3 整型常量的類型 2.4 實型數(shù)據(jù) 2.4.1 實型常量的表示 2.4.2 實型變量 2.4.3 實型常量的類型 2.5字符型數(shù)據(jù) 2.5.1字符型常量 2.5.2 字符變量,內(nèi)容提要,2.6 算術(shù)運算符與算術(shù)表達式 2.6.1 基本算術(shù)運算符 2.6.2 算術(shù)表達式及算術(shù)運算符的優(yōu)先級和結(jié)合性 2.6.3 自增、自減運算符 2.7 賦值運算符與賦值表達式 2.7.1 賦值運算符 2.7.2 復合賦值運算符 2.7.3 賦值表達式 2.8 逗號運算符與逗號表達式 2.9 位運算符 2.9.1 位運算符 2.9.2 位運算復合賦值運算符 2.10 數(shù)據(jù)類型轉(zhuǎn)換與計算類型長度運算符 2.10.1 自動類型轉(zhuǎn)換 2.10.2 強制類型轉(zhuǎn)換 2.10.3計算類型長度運算符,2.1 C語言的數(shù)據(jù)類型,程序主要由算法和數(shù)據(jù)結(jié)構(gòu)兩部分組成。 所謂數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)的組織形式,C語言的數(shù)據(jù)結(jié)構(gòu)以數(shù)據(jù)類型的形式出現(xiàn)。 數(shù)據(jù)類型是指數(shù)據(jù)的內(nèi)部表現(xiàn)形式,是進行C語言程序設(shè)計的基礎(chǔ)。 數(shù)據(jù)類型可以根據(jù)數(shù)據(jù)在加工中的特征來劃分。,C語言規(guī)定,在C程序中使用的每一個數(shù)據(jù)都屬于惟一的一種數(shù)據(jù)類型,沒有無類型的數(shù)據(jù),一個數(shù)據(jù)也不可能同時屬于多種數(shù)據(jù)類型。 C語言的數(shù)據(jù)類型可分為4大類,如圖2-1所示。,1) 基本類型:不可再將其分解為其他類型。 2) 構(gòu)造類型:構(gòu)造類型是根據(jù)已定義的一個或多個數(shù)據(jù)類型用構(gòu)造的方法來定義的。 3) 指針類型:指針是一種特殊的又具有重要作用的數(shù)據(jù)類型,其值用來表示某個量在內(nèi)存儲器中的地址。 4) 空類型:空類型是從語法完整性的角度給出的一種數(shù)據(jù)類型。,每個數(shù)據(jù)都要在內(nèi)存中(個別數(shù)據(jù)可能在寄存器中)分配若干個字節(jié),用于存放該數(shù)據(jù)。 數(shù)據(jù)占用的內(nèi)存字節(jié)數(shù)稱為該數(shù)據(jù)的“數(shù)據(jù)長度”。 不同類型的數(shù)據(jù)的長度是不同的,因此,在使用任何一個數(shù)據(jù)之前,必須對數(shù)據(jù)的類型加以定義,以便為其安排長度合適的內(nèi)存。,2.2 常量和變量,對于基本數(shù)據(jù)類型量,按其取值是否可改變又分為常量和變量兩種。 在程序執(zhí)行過程中,其值不發(fā)生改變的量稱為常量。變量是指其值可以變化的量,變量實質(zhì)上是代表了內(nèi)存中某個存儲單元。,2.2.1 常量,在C語言中,常量也稱為常數(shù),可分為4類:整型常量、實型常量、字符常量和字符串常量。常量的類型由書寫方法自動默認,不需要事先說明。從書寫方式上,常量可以分為字面常量和符號常量兩種。 (1) 字面常量 字面常量又稱直接常量,就是日常所說的常數(shù)。由于從字面上即可直接看出它們是什么,因此稱為“字面常量”。例如: 整型常量:12、0、-3; 實型常量:4.6、-1.23; 字符常量:a、b。,(2) 符號常量 1)標識符 標識符是用戶自定義的一種字符序列,用于表示程序中需要辨認的對象,比如變量、數(shù)組、函數(shù)等對象的名字。 C語言的標識符可以分為關(guān)鍵字、預定義標識符和用戶標識符三類。 關(guān)鍵字是由C語言規(guī)定的具有特定含義的標識符,也稱為保留字。關(guān)鍵字均為小寫,如int、while等; 預定義標識符在C語言中有特定的含義,如printf、include等; 用戶標識符是由用戶根據(jù)需要定義的標識符。,標識符的命名必須遵循如下規(guī)則: C語言規(guī)定,標識符是由字母、數(shù)字和下劃線組成的一串符號,但必須以英文字母或下劃線開頭。例如: area、PI、_ini、a123都是合法的標識符,1se、x-x、a.a、a&b則為非法的標識符。 標識符區(qū)分大小寫。例如sum、SUM和Sum是三個不同的標識符。 在定義用戶標識符時除了要遵循標識符的命名規(guī)則外,還應(yīng)該注意: 不允許使用關(guān)鍵字作為用戶標識符的名字。 用戶標識符命名應(yīng)以直觀且易于拼讀為宜,即做到“見名知意”,最好使用英文單詞及其組合,以便于記憶和閱讀。 用戶標識符與預定義標識符相同時,系統(tǒng)并不報錯,只是該預定義標識符將失去原有含義,代之以用戶確定的含義,或者引發(fā)一些運行時的錯誤。因此建議用戶標識符不要與預定義標識符相同。 ANSI C 沒有規(guī)定標識符長度,但不同的C語言編譯系統(tǒng)都有相應(yīng)的規(guī)定,如MS C規(guī)定長度為8個字符,Turbo C 2.0規(guī)定為32個字符。,2)符號常量 符號常量也稱宏常量,是指用一個標識符代表一個常量,其目的是為了能在程序中明確看出某些常量所表述的對象。符號常量由C語言中的宏定義預處理命令來定義。 符號常量的定義格式如下: #define 符號常量 常量 其中符號常量應(yīng)遵循標識符的命名規(guī)則,習慣上用大寫字母作為符號常量的標識符,而常量可以是任何類型的。符號常量一經(jīng)定義,凡在源程序中使用該符號常量時,都用其后指定的常量來替換。,例2-1 符號常量的使用,#include #define PI 3.14159 #define R 5.3 main() printf(“area=%fn“,PI*R*R); /* 輸出圓面積 */ printf(“circumference=%fn“,2*PI*R); /* 輸出圓周長 */ ,該程序的運行結(jié)果如下: area=88.247263 circumference=33.300854,復習,復習,復習,# define 符號常量 常量,變量,在C語言中,變量必須遵循“先定義、后使用”的原則, 變量定義語句格式如下: 類型標識符 變量名1,變量名2,; 其中,類型標識符說明了變量的類型,如整型、實型和字符型等。變量名屬用戶標識符,應(yīng)遵守標識符命名規(guī)則。編譯時,系統(tǒng)根據(jù)指定的類型分配給變量若干個連續(xù)字節(jié)存儲空間。 在定義變量的同時也可指出它的初值,編譯系統(tǒng)在為變量分配存儲空間時,將該初值存入這個存儲空間,這種方法稱為變量的初始化。格式如下: 類型標識符 變量名=初值; 注意:變量定義語句可放在函數(shù)外,也可放在函數(shù)或復合語句內(nèi)。,2.3 整型數(shù)據(jù),2.3.1 整型常量的表示 整型常量就是整數(shù),用來表示一個正的、負的或零的整數(shù)值。在C語言中,整型常量有十進制、八進制和十六進制等三種數(shù)制表示方法。 1)十進制整數(shù):與日常使用的整數(shù)寫法一樣。例如:0、-143、87等。 2)八進制整數(shù):書寫時,以數(shù)字0開頭,后面是八進制數(shù)字序列,數(shù)字取值范圍為07。例如:00、015、037等均為合法的八進制數(shù),而0539、02A則為非法的八進制數(shù)。 3)十六進制整數(shù):以0x或0X開頭的十六進制數(shù)字序列,數(shù)字取值范圍為09、af或AF。例如0x0、-0xABC、0X9fc等。注意0x 中的0是數(shù)字。,2.3.2 整型變量,(1)整型變量的分類 整型變量用來存放整數(shù),整型變量的基本類型為int型。若加上修飾符,可定義更多的整數(shù)數(shù)據(jù)類型。 整型變量根據(jù)表達范圍可分為:基本整型 (int)、短整型(short int)和長整型(long int)三種,一般微型機中,int型數(shù)據(jù)占兩個字節(jié),long int型占四個字節(jié)。 根據(jù)是否有符號可以分為:有符號型(signed)和無符號型(unsigned)兩種。若未指定是否有符號,則隱含為有符號型(signed)。 兩種分類方法結(jié)合起來可以將整型變量分為6種,表21列出每種數(shù)據(jù)類型所占字節(jié)數(shù)和數(shù)值范圍,方括弧括起來的部分可省略。Turbo C的規(guī)定與表21完全一致,但有的系統(tǒng)略有差別。,表2-1 整型變量的類型,1.3 算法及其描述,(2)整型變量的定義 在定義整型變量時,某些類型修飾符可以省略,參照表2-1。例如: int a,b,c; /* a,b,c為有符號整型變量 */ long x,y; /* x,y為有符號長整型變量 */ unsigned p,q; /* p,q為無符號整型變量 */,(3)整型數(shù)據(jù)在內(nèi)存中的存放形式 數(shù)據(jù)在內(nèi)存中是以二進制形式存放的。對于有符號整型數(shù)來說,存儲單元的最高位是符號位(如int型,從右向左依次為第0位、第1位,最高位指第15位),使用0表示正數(shù),1表示負數(shù),其余為數(shù)值位。無符號整型數(shù)沒有符號位,其存儲單元全部二進制位都用于存放數(shù)值,因而無符號整型變量不能存儲負數(shù)。int型有符號變量和無符號變量在表示最大數(shù)時,內(nèi)存的存儲如圖22所示。,符號位,signed int,unsigned int,圖22 int型有符號整型和無符號整型最大數(shù)的表示,實際上,整型數(shù)據(jù)是以補碼的形式來存儲的。正數(shù)的補碼與原碼相同;對于負數(shù)來說,將原碼的符號位保持不變,數(shù)值位逐位取反(變?yōu)榉创a),末位(即最右邊的那一位)加1,即得補碼。也就是說,一個負數(shù)的補碼等于該負數(shù)的反碼與末位加1之和。例如,求10的補碼(設(shè)為2個字節(jié)),步驟如下。 寫出10的原碼:1000000000001010 數(shù)值位取反,得10的反碼:1111111111110101 末位加1,得-10的補碼:1111111111110110 有時需要將二進制的補碼轉(zhuǎn)換成十進制數(shù),步驟如下(以補碼1111111111110110為例)。 各數(shù)值位取反,得1000000000001001 位加1,得1000000000001010 轉(zhuǎn)換為十進制,得-10 即,負數(shù)的補碼的補碼就是原碼。,4)整型數(shù)據(jù)的溢出 在Turbo C中一個int型變量的最大允許值為32767,如果再加1,會出現(xiàn)什么情況?我們可以通過一個例子來加以說明。 例2-2 整型數(shù)據(jù)的溢出 main( ) int a,b; a=32767; b=a+1; printf(“%d,%d“,a,b); a和b的存儲示意圖如圖23所示。,圖23 a和b的存儲示意圖,2.3.3 整型常量的類型,整型常量也有短整型、長整型、有符號和無符號之分。在16位字長的機器上,整型常量占用2個字節(jié)的存儲空間,此為短整型;而長整型常量占用4個字節(jié)的存儲空間,書寫時,需要在整數(shù)的末尾要加上字母L或l。例如148L(十進制長整型數(shù))、013L(八進制長整型數(shù))、0x16L(十六進制長整型數(shù))等。 在表示無符號整型常量時,需要在數(shù)值后添加字母U或u作為后綴。例如358u、0x38Au、235LU等都是無符號整型常量。八進制和十六進制數(shù)通常是無符號數(shù)。 注意長短整數(shù)所占的字節(jié)及不同進制的表示,如20和20L雖然有相同的數(shù)值,但在內(nèi)存中卻占用不同數(shù)量的字節(jié);再如10、010、0x10等都是短整型常量,但它們卻表示不同的數(shù)值。,2.4 實型數(shù)據(jù),2.4.1 實型常量的表示 實型常量也稱浮點型常量、實數(shù)或浮點數(shù)。在C語言中,實型常量的表示采用十進制,它的書寫方式有兩種: 1) 小數(shù)形式 即數(shù)學中常用的實數(shù)形式,由數(shù)碼09和小數(shù)點組成。例如,0.0、25.0、5.789、0.13、5.0、300.、-267.8230等均為合法的實數(shù)。注意,必須有小數(shù)點。 2) 指數(shù)形式 指數(shù)形式也稱為科學記數(shù)法,由尾數(shù)、階碼標志“e”或“E”以及階碼(只能為整數(shù),可以帶符號)組成。 例如,2.1E5 (等于2.1105),3.7E-2 (等于3.710-2),0.5E7 (等于0.5107),-2.8E-2 (等于-2.810-2)都是合法的;而345 (無小數(shù)點),E7 (階碼標志E之前無數(shù)字),-5 (無階碼標志),53.-E3 (負號位置不對),2.7E(無階碼)都不是合法的實型數(shù)。 需要注意的是,采用指數(shù)形式表示實型常量時,在字母e或E的前后及數(shù)字之間不能插入空格。,2.4.2 實型變量,(1) 實型變量的分類 實型變量又稱浮點變量,用來存放實型數(shù)。實型變量分為單精度(float)、雙精度(double)和長雙精度型(long double)三種類型。但ANSI C 并未規(guī)定每種類型數(shù)據(jù)的長度、精度和數(shù)值范圍。表2-2列出微機上常用的C編譯系統(tǒng)的情況,不同的編譯系統(tǒng)會有差異。,(2) 用流程圖描述算法,表2-2 實型變量的數(shù)據(jù)類型,(2) 實型變量的定義 float a=1.5,b=0.35,c; /* 定義a、b、c單精度實型變量,并對a、b初始化 */ double x,y,z; (3) 實型數(shù)據(jù)在內(nèi)存中的存放形式 與整型數(shù)據(jù)的存儲方式不同,實型變量是按照指數(shù)形式存儲的。系統(tǒng)將實型數(shù)據(jù)分為小數(shù)部分和指數(shù)部分,分別存放。例如實數(shù)31.4159,在內(nèi)存中的存放形式如圖24所示。,例1-3的流程圖,(4) 實型變量的舍入誤差 由于實型變量是用有限的存儲單元存儲的,因此提供的有效數(shù)字是有限的,在有效位以外的數(shù)字將被舍去,由此可能會產(chǎn)生一些誤差。 例2-3 實型變量的舍入誤差。 main() float a,b; a=123456.789e5; b=a+20; printf(“a=%fn“,a); printf(“b=%fn“,b); 由于a 是單精度浮點型,其有效數(shù)字為7位,后面的數(shù)字是無意義的數(shù)字。因而把20加在后幾位上,是無意義的。故本例程序運行的結(jié)果是: a=12345678848.000000 b=12345678848.000000,2.4.3 實型常量的類型,C編譯系統(tǒng)將實型常量當作雙精度來處理。 如果要指定一個實型常量為單精度型,可在其后加后綴f或F作為單精度數(shù)來處理。 例如,4.5E1F、-4.5E-2F等。,2.5字符型數(shù)據(jù),2.5.1字符型常量 (1)字符常量 C語言中,用單引號括起來的一個字符稱為字符常量。例如,a、b、=、+、?等都是字符常量。 在內(nèi)存中,每個字符常量都占用一個字節(jié),具體存放的是該字符對應(yīng)的ASCII代碼值。如a、A、1在內(nèi)存的字節(jié)中存放的分別是十進制整數(shù)97、65和49。因此在C語言中,一個字符常量可以看成是“整型常量”,其值就是ASCII代碼值,例如:a+5、A-5、1+10分別等于整數(shù)值102、60、59。 在語言中,字符常量有以下特點: 字符常量只能用單引號括起來,不能用雙引號或其它括號。 字符常量只能是單個字符, 因此abc是非法的。 C語言規(guī)定,字母是區(qū)分大小寫的,所以a和A是不同的字符常量。,(2)轉(zhuǎn)義字符 把字符放在一對單引號的做法,適合于多數(shù)可打印字符,但是某些控制字符(如回車符、換行符等)和一些ASCII字符卻無法使用字符常量進行表示。因此,C語言中引入了一種特殊形式的字符常量轉(zhuǎn)義字符。轉(zhuǎn)義字符以反斜線“”開頭,后跟一個或幾個字符。因為此形式將反斜杠后面的字符賦予了新的含義,故稱“轉(zhuǎn)義”字符。常用的轉(zhuǎn)義字符及其含義如表2-3所示。,表2-3常用的轉(zhuǎn)義字符及其含義,(3)字符串常量,字符串常量是由一對雙引號括起的字符序列。例如,“CHINA“,“C program“, “12365478“ 等都是合法的字符串常量。 前面介紹的轉(zhuǎn)義字符也可以出現(xiàn)在字符串中,例如,“ ABCD“、“101102x34x44“等都是字符串,分別表示“ABCD”、“ABCD”兩個字符串。要特別注意雙引號是字符串的定界標符,所以在字符串中使用雙引號必須使用轉(zhuǎn)義字符“”。例如:“ABCD“是表示“ABCD“”這一串字符的。,字符串常量和字符常量的區(qū)別:,字符常量由單引號括起來,字符串常量由雙引號括起來。 字符常量只能是單個字符,字符串常量可以為空字符串,也可以含一個或多個字符。 可以把一個字符常量賦予一個字符變量,由于在語言中沒有字符串變量,因而不能把一個字符串常量賦予一個字符串變量。但可以用一個字符數(shù)組來存放一個字符串常量(參見第6章)。 字符常量占一個字節(jié)的內(nèi)存空間。字符串常量占的內(nèi)存字節(jié)數(shù)等于字符串中字符數(shù)加1,增加的一個字節(jié)由系統(tǒng)自動存入字符“0“ (ASCII碼為0),作為字符串結(jié)束的標志。,2.5.2 字符變量,字符變量用于存放單個字符常量,使用關(guān)鍵字char來定義。 例如: char c1=x,c2=y,c3; char optr;,由于字符的值是以ASCII碼的形式存放,所以可以把字符變量看成是整型變量。C語言允許對整型變量賦以字符值,也允許對字符變量賦以整型值。 在格式化輸出時,允許把字符變量按整型變量輸出,也允許把整型變量按字符變量輸出。整型變量為二字節(jié)變量,字符變量為單字節(jié)量,當整型量按字符型量處理時,只有低八位字節(jié)參與處理。,例2-4 字符變量的值,main() char a=97,b=98; printf(“%c,%cn%d,%dn “,a,b,a,b); 上面程序中,a、b為字符型變量,但在賦值語句中賦予整型值。a、b值的輸出形式取決于printf函數(shù)格式中的格式控制符;當格式控制符為%c時,輸出的變量值為字符,當格式控制符為%d時,對應(yīng)輸出的變量值為整數(shù), 程序運行的結(jié)果為: a,b 97,98,2.6 算術(shù)運算符與算術(shù)表達式,運算是對數(shù)據(jù)的處理操作,參加運算的數(shù)據(jù)稱為運算對象(也稱運算量或操作數(shù)),運算對象可以是常量、變量、函數(shù)或表達式。 標識運算的符號稱為運算符,若按運算時運算對象的個數(shù)可分為單目運算符(單目運算是指對一個操作數(shù)進行操作)、雙目運算符、三目運算符等幾類。用運算符和括號把運算量連接起來的、符合C語言語法規(guī)則的式子稱為運算表達式。凡是表達式都有一個值,即運算結(jié)果。,2.6.1 基本算術(shù)運算符,基本算術(shù)運算符是對數(shù)據(jù)進行簡單算術(shù)運算的,共有+(加)、-(減)、*(乘)、/(除)、%(求余)等5個。這些運算符都為雙目運算符。在使用基本算術(shù)運算符應(yīng)注意以下幾點: 加(+)、減(-)、乘(*)運算和普通運算中的加法、減法和乘法相同。例如,2.1+3.6的結(jié)果是5.7;2.1*3的結(jié)果是6.3。 如果雙目運算符兩邊的運算對象的類型不一致,如一邊是整型,另一邊是實型時,系統(tǒng)自動把整型數(shù)據(jù)轉(zhuǎn)化為實型數(shù)據(jù),使運算符兩邊的類型達到一致后,再進行運算,其轉(zhuǎn)換規(guī)律見本章后續(xù)內(nèi)容。, 雙目除運算的結(jié)果與運算對象的數(shù)據(jù)類型有關(guān)。當兩個整數(shù)相除時,其結(jié)果為整數(shù)。如14/5的結(jié)果為2。 使用求余運算符(%)時,要求運算符兩邊運算量必須為整型。在運算符左側(cè)的運算量為被除數(shù),右側(cè)的運算量為除數(shù),運算結(jié)果是兩數(shù)相除后所得的余數(shù)。在Turbo C中,所得結(jié)果的符號與被除數(shù)相同。例如17%-3的結(jié)果為2,-19%4的結(jié)果為-3。 C語言中,所有實型數(shù)的運算均以雙精度方式進行。若是單精度,則在尾數(shù)部分補0,使之轉(zhuǎn)化為雙精度數(shù)。 正負號運算符為+(正號)和-(負號)時,它們?yōu)閱文窟\算符。,2.6.2 算術(shù)表達式及算術(shù)運算符的優(yōu)先級和結(jié)合性,(1) 算術(shù)表達式 用算術(shù)運算符將運算對象連接起來的表達式稱為算術(shù)表達式。一個表達式有一個值及其類型,它們等于計算表達式所得結(jié)果的值和類型。 以下是算術(shù)表達式的例子: a+b (a*2)c (x+r)*8-(a+b)7 在C語言中,算術(shù)表達式求值規(guī)律與數(shù)學中的四則運算的規(guī)律類似,其運算規(guī)則和要求如下: 在表達式中,可使用多層圓括號,但左右括號必須配對,運算時從內(nèi)層圓括號開始,由內(nèi)向外以此計算表達式的值。 在算術(shù)表達式中,若包括不同優(yōu)先級的運算符,則按運算符的優(yōu)先級別由高到低進行,若表達式中運算符的級別相同,則按運算符的結(jié)合方向進行。,(2) 算術(shù)運算符的優(yōu)先級 C語言規(guī)定了運算符的優(yōu)先級和結(jié)合性。當表達式中出現(xiàn)多個運算符時,就會碰到哪個先算,哪個后算的問題,這個問題稱為運算符的優(yōu)先級。若一個運算對象兩側(cè)有不同的運算符,應(yīng)先執(zhí)行“優(yōu)先級別”高的運算,例如先乘除后加減。表達式a-b*c,b的左側(cè)為減號,右側(cè)為乘號,乘號的優(yōu)先級高于減號,因此相當于a-(b*c)。,(3) 算術(shù)運算符的結(jié)合性 如果在一個運算對象的兩側(cè)有兩個優(yōu)先級相同的運算符,則按結(jié)合方向順序處理。語言中各運算符的結(jié)合方向有兩種,即自左至右(稱為左結(jié)合性)和自右至左(稱為右結(jié)合性)。同級單目算術(shù)運算符的結(jié)合性是自右向左,同級雙目算術(shù)運算符的結(jié)合性是自左向右。例如,在計算表達式x-y+z時,y先與“-”號結(jié)合,執(zhí)行x-y運算,然后再執(zhí)行+z的運算。有些運算符的結(jié)合方向為“自右至左”,即右結(jié)合性(例如,賦值運算符,具體例子在后面介紹)?;舅阈g(shù)運算符的運算對象、運算規(guī)則、運算結(jié)果及結(jié)合性如表2-4所示。,表2-4 基本算術(shù)運算符,2.6.3 自增、自減運算符,自增運算符“+”和自減運算符“-”都是單目運算符,自右向左結(jié)合,作用是使變量的值增1或減1,結(jié)果再存回原變量。它們既可以作前綴運算符(位于運算對象的前面),例如+x和-x,也可以作后綴運算符(位于運算對象的后面),例如x+和x-。 在只需對變量本身進行加1或減1而不考慮表達式值的情況下,前綴運算和后綴運算的效果完全相同,否則,結(jié)果是有區(qū)別的。,(1)+i, -i 在使用i之前,先使i的值加1或減1 (2)i+,i- 在使用i之后,使i的值加1或減1 即:先使用運算對象,后對運算對象加1或減1,請思考下列程序的輸出結(jié)果,#include “stdio.h” main() int i=0,j; j=i+; printf(“%d %dn”,i,j); i=0; j=+I; printf(“%d %dn”,i,j); ,例2-5 自增、自減運算符的使用。,main() int i=5,x; x=i+; /* 后綴運算,先把i的值賦給x,然后i的值加1 */ printf(“i=%d,x=%dn“,i,x); /* i的值為6,x的值為5*/ printf(“%dt“,+i); /* 前綴運算,先把i的值加1,然后輸出i */ printf(“%dt“,-i); /* 表達式-i的值為6 */ printf(“%dt“,i-); /* 表達式i-的值為6 */ printf(“%dt“,-i+); printf(“%dn“,-i-); 程序運行結(jié)果如下: i=6,x=5 7 6 6 -5 -6,使用自增、自減運算符時應(yīng)注意:, 自增、自減運算符含有賦值的功能,其運算對象可以是整型、實型、字符型、指針型變量或數(shù)組元素,但不能是常量和表達式,因為不能給常量或表達式賦值。 C語言規(guī)定,當出現(xiàn)難以區(qū)分的若干個+或-組成運算符串時,自左向右取盡可能多的符號組成運算符。如i+j應(yīng)理解為(i+)+j,而不是i+(+j)。 不要在一個表達式中對同一個變量進行多次諸如i+或+i等運算,例如寫成:i+*+i+i-*-i,這種表達式不僅可讀性差,而且不同的編譯系統(tǒng)對這樣的表達式將作不同的解釋,因而所得結(jié)果也各不相同。,2.7 賦值運算符與賦值表達式,2.7.1 賦值運算符 賦值運算符“=”是雙目運算符,其左邊必須是變量,右邊是表達式。賦值運算符的功能是先求出右邊表達式的值,然后把此值賦給左邊的變量。確切的說,是把數(shù)據(jù)放入該變量為標識的存儲單元中去,將原有的數(shù)據(jù)替換掉。例如,若a和b都被定義成int型變量 a=50 /* 把常量50賦給變量a */ b=a /* 把a中的值賦給變量b,a中的值不變 */,使用賦值運算符應(yīng)注意以下幾點:, 賦值運算符具有自右向左的結(jié)合性,其優(yōu)先級只高于逗號運算符,比任何其他運算符的優(yōu)先級都低。例如:表達式a=b=c=9,c的兩邊都是賦值運算符,賦值運算符的結(jié)合為“自右至左”的,即右結(jié)合性。根據(jù)自右至左的原則,相當于對表達式a=(b=(c=9)進行運算。 賦值運算符不同于數(shù)學中的“等于號”,這里不是等同的關(guān)系,而是進行“賦予”的操作。因此對于表達式n=n+1來說,它不是一個合法的數(shù)學表達式,但是一個合法的賦值表達式,其作用是取變量n中的值加1后再放入到變量n中。 賦值運算符的左側(cè)只能是變量而不能是常量或表達式。如a=7+1=b則不是合法的賦值表達式。,2.7.2 復合賦值運算符,在賦值運算符之前加上其他運算符可以構(gòu)成復合賦值運算符。C語言規(guī)定可以使用10種復合賦值運算符,分為算術(shù)復合賦值和位運算復合賦值。復合賦值運算符的優(yōu)先級與簡單賦值運算符的優(yōu)先級相同,且結(jié)合方向也是自右向左。算術(shù)復合賦值運算符的運算對象、運算規(guī)則與結(jié)果如表2-5所示,位運算復合賦值后面介紹。,表2-5 算術(shù)復合賦值運算符,2.7.3 賦值表達式,由賦值運算符將一個變量和一個表達式連接起來的式子稱為賦值表達式。賦值運算符具有右結(jié)合性。因此 a=b-=c+=5 可理解為 a=(b-=(c+=5) 再例如,式子: x=(a=5)+(b=8) 是合法的。它的意義是把5賦予a,8賦予b,再把a,b相加,和賦予x,故x等于13。,2.8 逗號運算符與逗號表達式,在C語言中,“,”稱為逗號運算符,其功能是把兩個或多個表達式連接起來,組成一個表達式,稱為逗號表達式。其形式如下: , 逗號表達式的結(jié)合性為從左到右,即先計算表達式1,再計算表達式2,最后計算表達式n。最后一個表達式的值就是逗號表達式的值。 逗號優(yōu)先級在所有運算符中是最低的。,例2-6 逗號運算符。,main() int x,a; x=(a=3,6*3); printf(“a=%d,x=%dn“,a,x); x=a=3,6*a; printf(“a=%d,x=%dn“,a,x); 表達式x=(a=3,6*3)中,x的值等于表達式6*3的值;在表達式x=a=3,6*a中, 由于逗號運算符的優(yōu)先級最低,因此x的值應(yīng)等于a的值,都為3。程序運行的結(jié)果應(yīng)為: a=3,x=18 a=3,x=3,2.9 位運算符,2.9.1 位運算符 位運算是一種對運算對象按二進制位進行操作的運算。位運算不允許只操作其中的某一位,而是對整個二進制位進行操作。在C語言中,位運算的對象只能是整型或字符型數(shù)據(jù),不能是其他類型的數(shù)據(jù),其運算結(jié)果仍是整型或字符型數(shù)據(jù)。,(1) “按位取反”運算,運算符是位運算中唯一的一個單目運算符,運算對象在運算符的右邊,具有右結(jié)合性。其功能是對運算對象的各二進位按位求反,即使每一位上的0變1;變1為0。 例如9的運算結(jié)果為-10,即將9的二進制0000000000001001按位求反后為:1111111111110110,這是補碼表示,轉(zhuǎn)換為原碼,寫成十進制,就是-10。,(2) “左移”運算,左移運算符“”是雙目運算符。運算符左邊是移位對象,右邊是整型表達式,代表左移的位數(shù)。其功能把“ ”左邊的運算數(shù)的各二進位全部左移若干位,左移時,右端(低位)補0,左端(高位)移出的位數(shù)丟失,即高位丟棄,低位補0。 例如:a4 是把a的各二進位向左移動4位。如a=00010011(十進制19),左移4位后為00110000(十進制48),其中左端移出的0001四位丟棄,低位補0000。,(3) “右移”運算,右移運算符“”是雙目運算符。其功能是把“ ”左邊運算對象的各二進位全部右移若干位,“”右邊的整形表達式指定移動的位數(shù)。 例如: 設(shè) int a=15,b; b=a2 表示把0000000000001111中每位二進制數(shù)右移兩位,其結(jié)果為0000000000000011(十進制3)(注意a的值并沒有改變)。 應(yīng)該說明的是,對于有符號數(shù),在右移時,符號位將隨同移動。當為無符號整數(shù)或正整數(shù)時,最高位補0;而為負數(shù)時,最高位位補1。,(4) “按位與”運算,按位與運算符“&”是雙目運算符。其功能是參與運算的兩個運算對象各對應(yīng)的二進位分別進行“與”運算。只有對應(yīng)的兩個二進位均為1時,結(jié)果位才為1,否則為0。參與運算的數(shù)以補碼方式出現(xiàn)。 例如:9&(-5)可寫算式如下: 00000000 00001001 (9的二進制補碼) &11111111 11111011 (-5的二進制補碼) 00000000 00001001 (9的二進制補碼) 可見9&(-5)=9。 按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 ,保留低八位,可作a&255運算( 255 的二進制數(shù)為0000000011111111)。,(5) “按位異或”運算,按位異或運算符“”是雙目運算符。其功能是參與運算的兩個運算對象各對應(yīng)的二進位相異或,當兩對應(yīng)的二進位相同時,則該位的結(jié)果為0;數(shù)不同,則該位的結(jié)果為1。參與運算數(shù)仍以補碼出現(xiàn),例如95可寫成算式如下: 00001001 00000101 00001100 (十進制為12),(6) “按位或”運算,按位或運算符“|”是雙目運算符。其功能是參與運算的運算對象各對應(yīng)的二進位相或。只要對應(yīng)的二個二進位有一個為1時,結(jié)果位就為1。參與運算的兩個數(shù)均以補碼出現(xiàn)。 例如:9|5可寫算式如下: 00001001 |00000101 00001101 (十進制為13)可見9|5=13,需要說明的是,當兩個運算對象類型不同時位數(shù)亦會不同。遇到這種情況,系統(tǒng)會進行如下處理: 先將兩個運算對象右端對齊。 再將位數(shù)短的一個運算對象往高位擴充,即:無符號數(shù)和正整數(shù)左側(cè)用0補全;負數(shù)左側(cè)用1補全;然后對位數(shù)相等的這兩個運算對象,按位進行位運算。,2.9.2 位運算復合賦值運算符,前面所介紹的五種雙目位運算符與賦值運算符結(jié)合可以組成擴展的位運算符合賦值運算符,其表示形式及含義如表2-6所示。,表2-6 位運算賦值運算符及含義,2.10 數(shù)據(jù)類型轉(zhuǎn)換與計算類型長度運算符,C語言允許參加運算數(shù)據(jù)值的類型相互轉(zhuǎn)換,轉(zhuǎn)換的方法有兩種:自動類型轉(zhuǎn)換和強制類型轉(zhuǎn)換。 2.10.1 自動類型轉(zhuǎn)換 當不同類型的數(shù)據(jù)在表達式中進行混合運算時,首先它們要先轉(zhuǎn)換成同一類型,然后進行運算,轉(zhuǎn)換由編譯系統(tǒng)自動完成。,(1) 算術(shù)轉(zhuǎn)換 當自動轉(zhuǎn)換用于算術(shù)運算(加、減、乘、除、取余及負號運算)時可稱之為算術(shù)轉(zhuǎn)換。 轉(zhuǎn)換的原則是:自動將精度低、表示范圍小的運算對象類型向精度高、表示范圍大的運算對象類型轉(zhuǎn),以便得到較高精度的運算結(jié)果。 具體轉(zhuǎn)換規(guī)則如圖25所示。,說明: 圖中橫向向左指的箭頭為必定轉(zhuǎn)換的類型,即將表達式中的char或short全部自動轉(zhuǎn)換為相應(yīng)的int型;將float轉(zhuǎn)換為double型。 圖中縱向的箭頭表示當一個運算符兩端的運算對象類型不一致時,按低級別數(shù)據(jù)類型指向高級別數(shù)據(jù)類型轉(zhuǎn)換的原則進行轉(zhuǎn)換,以保證不降低精度。同時,縱向箭頭的方向僅表示數(shù)據(jù)類型級別的高低,而并不表示需要逐級轉(zhuǎn)換。,例如,有下面表達式 A+(y5)*9/x 其中x為float型,y為double型,計算時類型自動轉(zhuǎn)換過程如下。 將整型5轉(zhuǎn)換為double型,然后減法運算,結(jié)果為double型; 將整型9轉(zhuǎn)換為double型后進行乘法運算,結(jié)果為double型; 將x轉(zhuǎn)換為double型后進行除法運算,結(jié)果為double型; 將A轉(zhuǎn)換為double型后進行加法運算,最后結(jié)果為double型;,(2) 賦值轉(zhuǎn)換,在賦值運算中,只有在賦值號右側(cè)表達式的類型與左側(cè)變量類型完全一樣時,賦值操作才能進行。如果賦值運算符兩側(cè)的數(shù)據(jù)類型不一致,系統(tǒng)自動先把右側(cè)表達式

溫馨提示

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

評論

0/150

提交評論