




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第二章C語言的基本數(shù)據(jù)類型及運(yùn)算2.1標(biāo)識符與關(guān)鍵字
2.2數(shù)據(jù)類型2.3常量2.4變量2.5運(yùn)算符2.6表達(dá)式2.7數(shù)據(jù)類型、運(yùn)算符與表達(dá)式舉例習(xí)題2.1標(biāo)識符與關(guān)鍵字2.1.1標(biāo)識符標(biāo)識符是C語言編程時用來標(biāo)志識別的符號??梢远x各種標(biāo)識符作為變量名、數(shù)組名、函數(shù)名、標(biāo)號及用戶定義對象的名稱。
ANSIC規(guī)定標(biāo)識符必須是由字母或下劃線開頭,隨后跟字母,數(shù)字或下劃線任意組合而成的字符序列。下面是幾個正確與不正確的標(biāo)識符名稱:正確不正確Count 1counttest123 hi!therehigh_balancehigh..balancePIa+b
說明:
(1)與有些程序設(shè)計(jì)語言的規(guī)定不同,在C語言中,標(biāo)識符中大小寫字母是有區(qū)別的。程序中基本上都采用小寫字母表示各種標(biāo)識符,如變量名、數(shù)組名、函數(shù)名等。書寫的各種語句也均用小寫字母,而大寫字母只用來定義宏名等,用的不多。
(2)不同的系統(tǒng)對標(biāo)識符的長度有不同的要求,有的要求為6個字符,有的允許使用8個字符,而VisualC++系統(tǒng)下的有效長度為1~247個字符。
(3)除了少數(shù)工作單元我們用單個字符作標(biāo)識符,一般的應(yīng)做到見名知義,以提高程序的可讀性并易于與C++接軌。如用sum表示和,score表示成績,max表示最大等等。2.1.2關(guān)鍵字
ANSIC規(guī)定了32個關(guān)鍵字(保留字),不能再用作各種標(biāo)識符。下面列出32個關(guān)鍵字:
auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,long,register,return,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile,while它們用來表示C語言本身的特定成分,具有相應(yīng)的語義,可構(gòu)成所有的C語言語句。
C語言還使用下列12個標(biāo)識符作為編譯預(yù)處理的命令單詞,但使用時前面應(yīng)加“#”:
define,elif,else,endif,error,if,ifdef,ifndef,include,line,progma,undef關(guān)鍵字或命令單詞后必須有空格、圓括號、尖括號、雙引號等分隔符,否則與其它字符一起組成新的標(biāo)識符。如#definePI3.1415。2.2數(shù)據(jù)類型程序處理的對象是數(shù)據(jù)。數(shù)據(jù)有許多種類,例如數(shù)值數(shù)據(jù)、文字?jǐn)?shù)據(jù)、圖像數(shù)據(jù)以及聲音數(shù)據(jù)等,其中最基本的也是最常用的是數(shù)值數(shù)據(jù)和文字?jǐn)?shù)據(jù)。無論什么數(shù)據(jù),在對其進(jìn)行處理時都要先存放在內(nèi)存中。顯然,不同類型的數(shù)據(jù)在存儲器中的存放格式也不相同。也就是說,不同類型的數(shù)據(jù)所占內(nèi)存長度可能不同,數(shù)據(jù)表達(dá)形式也可能不同,其值域(允許的取值范圍)也各不相同。在C語言中,數(shù)據(jù)類型可分為基本類型、構(gòu)造類型和指針類型三類,如圖2.1所示。圖2.1數(shù)據(jù)類型的分類2.2.1基本數(shù)據(jù)類型
1.基本數(shù)據(jù)類型的分類在C語言中有四種基本數(shù)據(jù)類型:字符型、整型、實(shí)型(單精度實(shí)型和雙精度實(shí)型)和無值型。通常情況下,這些數(shù)據(jù)類型的長度(占內(nèi)存二進(jìn)制位數(shù))和值域如表2.1所示。表2.1C語言基本數(shù)據(jù)類型的長度和值域字符型(char)變量用于存儲ASCII碼字符,也可存儲8位二進(jìn)制數(shù)。整型(int)變量用于存儲整數(shù)。因其字長有限,故可表示的整數(shù)的范圍也有限。單精度實(shí)型(float)和雙精度實(shí)型(double)變量用于存儲實(shí)數(shù),實(shí)數(shù)具有整數(shù)和小數(shù)兩部分或是帶指數(shù)的數(shù)據(jù)。表中的值域用絕對值表示。無值型(void)有兩種用途:第一是明確地表示一個函數(shù)不返回任何值;第二是產(chǎn)生同一類型的指針。這兩個用途都將在后續(xù)章節(jié)中討論。
2.類型修飾符除了無值類型外,基本數(shù)據(jù)類型可以帶有各種修飾前綴。修飾符用于明確基本數(shù)據(jù)類型的含義,以準(zhǔn)確地適應(yīng)不同情況下的要求。類型修飾符種類如下:
signed有符號
unsigned無符號
long長
short短上述四個修飾符可用于字符型和整型的基本類型,此外,long還可用于雙精度實(shí)型。整型數(shù)定義后的缺省狀態(tài)為signed和short型,故此二修飾符可省略。表2.2依據(jù)ANSI標(biāo)準(zhǔn)列舉了全部允許的數(shù)據(jù)類型及它們的長度和取值范圍。表2.2C語言基本類型及其修飾符的所有組合2.2.2構(gòu)造數(shù)據(jù)類型為了程序的處理方便,我們還需要構(gòu)造其它數(shù)據(jù)類型來適應(yīng)我們的需要。如處理一個句子時,用字符類型就需要很多簡單變量,非常不方便,此時我們就構(gòu)造一個字符數(shù)組(或字符串)來處理。數(shù)組是一組連續(xù)、有序的存放在一起的具有相同類型的數(shù)據(jù)。結(jié)構(gòu)體是將不同類型的數(shù)據(jù)按一定順序存放在一起的數(shù)據(jù)結(jié)構(gòu)。共用體是將不同類型的數(shù)據(jù)都存放在同一起始地址的內(nèi)存單元中,共用一段內(nèi)存以節(jié)省內(nèi)存單元。枚舉,顧名思義,“枚”是量詞,相當(dāng)于“個”,“舉”是指將變量的值一一列舉出來。實(shí)際上是用符號來表示若干個可取的整型值,它是整型的一個子集。構(gòu)造類型的內(nèi)容我們將在后續(xù)章節(jié)中詳細(xì)討論。2.2.3指針類型指針是C語言中一個重要的概念。正確而靈活地運(yùn)用它,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動態(tài)分配內(nèi)存;能方便地使用字符串;能有效而方便地使用數(shù)組;在調(diào)用函數(shù)時能得到多于一個的值;能直接處理內(nèi)存地址等。指針類型迥異于前述各種數(shù)據(jù)類型,不管是簡單類型的數(shù)據(jù),還是構(gòu)造類型數(shù)據(jù),均是代表數(shù)據(jù)的,而指針類型是代表地址的。前述各種數(shù)據(jù)類型均要存放在內(nèi)存中,不管其占用多少個內(nèi)存單元,其第一個單元的地址是最重要的,可以利用這個地址來引用該類型的數(shù)據(jù),故可以將此首地址存放在一個變量中,這個變量即是指針型變量,我們簡稱指針。指針是C語言的特色所在,既是重點(diǎn)又是難點(diǎn),我們將在第八章詳細(xì)討論。2.3常量在C語言中,常量具有固定的值,且在程序運(yùn)行過程中保持不變。它們可以是任何一種類型的數(shù)據(jù)。2.3.1數(shù)值常量數(shù)值常量我們平時也稱為常數(shù)。從類型分有整型常量、單精度實(shí)型常量和雙精度常量。
1.整型常量整型常量也稱為整型常數(shù)或整數(shù)。
C整型常量按進(jìn)制分可分為十進(jìn)制整數(shù)、八進(jìn)制整數(shù)和十六進(jìn)制整數(shù)。
1)十進(jìn)制整數(shù)十進(jìn)制整數(shù)以正、負(fù)號開頭,后跟0~9的若干位數(shù)字構(gòu)成。如123,-459,0等。采用不同整型數(shù)據(jù)類型表示整數(shù)時,由于不同類型所占內(nèi)存空間大小不一樣,其表示范圍也不一樣。若占用字節(jié)數(shù)為n,則該整數(shù)的取值范圍為-2n-1~2n-1-1。如整型占兩個字節(jié),16位,則其取值范圍是-216-1~216-1-1,即在-32768~32767之間。
2)八進(jìn)制整數(shù)八進(jìn)制整數(shù)是以正、負(fù)號開頭,第一位數(shù)字一定是0,作為八進(jìn)制的標(biāo)志,后面跟0~7的數(shù)字。如八進(jìn)制數(shù)0123,相當(dāng)于十進(jìn)制數(shù)83;八進(jìn)制數(shù)-012,相當(dāng)于十進(jìn)制數(shù)-10。
3)十六進(jìn)制整數(shù)十六進(jìn)制整數(shù)是以正、負(fù)號開頭,前兩位為0x,后面跟0~9和a~f的數(shù)字。其中a代表10,b代表11,其余類推。如十六進(jìn)制數(shù)0x123,相當(dāng)于十進(jìn)制數(shù)291;十六進(jìn)制數(shù)-0x12,相當(dāng)于十進(jìn)制數(shù)-18。
4)二進(jìn)制數(shù)、字節(jié)、字、位計(jì)算機(jī)內(nèi)所有的信息均用二進(jìn)制表示,即計(jì)算機(jī)內(nèi)只有0和1,也只認(rèn)識由0和1組成的程序或數(shù)據(jù)。為什么在計(jì)算機(jī)中要使用二進(jìn)制數(shù)呢?因?yàn)槎M(jìn)制數(shù)運(yùn)算規(guī)則簡單,用物理器材容易實(shí)現(xiàn),如電壓的高與低,開關(guān)的開與關(guān),脈沖的有與無等等。一個二進(jìn)制數(shù)0或1,稱為“位”(bit)。在計(jì)算機(jī)存儲器中,為了便于管理,常將8個位稱為一個“字節(jié)”(byte),每個字節(jié)存放在一個存儲單元中,每個單元賦于一個存儲地址。由于二進(jìn)制數(shù)位數(shù)太長,不易閱讀,習(xí)慣上常用十進(jìn)制表示數(shù)據(jù),用十六進(jìn)制來表示地址,編譯程序會將其“翻譯”成用二進(jìn)制表示的機(jī)器指令。實(shí)際上,任何語言編寫的程序,無論是BASIC、Pascal等高級語言,還是像C這樣的中級語言,甚至已很接近機(jī)器語言的匯編語言都要翻譯成二進(jìn)制的機(jī)器語言,才能在計(jì)算機(jī)上運(yùn)行。
2.單精度實(shí)型常量單精度實(shí)型常量也稱為實(shí)數(shù)或浮點(diǎn)數(shù)。實(shí)數(shù)有兩種表示形式:小數(shù)形式和指數(shù)形式。
1)小數(shù)形式一個實(shí)數(shù)可以是正、負(fù)號開頭,有若干位0~9的整數(shù),后跟一個小數(shù)點(diǎn)(必須有),再有若干位小數(shù)部分。如123.456,-21.37。數(shù)12用實(shí)數(shù)表示必須寫成12.0或12.。一個實(shí)數(shù)有數(shù)值范圍和有效位數(shù)的限制。實(shí)數(shù)的數(shù)值范圍是3.4×10-38≤|x|≤3.4×1038,當(dāng)小于3.4×10-38時按0對待(下溢),而大于3.4×1038時則上溢,一個溢出的數(shù)是無意義的。實(shí)數(shù)僅有7位有效數(shù)字,超過七位的將是不精確的。如1.2345678,在計(jì)算機(jī)內(nèi)僅保留為1.234567,第八位數(shù)無法保留而失去,并不是第八位向第七位四舍五入。當(dāng)上面的數(shù)要求用小數(shù)五位表示時,則表達(dá)為1.23457,即第七位向第六位四舍五入。
2)指數(shù)形式實(shí)數(shù)的指數(shù)形式也稱為科學(xué)計(jì)數(shù)法。一個實(shí)數(shù)的指數(shù)形式分成尾數(shù)部分和指數(shù)部分。尾數(shù)部分可以是整數(shù)形式或小數(shù)形式,指數(shù)部分是一個字母“e”后跟一個整數(shù)。如123e+01,-456.78e-01,0e0等。由于實(shí)數(shù)僅有7位有效數(shù)字,因此在內(nèi)存中用三個字節(jié)來表示尾數(shù),用一個字節(jié)來表示指數(shù),所以指數(shù)部分用兩位整數(shù)來表示。
3.雙精度常量當(dāng)要表示的實(shí)數(shù)超過3.4×1038時,我們可以用雙精度常量來表達(dá)。雙精度常量的取值范圍由1.7×10-308≤|x|≤1.7×10308,有效位可達(dá)16位左右。一個數(shù)當(dāng)超過長整型數(shù)表達(dá)范圍或超過實(shí)數(shù)表達(dá)范圍時均按雙精度常量對待。一個雙精度常量在內(nèi)存中占8個字節(jié)。2.3.2字符常量
C中如′a′,′A′,′+′,′?′等用單引號括起來的一個字符都是字符常量,它們以其ASCII碼形式存儲在內(nèi)存中,每個字符在內(nèi)存中占一個字節(jié),而′a′和′A′是不同的字符常量。注意,字符常量在單引號內(nèi)只是一個字符,當(dāng)多于一個字符時是非法的。
C的字符常量除了用單引號括起來的一個字符外,還有一類稱為控制字符常量或轉(zhuǎn)義字符常量,它們在表達(dá)時,單引號內(nèi)是以“\”開頭后跟轉(zhuǎn)義字符,或八進(jìn)制數(shù),或十六進(jìn)制數(shù),它們可以是一類不可打印字符,代表某些功能,因此稱為轉(zhuǎn)義字符。具體內(nèi)容如表2.3所示。表2.3控制字符表示法用八進(jìn)制數(shù)或十六進(jìn)制數(shù)構(gòu)造的轉(zhuǎn)義字符可以用來表示所有的ASCII碼和代碼范圍在128~255之間的擴(kuò)展ASCII碼。如′\101′代表字符′A′;′\0′或′\000′代表ASCII碼為0的控制字符,即“空操作”字符;′\x0A′代表換行;′\x41′代表字符′A′。2.3.3字符串常量當(dāng)要使用一個字符序列時,我們就要使用字符串常量。字符串常量是用一對雙引號括起來的字符序列。如"ABC","x+y=6","Howdoyoudo."等都是字符串常量。我們不要混淆字符常量和字符串常量?!鋋′是字符常量,"a"是字符串常量,二者是不同的。字符常量在內(nèi)存中僅占一個字節(jié),而字符串常量則由系統(tǒng)在字符序列最后加一個字符′\0′來表示字符串的結(jié)束。因此"a"在內(nèi)存中占兩個字節(jié),即2.4變量在程序中,其值可以改變的量稱為變量。一個變量有兩個要素:一個是變量名,我們用標(biāo)識符來表示它,一般變量名均由小寫字母組成;另一個是變量在內(nèi)存中要占據(jù)若干字節(jié)的存儲單元。在C程序中,變量需先定義,后使用,并在同一層次中不能與其它標(biāo)識符重名。2.4.1變量的定義
1.變量定義變量定義的一般形式如下:類型變量名表;這里,類型(type)必須是C語言的有效數(shù)據(jù)類型。變量名表可以是一個或多個標(biāo)識符名,中間用逗號分隔,最后以分號結(jié)束。以下是一些變量定義的例子:
inti,j,num;
floata,b,sum;
unsignedintui;
charc,ch,name;
doublex,total;
2.說明
(1)變量名可以是C語言中允許的合法標(biāo)識符,用戶定義時應(yīng)遵循“見名知義”的原則,以利于程序的維護(hù)(今后所有標(biāo)識符均如此,不再重復(fù))。
(2)每一個變量都必須進(jìn)行類型說明,這樣就可以保證程序中變量的正確使用。未經(jīng)類型說明的變量在編譯時將被指出是錯誤的,也就是變量一定要先定義,后使用。
(3)當(dāng)一個變量被指定為某一確定類型時,將為它分配若干相應(yīng)字節(jié)的內(nèi)存空間。如char型為1字節(jié),int型為2字節(jié),float型為4字節(jié),double型為8字節(jié)。當(dāng)然,不同的系統(tǒng)可能稍有差異。
(4)變量可以在程序內(nèi)的三個地方定義:在函數(shù)內(nèi)部,在函數(shù)的參數(shù)(形參)定義中或在所有的函數(shù)外部。由此定義的變量分別稱為局部變量、形式參數(shù)和全局變量。在不同地方定義的變量,其作用范圍不同。在同一層次定義的變量,不能與數(shù)組、指針、函數(shù)或其它變量同名。
(5)變量是用來存放數(shù)據(jù)的,由于數(shù)據(jù)有不同的類型,因此要定義相應(yīng)類型的變量去存放它。這些數(shù)據(jù)稱為相應(yīng)變量的值。如系統(tǒng)運(yùn)行inta;a=5;后會將內(nèi)存中的若干個單元分配給變量a,并將變量的值5放入內(nèi)存中。需要說明的是,不同的系統(tǒng)分配給同類型變量的單元數(shù)是不同的。如在TurboC系統(tǒng)中,給int型變量分配2個字節(jié),而在VisualC++6.0系統(tǒng)中,給int型變量則分配4個字節(jié)。這一點(diǎn),我們將在后續(xù)章節(jié)中進(jìn)一步體會。2.4.2C語言中各種類型的變量
1.整型變量整型變量用來存放整型數(shù)值。整型變量可分為:基本型(int),短整型(shortint或short),長整型(longint或long)和無符號型(unsignedint,unsignedshort,unsignedlong)。前三種整型變量存儲單元的最高位為符號位。0表示為正,1表示為負(fù)。無符號型變量存儲單元的所有位均表示數(shù)值。具體可參看表2.2。在使用整型變量時一定要注意數(shù)值的范圍,超過該變量允許的使用范圍將導(dǎo)致錯誤的結(jié)果。
2.實(shí)型變量實(shí)型變量分為單精度型(float)和雙精度型(double)兩類。其存放數(shù)據(jù)的差別是:單精度變量占4個字節(jié)內(nèi)存單元,有7位有效數(shù)字,數(shù)值范圍在3.4e-38~3.4e+38之間。而雙精度變量占有8個字節(jié)內(nèi)存單元,有15~16位有效數(shù)字,數(shù)值范圍在1.7e-308~1.7e+308之間。雙精度型變量還有一種長雙精度型(longdouble),由于使用較少,又由計(jì)算機(jī)系統(tǒng)決定,因此就不介紹了。一個實(shí)型常量可以賦給單精度型變量,也可賦給雙精度型變量,主要是保留的有效位數(shù)不同。
3.字符型變量字符型(char)變量內(nèi)存放字符型常量,在內(nèi)存單元中僅占一個字節(jié)。其內(nèi)存中存放的是該字符的ASCII碼,因此字符型變量也可存儲數(shù)值范圍為0~255或-128~127之間的整型常數(shù)。在C語言中,字符型與整型的界限不是很分明的,在一個字節(jié)內(nèi)內(nèi)存中存放的形式是相同的。
4.枚舉型變量枚舉型是一個整型常量的集合。這些常量指定了所有該類型變量可能具有的各種合法值。枚舉在我們?nèi)粘I钪惺殖R姟@?,星期的枚舉為{Sunday,Monday,Tuesday,Wednesday,Thursday,F(xiàn)riday,Saturday}。枚舉的定義形式是:
enum〈枚舉類型名〉{枚舉元素表}〈變量表〉;其中枚舉類型名和枚舉變量表是選擇項(xiàng)。下面我們來看一個枚舉類型的定義和變量定義的例子:
enumweekday{sun,mon,tue,wed,thu,fri,sat};
enumweekdayworkday,restday;其中第一句是定義枚舉類型enumweekday,weekday是枚舉類型名,而花括號內(nèi)是該枚舉型變量可能具有的各種情況的一一列舉。第二句是定義枚舉型變量,即變量workday,restday是屬于enumweekday枚舉類型的,該枚舉型變量只能賦予花括號內(nèi)的常量,例如:
workday=mon;
restday=sun;枚舉類型的定義和變量的定義有三種形式:
(1)上面舉例即是,即枚舉類型和枚舉變量是分別定義的。
(2)可將上述形式合并成一句:
enumweekday{sun,mon,tue,wed,thu,fri,sat}workdayrestday;
(3)當(dāng)只有一種枚舉類型時,可省略枚舉類型名:
enum{sun,mon,tue,wed,thu,fri,sat}workday,restday;其中花括號內(nèi)所列的元素稱為枚舉元素或枚舉常量。它們是用戶定義的標(biāo)識符,這些標(biāo)識符并不自動地代表什么含義。如sun也可寫成sunday,用什么標(biāo)識符代表什么含義,完全由程序員決定,只是為了使程序易懂,在某些情況下,較使用整型編程更好。正確理解枚舉的關(guān)鍵是:枚舉元素實(shí)際上是用它們所對應(yīng)的整型數(shù)來代替,即枚舉類型只是整型的一個子集,且可以在任何一個整型表達(dá)式中使用這些枚舉值。具體的枚舉元素對應(yīng)的整數(shù)由兩種情況決定:
(1)缺省:當(dāng)花括號內(nèi)的枚舉元素沒有被初始化,第一項(xiàng)代表整數(shù)0,第二項(xiàng)代表整數(shù)1,以此類推。
(2)初始化:我們可以用初始化來改變枚舉元素的相應(yīng)值。例如:
enumweekday{mon=1,tue,wed,thu,fri,sat,sun}workday,restday;在上句中,mon代表1,后面仍然自動增1,即tue代表2,sat代表6,而sun在此不代表0而代表7。初值可以從任何一個整數(shù)開始,也可以指定幾個初值,也可給任何一個枚舉常量賦初值。例如:
enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};此后sun為7,mon為1,tue為2,…,sat為6。枚舉型變量值在輸出時是輸出其整常數(shù)而不是其枚舉元素的標(biāo)識符。枚舉型變量在賦值時可以賦枚舉元素而不能直接賦整型常量,如要賦整型常量,則要進(jìn)行類型轉(zhuǎn)換。例如:
restday=(enumweekday)6;或restday=sat;
例2.1
打印出枚舉元素sat的內(nèi)存值。程序:
#include<stdio.h>
voidmain()
{
enum{sun,mon,tue,wed,thu,fri,sat}workday,restday;
restday=sat;
printf("restdayis%d\n",restday);
}運(yùn)行:
restdayis6
5.其它類型變量
C語言中無字符串變量,但可以用字符數(shù)組或字符型指針來表達(dá)字符串。另外還有指針型變量、結(jié)構(gòu)體型變量、共用體型變量等,這些將在后續(xù)章節(jié)中介紹。
C語言中沒有邏輯型變量,所有非零數(shù)值被認(rèn)為是邏輯“真”,而數(shù)值零被認(rèn)為是邏輯“假”。無值型類型一般不用來說明變量,只用在函數(shù)或指針中。2.4.3變量的初始化程序中常需要對一些變量預(yù)先設(shè)置初值。C規(guī)定,可以在定義變量時同時使變量初始化。變量初始化只需定義變量時在變量名后面加一等號及一個常數(shù)。它的一般形式是:類型變量名=常數(shù);以下是幾個示例(第七章將詳述):
charch=′a′;
intfirst=0;
floatx=123.45;
說明:
(1)全程和靜態(tài)變量在程序編譯階段初始化,且只賦一次值。而局部變量是在進(jìn)入定義它們的函數(shù)或復(fù)合語句時才作初始化,相當(dāng)于賦值語句。每調(diào)用一次,就賦值一次。
(2)所有的全程和靜態(tài)變量在沒有明確初始化的情況下由程序自動賦零。而局部變量和寄存器變量在未初始化時其值是不確定的,即保持原來的狀態(tài)不變。2.5運(yùn)算符運(yùn)算符是一種向編譯程序說明一個特定的數(shù)學(xué)或邏輯運(yùn)算的符號。C語言的運(yùn)算符很豐富,除了控制語句和輸入/輸出以外的幾乎所有的基本操作都可作為運(yùn)算符處理。C語言的運(yùn)算符有以下幾類:
(1)算術(shù)運(yùn)算符(+,-,*,/,%,++,--)。
(2)關(guān)系運(yùn)算符(<,>,<=,>=,==,![KG-*8]=)。
(3)邏輯運(yùn)算符(!,&&,||)。
(4)位運(yùn)算符(<<,>>,~,|,^,&)。
(5)賦值運(yùn)算符(=,及其雙目運(yùn)算符的擴(kuò)展賦值運(yùn)算符)。
(6)條件運(yùn)算符(?:)。
(7)逗號運(yùn)算符(,)。
(8)指針運(yùn)算符(*,&)。
(9)求字節(jié)數(shù)運(yùn)算符(sizeof)。
(10)強(qiáng)制類型轉(zhuǎn)換運(yùn)算符((類型))。
(11)分量運(yùn)算符(·,->)。
(12)下標(biāo)運(yùn)算符([])。
(13)圓括號運(yùn)算符(())。2.5.1算術(shù)運(yùn)算符和賦值運(yùn)算符具體運(yùn)算符的功能、優(yōu)先級、運(yùn)算結(jié)合方向見表2.4所示。表2.4算術(shù)運(yùn)算符和賦值運(yùn)算符
說明:
(1)+,-,*,/與數(shù)學(xué)中運(yùn)算類似,先乘除后加減,也就是按優(yōu)先級順序進(jìn)行運(yùn)算,優(yōu)先級小的先運(yùn)算。要改變運(yùn)算順序只要加括號就可以了,括號全部為圓括號,必須注意括號的配對,圓括號適用于C的幾乎全部數(shù)據(jù)類型(指針類除外)的各種運(yùn)算(++,--除外)。除法運(yùn)算符(/)在用于兩個整型數(shù)據(jù)運(yùn)算時,其運(yùn)算結(jié)果也是整數(shù),余數(shù)總是被截掉。如1/2的結(jié)果是0;10/3的結(jié)果是3。
(2)求余運(yùn)算符(%)僅用于整型數(shù)據(jù),不能用于實(shí)型和雙精度實(shí)型。它的作用是取整數(shù)除法的余數(shù)。如1%2的結(jié)果是1;10%3的結(jié)果也是1。
(3)賦值運(yùn)算符(=)是將右邊表達(dá)式的值賦給左邊的變量。賦值運(yùn)算符左邊必須是變量等有存儲單元的元素,而不能是常量或表達(dá)式。如x=x+1是合法的,即把x的值加上1后再賦給x,而x+1=x卻是非法的,因?yàn)閤+1不是一個存儲單元,不能被賦以值。賦值號有別于數(shù)學(xué)中的等號,這一點(diǎn)是要注意的。
(4)++,--僅用于整型變量、指針變量。用于整型變量是在原值上加1或減1;用于指針變量是取下一地址或上一地址。關(guān)于指針部分的使用在第八章中介紹。增1和減1運(yùn)算符用在表達(dá)式中時,寫法是有差別的:如果運(yùn)算符在操作數(shù)前面,則在表達(dá)式“引用”該操作數(shù)前,先對其作加1或減1運(yùn)算;如果運(yùn)算符在操作數(shù)之后,則先“引用”該操作數(shù),然后再對它作加1或減1運(yùn)算??紤]以下程序:
#include<stdio.h>
voidmain()
{
intx,y;
x=10;
y=++x;
printf("x=%d,y=%d\n",x,y);
}運(yùn)算結(jié)果:
x=11,y=11此時y的值和x的值都為11。然而換一種寫法:
#include<stdio.h>
voidmain()
{
intx,y;
x=10;
y=x++;
printf("x=%d,y=%d\n",x,y);
}運(yùn)行結(jié)果:
x=11,y=10此時y的值是10,而x的值自增后為11。上述兩種情況x都變成了11,而y的值卻不同。它們的差別只在于給x加1的時機(jī)不同。此時賦值即為引用。再如進(jìn)行輸出操作時,有以下程序段:
x=10;
printf("x=%d\n",++x);運(yùn)行結(jié)果為x=11,執(zhí)行其下一條語句時x也是11,而程序段:
x=10;
printf("x=%d\n",x++);運(yùn)行結(jié)果為x=10,執(zhí)行下一條語句時x才是11,此時輸出即為引用。C語言可以控制何時給變量加1或減1,這是一個很大的優(yōu)點(diǎn),但有時也會帶來副作用,初學(xué)者要小心使用。
(5)+,-,*,/,%可以與賦值號=組成復(fù)合賦值運(yùn)算符+=,-=,*=,/=,%=。如a=a+b可以寫成a+=b,a=a*b可以寫成a*=b。其余類推。這樣書寫簡練,運(yùn)行速度快,也提高了編譯效率。
例2.2
已知:inta=2,b=3,c=4。求:a*=16+(b++)-(++c)解a=a*(16+3-5)=2×14=282.5.2關(guān)系運(yùn)算符和邏輯運(yùn)算符
C語言所允許的關(guān)系運(yùn)算符有<,>,<=,>=,==和!六種。而邏輯運(yùn)算符有!,&&和||三種。在關(guān)系運(yùn)算符這一術(shù)語中,關(guān)系一詞是指數(shù)值與數(shù)值之間的關(guān)系,而在邏輯運(yùn)算符這一術(shù)語中,邏輯一詞是指如何用形式邏輯原則來建立數(shù)值間的關(guān)系。由于這兩種運(yùn)算符經(jīng)常在一起使用,因此我們一起討論。關(guān)系運(yùn)算符的運(yùn)算對象是數(shù)值(包括字符數(shù)據(jù)),運(yùn)算結(jié)果是一個邏輯量;邏輯運(yùn)算符的運(yùn)算對象和運(yùn)算結(jié)果都是邏輯量。邏輯常量實(shí)際上只有真(true)和假(false),但在C語言中,沒有專門設(shè)邏輯量,而是用零和非零來代替,true是不為零的任何值,而false是零,這樣任何數(shù)值均可進(jìn)行邏輯運(yùn)算。如8&&9是合法的。這使C的表達(dá)非常靈活。使用關(guān)系運(yùn)算符和邏輯運(yùn)算符的表達(dá)式的值卻很規(guī)范,系統(tǒng)只會給出兩個值:結(jié)果為false則返回0,而為true則返回1。表2.5列出了關(guān)系運(yùn)算符和邏輯運(yùn)算符的作用、運(yùn)算對象、優(yōu)先級和結(jié)合方向。表2.5關(guān)系和邏輯運(yùn)算符
說明:
(1)當(dāng)關(guān)系運(yùn)算符兩邊的值滿足關(guān)系時為真,返回1;如不滿足關(guān)系時為假,返回0。例如:
x=10;
printf("%d\n",x>=9);則輸出為1。又如:
x=5;
printf("%d\n",x>=9);則輸出為0。字符比較按其ASCII碼值進(jìn)行,如′A′<′B′為真。
(2)關(guān)系運(yùn)算符>,>=,<,<=的優(yōu)先級相同,如在表達(dá)式中同時出現(xiàn)時,則自左向右順序運(yùn)算。而==與!=則優(yōu)先級低于此四種關(guān)系運(yùn)算符。例如:
printf("%d\n",5>3>1);運(yùn)行輸出結(jié)果為0。因?yàn)閮蓚€>是同一優(yōu)先級,5>3的結(jié)果為1,而1>1的關(guān)系不滿足,所以最后結(jié)果為0。又如:
printf("%d\n",1==11<35);運(yùn)行輸出結(jié)果為1。因?yàn)?lt;的優(yōu)先級比==高,則11<35的結(jié)果為1,而1==1的關(guān)系滿足,所以最后結(jié)果為1。
(3)邏輯運(yùn)算的真值表如下所示,邏輯值用1和0表示。
(4)關(guān)系和邏輯運(yùn)算符的優(yōu)先級都低于算術(shù)運(yùn)算符(邏輯非!除外)。如10>1+12完全等價于10>(1+12),其結(jié)果當(dāng)然是假(即0)。
(5)在關(guān)系和邏輯運(yùn)算符組成的表達(dá)式中,也可以像算術(shù)表達(dá)式一樣,用圓括號來改變運(yùn)算的自然優(yōu)先次序,如!1&&0其值為假,因?yàn)橄葓?zhí)行!1,然后才執(zhí)行&&。然而加上圓括號!(1&&0)后改變了運(yùn)算順序,則執(zhí)行!0操作結(jié)果為1,即其值為真。
(6)在邏輯表達(dá)式的求解中,并不是所有的邏輯運(yùn)算符都被執(zhí)行,只是在必須執(zhí)行下一個邏輯運(yùn)算符才能求出表達(dá)式的值時,才執(zhí)行該運(yùn)算符。例如:當(dāng)兩個邏輯量a||b,且a為真時則不再求b的值,而取值為真(即1);當(dāng)兩個邏輯量a&&b,且a為假時,則同樣不再求b的值,而取值為假(即0)。同理,a||b||c式中當(dāng)a為真時,直接取值為真(即1);a&&(b++)&&c式中當(dāng)a為假時,直接取值為假(即0)。此時b++操作就沒有進(jìn)行,下一條語句中b仍為原值。
(7)邏輯運(yùn)算的轉(zhuǎn)換。
!(a||b)可寫成!a&&!b,而!(a&&b)可寫成!a||!b。例2.3求表達(dá)式5<4||8>4-!0的值。解自左至右,按優(yōu)先級順序(<,!,-,>,||)計(jì)算 5<4 得0 !0 得1(自右至左) 4-!0 得3 8>4-!0 得1最后 0||1 得1即表達(dá)式的值為1。2.5.3位運(yùn)算符
C語言和其它高級語言不同,它完全支持位運(yùn)算。C語言可用來代替匯編語言完成大部分編程工作,位運(yùn)算功不可沒。位運(yùn)算是對字節(jié)或字中的實(shí)際二進(jìn)制位進(jìn)行檢測、設(shè)置或移位。這些字節(jié)或字必須是char型、int型數(shù)據(jù)類型和它們的變體。位運(yùn)算符不能用于float,double,void或其它更復(fù)雜的數(shù)據(jù)類型。
C語言中位運(yùn)算符有&,|,^,~,>>,<<等六種。位運(yùn)算的對象一定要按二進(jìn)制位表示出來,否則就會混同于邏輯運(yùn)算符!,&&,||。表2.6列出了位運(yùn)算符的作用、運(yùn)算對象、運(yùn)算優(yōu)先級和結(jié)合方向。表2.6位運(yùn)算符
說明:
(1)位邏輯運(yùn)算符&(與AND),|(或OR),^(異或XOR),~(反NOT)的真值表如下:真值表似乎與邏輯運(yùn)算符&&,||,!類似,實(shí)質(zhì)上運(yùn)算中的對象是不同的。上述真值表中的P,Q是一個二進(jìn)制位,而不是字節(jié)或字。如3&&4,即兩個真值true相與,結(jié)果為1。但3&4卻要按位表示,即其結(jié)果是0。
(2)位邏輯運(yùn)算符&(與AND)常用于指定某些位清零。如使整型變量x清零,只要寫成x=x&0就可以了;如果使一個字節(jié)的第8位表示為奇偶校驗(yàn)位并將其設(shè)為0,只要ch&127就可以了。而要保留某些位,只要這幾位和1相與,其它位與0相與即可。如要求對10011100保留低4位,高4位清零,我們?nèi)?0001111和原數(shù)按位相與,即得00001100。
(3)位邏輯運(yùn)算符|(或OR)可用于指定某些位為1。如要使10011100的低4位全為1,保留高4位,我們?nèi)?0001111和原數(shù)按位相或,即得100111111。
(4)位邏輯運(yùn)算符^(異或XOR)。①使特定位反轉(zhuǎn),只要將該位與1異或即可。如10011101要將低2位都反轉(zhuǎn),我們?nèi)?0000011與其按位異或,即得10011110。②使某些位保留原值,只要將這些位與0異或即可。如上例中的高6位。③整個數(shù)清零,只要本身異或一次即可,即x^x。如x為10011100,則x^x得0。④交換兩個值不用臨時變量。如a=3,b=4,則a=a^b,b=b^a,a=a^b,即a變成4,b變成3。具體請看下列式子:
(5)位邏輯運(yùn)算符~(反NOT)是對該運(yùn)算元素每一位都取反。如~1在8位二進(jìn)制數(shù)中變成了1111110而不是0。如我們要指定某數(shù)x最后一位為0(偶數(shù)),但又不知該數(shù)是1字節(jié)(char型)、2字節(jié)(int型)還是4字節(jié)(long型),我們只要做x&~1即可。這常用于不同機(jī)器間的程序移植。還可用于加密:對一個數(shù)求一次反碼就變成密碼,再對密碼求一次反就變成原數(shù)了。
(6)左移運(yùn)算符<<使變量中的每一位向左移動,移出的最高位將丟失(溢出),而右端補(bǔ)入0。左移表達(dá)式的形式為變量名<<移位的位數(shù)例如:a=15,即00001111,取a=a<<2后,即a左移兩位,變成00111100,即十進(jìn)制數(shù)60。對于無符號數(shù),左移一位相當(dāng)于乘2,左移2位相當(dāng)于乘4。
(7)右移運(yùn)算符>>使變量中的每一位向右移動,移出的最低位將丟失,而高端補(bǔ)0(正數(shù))。對于負(fù)數(shù),即原最高位為1時,右移一位,高端補(bǔ)0稱邏輯右移,高端補(bǔ)1稱算術(shù)右移,這由計(jì)算機(jī)系統(tǒng)決定。對于VisualC++是采用算術(shù)右移,即移入1。右移表達(dá)式的形式為變量名>>移位的位數(shù)例如:a=16,即00001000,取a=a>>2后,即a右移2位,變?yōu)?0000010,即十進(jìn)制數(shù)4。右移一位相當(dāng)于除2,右移兩位相當(dāng)于除4。
(8)位運(yùn)算符中&,|,^,<<,>>可以與賦值號“=”組成復(fù)合賦值運(yùn)算符&=,|=,[HT4"]^[HT5]=,<<=,>>=。如a=a&b可寫成a&=b,其余類推。凡算術(shù)運(yùn)算符、位運(yùn)算符中的二目運(yùn)算符均可與賦值號“=”組成復(fù)合運(yùn)算符。位運(yùn)算在后續(xù)課程“微機(jī)原理與應(yīng)用”中將會更多地運(yùn)用。2.5.4條件運(yùn)算符和逗號運(yùn)算符
1.條件運(yùn)算符
C語言提供了一個功能很強(qiáng),使用靈活的條件運(yùn)算符“?:”,它是C中惟一的一個三目運(yùn)算符,即運(yùn)算對象有三個,運(yùn)算優(yōu)先級為13,結(jié)合方向是自右至左。這個運(yùn)算符的一般形式是:表達(dá)式1?表達(dá)式2:表達(dá)式3其含義是:先求表達(dá)式1的值,如果為真(非零),則求表達(dá)式2的值,并把它作為整個表達(dá)式的值;如表達(dá)式1的值為假(零),則求表達(dá)式3的值,并把它作為整個表達(dá)式的值。例如:
x=10;
y=x>9?100:200;在上述第二個語句中,=的優(yōu)先級最低,所以y=后面的內(nèi)容是條件表達(dá)式,表達(dá)式1是x>9,因?yàn)閤為10,所以條件成立為真,因此取表達(dá)式2的值100作為條件表達(dá)式的值,并賦給y。若x=8,則y的值將是200。當(dāng)“?”與表達(dá)式2,3中的運(yùn)算符優(yōu)先級有矛盾時,可加括號,但“?”的優(yōu)先級已是13級,只有逗號運(yùn)算符和賦值運(yùn)算符在它后面,因此一般情況是無括號的。注意“:”的用法和它的位置,“:”的位置是在表達(dá)式2與表達(dá)式3之間的。
2.逗號運(yùn)算符逗號運(yùn)算符“,”也稱順序求值運(yùn)算符,其運(yùn)算優(yōu)先級為15,也是最低的,結(jié)合方向是自左至右。逗號運(yùn)算符的左邊總是不返回的,也就是說逗號右邊表達(dá)式的值才是整個表達(dá)式的值。例如:
x=(y=3,y+1)該表達(dá)式括號內(nèi)是逗號表達(dá)式,由于結(jié)合方向是自左至右,先將3賦給y,然后計(jì)算表達(dá)式y(tǒng)+1,其值為4,逗號左邊的值不返回,逗號右邊的值才是整個表達(dá)式的值,所以表達(dá)式的值為4,最后將4賦給x。由于逗號運(yùn)算符的級別最低,因此以整體先求值時一般均需加圓括號。2.5.5其它運(yùn)算符除了前面介紹的運(yùn)算符外,表2.7列出了沒有介紹的其它運(yùn)算符,這些運(yùn)算符我們將在后續(xù)章節(jié)中介紹。表2.7其它運(yùn)算符2.5.6運(yùn)算符的優(yōu)先級和結(jié)合方向表2.8列出了所有C語言運(yùn)算符的優(yōu)先級和結(jié)合方向。注意所有的單目運(yùn)算符(第2級)、賦值運(yùn)算符(第14級)和條件運(yùn)算符(第13級)都是從右至左結(jié)合的,要予以特別關(guān)注,其余均為從左至右結(jié)合的,與習(xí)慣一致。表2.8C語言運(yùn)算符的優(yōu)先級和結(jié)合方向注:運(yùn)算形式一欄中各字母的含義如下:a—數(shù)組,e—表達(dá)式,p—指針,t—類型,x,y—變量。2.6表達(dá)式運(yùn)算符、常量以及變量構(gòu)成了表達(dá)式。在C語言中,表達(dá)式是這些成分的有效組合。因?yàn)榇蟛糠直磉_(dá)式的寫法都是遵循代數(shù)符號規(guī)則,所以它們常常被看成理所當(dāng)然的。然而,C語言中的表達(dá)式仍有些要注意之處。2.6.1C語言的各種表達(dá)式
C語言的表達(dá)式非常豐富,也有人稱C語言為表達(dá)式語言。如有算術(shù)表達(dá)式、關(guān)系表達(dá)式、邏輯表達(dá)式、條件表達(dá)式、逗號表達(dá)式、賦值表達(dá)式等等。
1.算術(shù)表達(dá)式算術(shù)表達(dá)式的形式如下:
<操作數(shù)><算術(shù)運(yùn)算符><操作數(shù)>算術(shù)表達(dá)式中運(yùn)算對象(操作數(shù))是數(shù)值,也可以是字符(按其ASCII碼值進(jìn)行運(yùn)算),運(yùn)算結(jié)果(即表達(dá)式的值)是數(shù)值。如:
a+b*2-d/3
2.關(guān)系表達(dá)式關(guān)系表達(dá)式的形式如下:
<操作數(shù)><關(guān)系運(yùn)算符><操作數(shù)>關(guān)系表達(dá)式中運(yùn)算對象是數(shù)值,也可以是字符(取其ASCII碼值),其運(yùn)算結(jié)果是邏輯量,即為“真”時取1,為“假”時取0。如3>2,結(jié)果為1。
3.邏輯表達(dá)式邏輯表達(dá)式的形式如下:
<操作數(shù)><邏輯運(yùn)算符><操作數(shù)>邏輯表達(dá)式的運(yùn)算對象是邏輯量。在C語言中無邏輯量,因此規(guī)定將非零的值按“真”對待,零值按“假”對待。而運(yùn)算結(jié)果為“真”時取1,為“假”時取0。
4.條件表達(dá)式條件表達(dá)式的形式如下:
<表達(dá)式1>?<表達(dá)式2>:<表達(dá)式3>其中表達(dá)式1的值按邏輯值對待,非零為“真”,零值為“假”。而當(dāng)表達(dá)式1值為“真”(非零)時,條件表達(dá)式的值為表達(dá)式2的值;而當(dāng)表達(dá)式1的值為“假”(零)時,條件表達(dá)式的值為表達(dá)式3的值。如y=x?a:b,若x=3,則y=a,若x=0,則y=b。表達(dá)式2或表達(dá)式3還可以是另一個條件表達(dá)式,應(yīng)注意它們是自右至左的結(jié)合方向。如a>b?a:c>d?c:d相當(dāng)于a>b?a:(c>d?c:d),當(dāng)a=1,b=2,c=3,d=4時,此條件表達(dá)式的值等于4。當(dāng)表達(dá)式2和表達(dá)式3的類型不一致時,最后條件表達(dá)式的值的類型取兩者的高者。可參看2.6.2節(jié)。
5.逗號表達(dá)式逗號表達(dá)式的形式如下:表達(dá)式1,表達(dá)式2,…,表達(dá)式n逗號表達(dá)式按逗號間的順序依次從左至右執(zhí)行,但整個逗號表達(dá)式的值為最后一個逗號右邊表達(dá)式的值。
6.賦值表達(dá)式賦值表達(dá)式是最常用的表達(dá)式,形式如下:
<變量><賦值運(yùn)算符><表達(dá)式>賦值運(yùn)算符即=,又稱為賦值號。賦值號左邊必須是變量、數(shù)組元素等有存儲單元的元素,賦值號的右邊可以是各類表達(dá)式,也可以是另一個賦值表達(dá)式。因此a=b=c是合法的,即相當(dāng)于a=(b=c),因?yàn)樗亲杂抑磷蠼Y(jié)合的,即c值先賦給b,b=c賦值表達(dá)式的值為b的值,然后再賦給a,整個表達(dá)式的值也為a的值。賦值表達(dá)式的求值順序是先計(jì)算賦值號右邊表達(dá)式的值,再轉(zhuǎn)換成表達(dá)式左邊變量的類型,再進(jìn)行賦值,此值也是賦值表達(dá)式的值。其類型轉(zhuǎn)換的方法見下節(jié)。
10種復(fù)合賦值運(yùn)算符也可構(gòu)成賦值表達(dá)式。如a+=b相當(dāng)于a=a+b。2.6.2表達(dá)式中的類型轉(zhuǎn)換當(dāng)不同類型的常量和變量在表達(dá)式中混合使用時,它們最終將被轉(zhuǎn)換為同一類型。C語言在類型轉(zhuǎn)換時是“向上”靠的。C語言規(guī)定,不同類型的數(shù)據(jù)在參加運(yùn)算之前會自動轉(zhuǎn)換成相同的類型(兩個操作數(shù)之間運(yùn)算),然后再進(jìn)行運(yùn)算。運(yùn)算結(jié)果的類型也就是轉(zhuǎn)換后的類型。轉(zhuǎn)換的規(guī)則為:
(1)轉(zhuǎn)換的結(jié)果必定是3種基本類型:int,long或double型。因此兩個char型的數(shù)據(jù)運(yùn)算,也要先轉(zhuǎn)換成int型,運(yùn)算結(jié)果也是int型;只要有一個數(shù)據(jù)是float型,都要先轉(zhuǎn)換成double型,最后結(jié)果也是double型。
(2)各類型級別由低到高的順序?yàn)閏har,int,unsigned,long,unsignedlong,float,double。除如(1)所述要進(jìn)行char或short向int,float向double的轉(zhuǎn)換外,其余類型的混合運(yùn)算均按此順序由低到高自動轉(zhuǎn)換。另外,C語言規(guī)定,有符號類型數(shù)據(jù)與無符號類型數(shù)據(jù)進(jìn)行混合運(yùn)算,結(jié)果為無符號類型。例如,int型數(shù)據(jù)和unsigned型數(shù)據(jù)的運(yùn)算結(jié)果為unsigned型。例2.4考慮圖2.2中的類型轉(zhuǎn)換。圖2.2類型轉(zhuǎn)換示例例2.5類型轉(zhuǎn)換。
floatx;
inti;
x=i=3.14159;則變量i的值為3,而變量x的值為3.0而不是3,也不是3.14159。
(3)可以使用強(qiáng)制類型轉(zhuǎn)換。通過使用強(qiáng)制類型轉(zhuǎn)換(type),可以強(qiáng)迫表達(dá)式的值轉(zhuǎn)換為某一特定類型。一般的形式是:
(類型)表達(dá)式其中類型(type)是C語言標(biāo)準(zhǔn)數(shù)據(jù)類型。例如想確保表達(dá)式x/2成為float型,則可以寫成如下形式:
(float)(x/2)當(dāng)然,如x為整型時則會丟失信息。如寫成:
(float)x/2則表達(dá)式的結(jié)果為double型。強(qiáng)制類型轉(zhuǎn)換通常被認(rèn)為是一個運(yùn)算符。作為一個運(yùn)算符,它是單目的,運(yùn)算優(yōu)先級為2級,它的結(jié)合方向是自右向左。強(qiáng)制類型轉(zhuǎn)換中類型要用括號括起來。后面如果是表達(dá)式也應(yīng)括起來。強(qiáng)制類型轉(zhuǎn)換用途之一是兩個整型量運(yùn)算而結(jié)果需保留小數(shù)部分時,可對其中一個強(qiáng)制為float或double型,在運(yùn)算前系統(tǒng)會自動將兩個操作數(shù)轉(zhuǎn)換為double型,運(yùn)算結(jié)果也是double型。
例2.6
整型數(shù)據(jù)相除。程序:
#include<stdio.h>
voidmain()
{
inti=100,j=40;
floatf;
f=i/j;
printf("f=%f\n",f);
}運(yùn)算結(jié)果:
f=2.000000上述程序中f的結(jié)果為2.0,小數(shù)部分丟失。如需保留小數(shù)部分,可將“f=i/j”;改寫成:
f=(float)i/j;此時相當(dāng)于f=100.0/40,最后f的結(jié)果為2.5。強(qiáng)制類型轉(zhuǎn)換得到的結(jié)果是一個瞬間量,它也不改變表達(dá)式中的原有數(shù)據(jù)。如例2.6中,(float)i為100.0,只在此時為實(shí)數(shù),此外i仍是整數(shù)100。強(qiáng)制類型還用于參數(shù)類型的轉(zhuǎn)換,如sqrt((double)i),因?yàn)閟qrt要求參數(shù)是雙精度型的,以保證函數(shù)參數(shù)類型的一致。關(guān)于轉(zhuǎn)換結(jié)果可能丟失的信息如表2.9所示。表2.9普通類型轉(zhuǎn)換的結(jié)果對于賦值運(yùn)算來說,賦值運(yùn)算結(jié)果按賦值號左邊的變量類型進(jìn)行轉(zhuǎn)換,此時可能遇到表2.9中沒有列出的類型轉(zhuǎn)換,可以將一種轉(zhuǎn)換分多次完成。例如,若要將double型轉(zhuǎn)換為int型,可先轉(zhuǎn)換為float型,然后再轉(zhuǎn)換為int型,這時數(shù)據(jù)的損失會更大,使用時要小心。2.6.3空格和圓括號為了增加程序的可讀性,在C程序的表達(dá)式中可以隨意增加空格。如以下兩個表達(dá)式是等價的:
x=10/y-(127/x)
x=10/y-(127/x)為了改變程序中表達(dá)式的求值順序,可以加入圓括號。使用多余的圓括號并不會降低該表達(dá)式運(yùn)行的速度,也不會引起錯誤。因此我們提倡使用圓括號來更清晰地表達(dá)運(yùn)算次序,增加程序的易讀性。如下列兩個表達(dá)式哪一個更容易讀懂呢?
x=y/2-34*temp&127
x=(y/2)-((34*temp)&127)表達(dá)式除了由圓括號來改變運(yùn)算的優(yōu)先順序外,應(yīng)按照運(yùn)算符的優(yōu)先順
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司如何應(yīng)對2025年風(fēng)險(xiǎn)試題及答案
- 數(shù)據(jù)可視化技能考題及答案
- 機(jī)器學(xué)習(xí)中的數(shù)據(jù)預(yù)處理技術(shù)試題及答案
- 黑龍江省鶴崗市綏濱五中學(xué)2025年數(shù)學(xué)七下期末調(diào)研模擬試題含解析
- 行政法學(xué)的課程設(shè)計(jì)與教學(xué)效果分析試題及答案
- 交流分享2025年法學(xué)概論考試試題及答案
- 2025屆山西省晉城市陵川縣七年級數(shù)學(xué)第二學(xué)期期末綜合測試模擬試題含解析
- 2025年網(wǎng)絡(luò)管理員考試動態(tài)解讀試題及答案
- 軟件設(shè)計(jì)師2025年考試復(fù)習(xí)資料及試題及答案
- 2025年中國鋼百葉窗市場調(diào)查研究報(bào)告
- 2025廣西中馬欽州產(chǎn)業(yè)園區(qū)投資控股集團(tuán)限公司招聘49人易考易錯模擬試題(共500題)試卷后附參考答案
- 甲狀腺癌護(hù)理疑難病例討論
- 學(xué)校低值易耗品采購與管理流程
- 高等數(shù)學(xué)(慕課版)教案 教學(xué)設(shè)計(jì)-5.4 定積分的應(yīng)用;5.5 反常積分
- 一次電氣設(shè)備調(diào)試作業(yè)A票
- 車載感知與融合算法-深度研究
- 社會工作發(fā)展趨勢-深度研究
- 乙狀結(jié)腸癌相關(guān)知識
- 部編版二年級語文《古詩詞大會比賽》精美課件
- 金融學(xué)科研究新高度:黃達(dá)《金融學(xué)》2025課件解讀
- 遼寧省沈陽市2025年高中三年級教學(xué)質(zhì)量監(jiān)測(一)地理試題(含答案)
評論
0/150
提交評論