第2章基本數(shù)據(jù)類型表達(dá)式與運(yùn)算符_第1頁
第2章基本數(shù)據(jù)類型表達(dá)式與運(yùn)算符_第2頁
第2章基本數(shù)據(jù)類型表達(dá)式與運(yùn)算符_第3頁
第2章基本數(shù)據(jù)類型表達(dá)式與運(yùn)算符_第4頁
第2章基本數(shù)據(jù)類型表達(dá)式與運(yùn)算符_第5頁
已閱讀5頁,還剩78頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第二章基本數(shù)據(jù)類型、運(yùn)算符與表達(dá)式

1本章要求:C語言的數(shù)據(jù)類型各種類型數(shù)據(jù)的定義方法常量與變量各種類型數(shù)據(jù)的混合運(yùn)算強(qiáng)制類型變換重點(diǎn):數(shù)據(jù)類型;數(shù)據(jù)的定義方法;各種類型數(shù)據(jù)的混合運(yùn)算22.1C語言的數(shù)據(jù)類型C語言支持的數(shù)據(jù)類型非常豐富,它包括:基本數(shù)據(jù)類型,構(gòu)造數(shù)據(jù)類型,指針類型,空類型四大類數(shù)據(jù)類型構(gòu)造類型指針類型*空類型(無值類型)void枚舉類型enum數(shù)組類型[]結(jié)構(gòu)體類型struct共用體類型union基本類型整型int字符型char實(shí)型(浮點(diǎn)型)單精度實(shí)型float雙精度實(shí)型double32.2常量、變量和標(biāo)識符對于基本數(shù)據(jù)類型量,根據(jù)其取值是否可改變可分為常量和變量兩種。1.常量常量:其值不發(fā)生改變的量稱為常量。常量可與數(shù)據(jù)類型結(jié)合起來分類。例如,整型常量、實(shí)型常量、字符型常量、字符串常量和符號常量。在編程過程中,常量是可以不經(jīng)說明而直接引用的,而變量則必須要先定義后使用。常用常量如下所示:整型常量:25、0、-7;實(shí)型常量:5.6、-6.9;字符常量:‘a(chǎn)’、‘b’。42.標(biāo)識符標(biāo)識符是用來標(biāo)識變量名、符號常量名、函數(shù)名、數(shù)組名、類型名、文件名的有效字符序列。用一個(gè)標(biāo)識符來表示一個(gè)常量,稱之為符號常量。符號常量在使用之前必須先定義,其一般形式為:#define標(biāo)識符常量其中#define也是一條預(yù)處理命令(預(yù)處理命令都以"#"開頭),稱為宏定義命令其功能是把該標(biāo)識符定義為其后的常量值。一經(jīng)定義,以后在程序中所有出現(xiàn)該標(biāo)識符的地方均代之以該常量值。一般習(xí)慣上符號常量的標(biāo)識符用大寫字母,變量標(biāo)識符用小寫字母,以示區(qū)別。5例2.1符號常量的使用。#defineLENGTH30#include<stdio.h>voidmain(){intarea,width;width=10;area=width*LENGTH;printf(“area=%d”,area);}程序運(yùn)行結(jié)果:area=300程序分析:使用符號常量參與運(yùn)算,符號常量與變量不同,它的值在其作用域內(nèi)不能改變,也不能再被賦值。使用符號常量的好處是:含意清楚;能做到“一改全改”。63.變量變量,其值可以改變的量稱為變量。一個(gè)變量應(yīng)該有一個(gè)名字,在內(nèi)存中占據(jù)一定的存儲(chǔ)單元。變量在使用之前必須進(jìn)行定義——即為每個(gè)變量取一個(gè)名稱(變量名),同時(shí)規(guī)定它的數(shù)據(jù)類型,以便編譯時(shí)根據(jù)數(shù)據(jù)類型分配存儲(chǔ)空間。C語言規(guī)定標(biāo)識符只能由字母、數(shù)字和下劃線3種字符組成,且第一個(gè)字符必須是字母或者下劃線。下面標(biāo)識符的寫法是合法的,可以作為變量名使用。Sum,Class_2,data,wang_ming,_high,a8,AREA,year_month_day下面是不合法的標(biāo)識符和變量名:*data1,99sum,%yuan,$BGss,MR.tom,a1>b1,s/t注意,編譯系統(tǒng)區(qū)分大小寫,將它們認(rèn)為是兩個(gè)不同的字符。所以,max和MAX是兩個(gè)不同的變量。7注意建議變量名的長度最好不要超過8個(gè)字符。在選擇變量名和其它標(biāo)識符時(shí)應(yīng)“見名知意”。要求對所有用到的變量作強(qiáng)制定義,也就是“先定義,后使用”。變量定義一般放在函數(shù)體的開頭部分。要區(qū)分變量名和變量值是兩個(gè)不同的概念。data變量名56變量值存儲(chǔ)單元變量名8變量名實(shí)際上就是以一個(gè)名字對應(yīng),代表一個(gè)地址。在對程序編譯連接時(shí)由編譯系統(tǒng)給每個(gè)變量名分配對應(yīng)的內(nèi)存地址。變量在定義時(shí)必須指定其數(shù)據(jù)類型,以便在編譯時(shí)為其分配存儲(chǔ)單元。 |&a2500H |—————— 2501H |----1250-----a=1250&b2502H |—————— 2503H |--------- 2504H |----123.67-----b=123.67 2505H |---------- 2506H |——————

變量名、變量值、變量地址間的關(guān)系例如:inta=1250;floatb=123.67;94.變量賦初值C語言中可有多種方法為變量提供初值??梢栽谧兞慷x的同時(shí)給變量賦以初值的方法。這種方法稱為初始化。在變量定義中賦初值的一般形式為:類型說明符變量1=值1,變量2=值2,……;例如:inta=68; /*指定a為整型變量,初值為68*/也可以使被定義的變量的一部分賦初值。例如floatb,c,d=7.9; 上式指定b,c,d為單精度實(shí)型變量,只對d初始化,其值為7.9。如果對幾個(gè)變量賦予相同的初值,應(yīng)寫為:inte=50,f=50,g=50;10例2.2部分初始化數(shù)據(jù)程序運(yùn)行結(jié)果:a=6,b=14,c=8程序分析:對定義的整型變量進(jìn)行部分初始化,然后參與運(yùn)算,并輸出結(jié)果。#include<stdio.h>voidmain(){inta=6,b,c=8;b=a+c;printf("a=%d,b=%d,c=%d\n",a,b,c);}115.變量的地址在定義了一個(gè)變量后,在內(nèi)存中會(huì)分配相應(yīng)的存儲(chǔ)單元,將變量的值存儲(chǔ)到該單元中。如前所述注意區(qū)分變量名和變量值這兩個(gè)不同的概念。例如:intx;floaty;x=3;y=3.14159;200020012002200320042005xy200633.14159…122.3簡單數(shù)據(jù)類型與表示范圍2.3.1整型數(shù)據(jù)1.整型常量的表示方法整型常量就是整常數(shù)。在C語言中,經(jīng)常使用的整常數(shù)有三種進(jìn)制,它們分別是八進(jìn)制、十六進(jìn)制和十進(jìn)制。八進(jìn)制前綴為“0”,十六進(jìn)制前綴為“0x”,十進(jìn)制無前綴。(1)十進(jìn)制整數(shù)。

如:123,-456.4。(2)八進(jìn)制整數(shù)。以0頭的數(shù)是八進(jìn)制數(shù)。

如:0123表示八進(jìn)制數(shù)123,等于十進(jìn)制數(shù)83,-011表示八進(jìn)制數(shù)-11,即十進(jìn)制數(shù)-9。13(3)十六進(jìn)制整數(shù)。以0x開頭的數(shù)是16進(jìn)制數(shù)。

如:0x123,代表16進(jìn)制數(shù)123,等于十進(jìn)制數(shù)291。-0x12等于十進(jìn)制數(shù)-18。

(4)整型常數(shù)的后綴:基本整型的長度為16位,十進(jìn)制無符號整常數(shù)的范圍為0~65535,有符號數(shù)為-32768~+32767。八進(jìn)制無符號數(shù)的表示范圍為0~0177777。十六進(jìn)制無符號數(shù)的表示范圍為0X0~0XFFFF或0x0~0xffff。如果使用的數(shù)超過了上述范圍,就必須加上后綴“L”或“l(fā)”變?yōu)殚L整型數(shù)來表示。例如:567L(十進(jìn)制為567)注意:長整數(shù)567L和基本整常數(shù)567在數(shù)值上并無區(qū)別,但是所占存儲(chǔ)空間大小不同。對567L而言,因?yàn)槭情L整型量,編譯系統(tǒng)將為它分配4個(gè)字節(jié)存儲(chǔ)空間。而對567,因是基本整型,則只分配2個(gè)字節(jié)的存儲(chǔ)空間。

142.整型變量(1)整型數(shù)據(jù)在內(nèi)存中的存放形式數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中是以二進(jìn)制形式存放的,例如,定義了一個(gè)整型變量a:inta; /*定義a為整型變量*/a=11; /*給a附以初值11*/由于在內(nèi)存中數(shù)值是以補(bǔ)碼表示的,正整數(shù)的補(bǔ)碼和它的原碼在二進(jìn)制形式上是相同的。所以,a=11,在內(nèi)存中的存放形式如下所示。內(nèi)存中圖a11000000000000101115負(fù)數(shù)的補(bǔ)碼:將該數(shù)的絕對值的二進(jìn)制形式按位取反后再加1。例如:求-11的補(bǔ)碼:符號位(2)整型的分類基本型:類型說明符為int,在內(nèi)存中占2個(gè)字節(jié)。短整量:類型說明符為shortint或short。所占字節(jié)和取值范圍均與基本型相同。長整型:類型說明符為longint或long,在內(nèi)存中占4個(gè)字節(jié)。16有符號型:類型說明符為signed;無符號型:類型說明符為unsigned。有符號型與無符號型又可與前三種類型匹配而構(gòu)成:類型名稱類型說明符數(shù)值范圍字節(jié)數(shù)有符號基本型[signed]int-32768~327672無符號基本型unsigned[int]0~655352有符號短整型[signed]short[int]-32768~327672無符號短整型unsignedshort[int]0~655352有符號長整型[signed]long[int]-2147483648~21474836474無符號長整型unsignedlong[int]0~42949672954上面帶[]的部分表示其內(nèi)容可以省略17(3)整型變量的定義變量定義的格式為:類型說明符變量名標(biāo)識符,變量名標(biāo)識符,...;說明:允許在一個(gè)類型說明符后,定義多個(gè)相同類型的變量,并使用逗號分割變量名中多個(gè)變量,使用分號結(jié)束。類型說明符與變量名之間至少用一個(gè)空格間隔。變量定義必須放在變量使用之前。一般放在函數(shù)體的開頭部分。在程序的同一部分,禁止對同一變量進(jìn)行重復(fù)定義,在書寫不同種類型變量定義時(shí),避免都寫在一行上。對所用到的變量必須進(jìn)行強(qiáng)制定義,即“先定義,后使用”。inta,b,c; /*a,b,c為整型變量*/longx,y; /*x,y為長整型變量*/18例2.3整型變量的定義與使用#include<stdio.h>voidmain(){longa,b;intx,sum,ave;/*定義整型變量x,sum,ave*/unsignedy; /*定義無符號整型變量y*/a=9;x=-10;y=20;b=x+a;sum=x+y;ave=(x+y)/2;/*不同類型數(shù)據(jù)間可進(jìn)行運(yùn)算*/printf("b=x+a=%ld,sum=%d,average=%d\n",b,sum,ave);}程序運(yùn)行結(jié)果:b=x+a=-1,sum=12,average=6 19(4)整型數(shù)據(jù)的溢出每個(gè)整型數(shù)據(jù)都有其自身的數(shù)據(jù)類型,有其自身所占存儲(chǔ)空間大小,基本整型int定義的變量的最大允許存儲(chǔ)值為32767

例3.4整型數(shù)據(jù)的溢出#include<stdio.h>voidmain(){intx,y;x=32767;y=x+1;printf("%d,%d\n",x,y);}程序運(yùn)行結(jié)果:32767,-32768程序分析:計(jì)算結(jié)果-32768與實(shí)際應(yīng)該的結(jié)果32768相差一個(gè)符號,為什么呢?數(shù)據(jù)在內(nèi)存中都是以該數(shù)的補(bǔ)碼的二進(jìn)制形式存放的,32767的補(bǔ)碼為0111111111111111,加1后發(fā)生進(jìn)位,變成1000000000000000,最高位的1占據(jù)了符號位,而它正好是-32768的補(bǔ)碼形式,所以才有上述輸出結(jié)果。202.3.2實(shí)型數(shù)據(jù)1.實(shí)型數(shù)據(jù)表示方法實(shí)型也稱為浮點(diǎn)型。C語言中,實(shí)數(shù)有二種形式:十進(jìn)制小數(shù)形式和指數(shù)形式。十進(jìn)制數(shù)形式:由數(shù)字0~9和小數(shù)點(diǎn)組成。注意,必須有小數(shù)點(diǎn),且小數(shù)點(diǎn)的前面或后面必須有數(shù)字。例如:3.1415926,0.0、0.1、7.0、780.、-25.860等均為合法的實(shí)數(shù)。指數(shù)形式:由十進(jìn)制數(shù)(基數(shù))、加階碼標(biāo)志“e”或“E”以及指數(shù)(階碼,只能為整數(shù),可以帶符號)組成。其一般形式為:aEn(a為十進(jìn)制數(shù)—基數(shù),n為十進(jìn)制整數(shù)—階碼)其值為a*10n。如:1.6E2(等于1.6*102)注意:階碼標(biāo)志e(或E)之前必須有數(shù)字,且e后的指數(shù)必須為整數(shù)。212.實(shí)型數(shù)據(jù)在內(nèi)存中的存放形式實(shí)型數(shù)據(jù)一般占4個(gè)字節(jié)(32位)內(nèi)存空間。與整型數(shù)據(jù)的存儲(chǔ)方式不同,系統(tǒng)把一個(gè)實(shí)型數(shù)據(jù)分為小數(shù)部分和指數(shù)部分分別存放。指數(shù)部分采用規(guī)范化的指數(shù)形式表示。例如,實(shí)數(shù)7.15731在內(nèi)存中的存放形式如下:圖中是用十進(jìn)制形式來表示的,實(shí)際上計(jì)算機(jī)中是用二進(jìn)制來表示小數(shù)部分,以及用2的冪次來表示指數(shù)部分的。1+.715731+數(shù)符小數(shù)部分指符指數(shù)+.715731×(+101)=0.715731223.實(shí)型變量的分類實(shí)型變量分為:單精度(float型)、雙精度(double型)和長雙精度(longdouble型)三類。類型說明符比特?cái)?shù)(字節(jié)數(shù))有效數(shù)字?jǐn)?shù)的范圍float32(4)6~710-37~1038

double64(8)15~1610-307~10308

longdouble128(16)18~1910-4931~104932

實(shí)型變量定義,例如:floatx,y; /*x,y為單精度實(shí)型量*/doublea,b,c; /*a,b,c為雙精度實(shí)型量*/longdoublez; /*z為長雙精度實(shí)型量*/234.實(shí)型數(shù)據(jù)的舍入誤差由于實(shí)型變量的存儲(chǔ)單元能提供的有效數(shù)字總是有限的,其中單精度的有效數(shù)字是7為,雙精度的是16位。在有效位數(shù)之外的數(shù)字將被舍去,因此會(huì)產(chǎn)生誤差。例2.5實(shí)型數(shù)據(jù)的舍入誤差。#include<stdio.h>voidmain(){floatx,y;x=7654321.152e3;y=x+33;printf("%f,%f\n",x,y);}程序運(yùn)行結(jié)果:7654321152.000000,7654321152.000000“%f”是輸出實(shí)數(shù)的制定格式。結(jié)果中x=y(tǒng),單精度的x較33大的多,其有效位數(shù)是7位,超過此范圍的數(shù)字是無意義的。TurboC規(guī)定小數(shù)后最多保留六位。應(yīng)避免這種被“忽視”的情況發(fā)生。245.實(shí)型常數(shù)的類型實(shí)型常數(shù)不分單、雙精度,都按雙精度double型處理。例如定義一個(gè)實(shí)型變量a,進(jìn)行如下運(yùn)算:a=3.14159*7.1617編譯系統(tǒng)先將3.14159和7.1617作為雙精度數(shù)進(jìn)行相乘的運(yùn)算,得到的結(jié)果也是雙精度的,然后取其前7位有效數(shù)字賦值給實(shí)型變量a。這樣,可以使計(jì)算的結(jié)果更加精確。252.3.3字符型數(shù)據(jù)和字符串常量字符型數(shù)據(jù)包括字符常量和字符變量。1.字符常量字符常量是用一對單引號括起來的一個(gè)字符。例如:‘x’、‘d’、‘=’、‘!’等都是合法字符常量。注意:'d'和'D'是兩個(gè)不同的字符常量。注意:字符常量只能是單個(gè)字符,不能是字符串。字符可以是字符集中除了單引號本身“'”、雙引號“"”、反斜杠“\”外的任意字符。但數(shù)字被定義為字符型之后就不能參與數(shù)值運(yùn)算。如'6'和6是不同的。'6’是字符常量,不能參與運(yùn)算。例‘a(chǎn)’,‘A’,‘1’‘a(chǎn)bc’、“a”262.轉(zhuǎn)義字符轉(zhuǎn)義字符以反斜線“\”開頭,后跟一個(gè)或幾個(gè)字符。轉(zhuǎn)義字符具有特定的含義,不同于字符的原意,故稱“轉(zhuǎn)義”字符。如,輸出函數(shù)中用到的“\n”其意義是“回車換行”C語言中,轉(zhuǎn)義字符有三種:簡單轉(zhuǎn)義字符、八進(jìn)制轉(zhuǎn)義字符和十六進(jìn)制轉(zhuǎn)義字符。\n換行

\t橫向跳格(水平制表8列)\r回車\\反斜杠\’單引號\”雙引號 \dddddd表示1到3位八進(jìn)制數(shù)字\xhhhh表示1到2位十六進(jìn)制數(shù)字27例2.6轉(zhuǎn)義字符的使用。程序運(yùn)行結(jié)果:

f___g_c_de#include<stdio.h>voidmain(){printf(“__ab__c\tde\rf____\(yùn)bg\n”);}程序分析:注意:轉(zhuǎn)義字符的作用。首先在左端輸出“__ab__c”,然后遇到“\t”,它的作用是跳到下一個(gè)制表符位置;一個(gè)制表符占8列,下一制表符位置從第9列開始,故在第9~10列上輸出“de”;然后遇到“\r”,它代表“回車”(不換行),于是返回到本行的行首(最左端第1列),輸出“f____”;然后遇到“\b”,它代表“退一格”,接著輸出“g”。程序運(yùn)行時(shí)的輸出結(jié)果為:f_abg_c_de但顯示器上看到的結(jié)果與上述結(jié)果不同,為:f___g_c_de中間的字符被后續(xù)字符取代了。283.字符變量字符變量用來存儲(chǔ)字符常量,它只能存放一個(gè)字符。字符變量的類型說明符是char。字符變量類型定義的格式和書寫規(guī)則都與整型變量相同。例如:chara,b;4.在內(nèi)存中的存儲(chǔ)形式每個(gè)字符變量被分配一個(gè)字節(jié)的內(nèi)存空間,字符型數(shù)據(jù)在存儲(chǔ)時(shí),并不是把該字符本身放到內(nèi)存單元中,而是把該字符的ASCII碼值存放在變量的內(nèi)存單元之中的。例如:A的十進(jìn)制ASCII碼是65,a的十進(jìn)制ASCII碼是9729在內(nèi)存單元中存放的是65和97的二進(jìn)制代碼:字符型數(shù)據(jù)在內(nèi)存中是以ASCII碼存放的,它的存儲(chǔ)形式與整數(shù)的存儲(chǔ)形式類似。使得字符型數(shù)據(jù)和整型數(shù)據(jù)之間可以通用。C語言允許對整型變量賦以字符值,也允許對字符變量賦以整型值。在輸出時(shí),允許把字符變量按整型量輸出,也允許把整型量按字符量輸出。30例2.7向字符變量與整型數(shù)據(jù)通用程序運(yùn)行結(jié)果:a,A65,97#include<stdio.h>voidmain(){chara,b;a=65;b=97;printf("%c,%c\n",a,b);printf("%d,%d\n",a,b);}a,b值的輸出形式取決于printf函數(shù)格式串中的格式符,當(dāng)格式符為"%c"時(shí),對應(yīng)輸出的變量值為字符,當(dāng)格式符為"%d"時(shí),對應(yīng)輸出的變量值為整數(shù)。由此可知,字符型數(shù)據(jù)和整型數(shù)據(jù)是可以通用的,但要注意字符型數(shù)據(jù)只占一個(gè)字節(jié),它只能存放0-255范圍的整數(shù)。31例2.8大小寫字母的轉(zhuǎn)換程序運(yùn)行結(jié)果:A,b65,98#include<stdio.h>voidmain(){chara,b;a='a';b='B';a=a-32;b=b+32;printf("%c,%c\n%d,%d\n",a,b,a,b);}a,b為字符變量并賦予字符值,C語言允許字符變量參與數(shù)值運(yùn)算,即用字符的ASCII碼值參與運(yùn)算。大小寫字母的ASCII碼值相差32,因此可以將小寫字母與大寫字母進(jìn)行相互轉(zhuǎn)換,然后分別以字符型和整型輸出。325.字符串常量字符常量是用一對單引號括起來的一個(gè)字符,而字符串常量則是由一對雙引號括起的字符序列。例如:“chongqing”,“Cprogram”,“&1.75”,“a”等都是合法的字符串常量。字符串常量和字符常量是不同的量。它們之間的主要區(qū)別如下:外形不同,字符常量由一對單引號括起來,字符串常量由一對雙引號括起來。注意,'a'和"a"是不同的。內(nèi)容不同,字符常量只能是單個(gè)字符,字符串常量則可以含一個(gè)或多個(gè)字符。單向賦值,可以把一個(gè)字符常量賦予一個(gè)字符變量,但不能把一個(gè)字符串常量賦予一個(gè)字符變量??臻g不同,字符常量占一個(gè)字節(jié)的內(nèi)存空間,字符串常量占的內(nèi)存字節(jié)數(shù)等于字符串中字節(jié)數(shù)加1。末尾增加的一個(gè)字節(jié)用于存放字符串結(jié)束的標(biāo)志字符"\0"(ASCII碼為0)。33字符串"chongqing"的長度是9個(gè)字節(jié),在內(nèi)存中所占的字節(jié)為10,其存儲(chǔ)方式如下圖所示:最后一個(gè)字符為'\0',在輸出時(shí)是不會(huì)輸出'\0'的。注意在書寫程序時(shí)不必加'\0','\0'是系統(tǒng)自動(dòng)加上的。字符常量'a'和字符串常量"a"雖然都只有一個(gè)字符,但在內(nèi)存中的情況是不同的。'a'在內(nèi)存中占一個(gè)字節(jié),"a"在內(nèi)存中占二個(gè)字節(jié)。342.3.4各數(shù)據(jù)類型間的混合運(yùn)算整型(包括int,short,long)、浮點(diǎn)型(包括float,double)可以混合運(yùn)算。在進(jìn)行運(yùn)算時(shí),不同類型的數(shù)據(jù)要先轉(zhuǎn)換成同一類型,然后進(jìn)行運(yùn)算.轉(zhuǎn)換的原則就是為了兩個(gè)運(yùn)算對象的計(jì)算結(jié)果盡可能提供多的存儲(chǔ)空間。當(dāng)運(yùn)算符兩端的運(yùn)算對象的數(shù)據(jù)類型不一致時(shí),在運(yùn)算前先將類型等級較低的數(shù)據(jù)轉(zhuǎn)換成等級較高的數(shù)據(jù)——保值轉(zhuǎn)換。上述的類型轉(zhuǎn)換是由系統(tǒng)自動(dòng)進(jìn)行的.doublefloatlongunsignedintChar,short高低橫向向左的箭頭表示必定的轉(zhuǎn)換縱向的箭頭表示數(shù)據(jù)類型級別的高低,實(shí)際運(yùn)算時(shí)不需逐級轉(zhuǎn)換,可由級別低的直接轉(zhuǎn)換為級別高的。35賦值號兩邊量的數(shù)據(jù)類型不同時(shí),賦值號右邊量的類型將轉(zhuǎn)換為左邊量的類型。如果右邊量的數(shù)據(jù)類型長度左邊長時(shí),將丟失一部分?jǐn)?shù)據(jù),這樣會(huì)降低精度,丟失的部分按四舍五入向前舍入。例3.9數(shù)據(jù)類型轉(zhuǎn)換#include<stdio.h>voidmain(){floatPI=3.14159;ints,r=5;s=r*r*PI;printf("s=%d\n",s);}程序運(yùn)行結(jié)果:s=78PI為實(shí)型;s,r為整型。在執(zhí)行s=r*r*PI語句時(shí),r和PI都轉(zhuǎn)換成double型計(jì)算,結(jié)果也為double型。但由于s為整型,故賦值結(jié)果仍為整型,舍去了小數(shù)部分。362.3.5簡單數(shù)據(jù)類型的表示范圍

類型說明符字節(jié)數(shù)值范圍字符型char1C字符集基本整型int2-32768~32767短整型shortint2-32768~32767長整型longint4-214783648~214783647無符號型unsigned20~65535無符號長整型unsignedlong40~4294967295單精度實(shí)型float43/4E-38~3/4E+38雙精度實(shí)型double81/7E-308~1/7E+308372.3.6數(shù)據(jù)的簡單輸出將數(shù)據(jù)結(jié)果展示出來,必須使用輸出語句,所謂輸入輸出是以計(jì)算機(jī)為主體而言的。在C語言中,所有的數(shù)據(jù)輸入/輸出都是由庫函數(shù)完成的。在使用C語言庫函數(shù)時(shí),要用預(yù)編譯命令#include將有關(guān)“頭文件”包括到源文件中。使用標(biāo)準(zhǔn)輸入輸出庫函數(shù)時(shí)要用到“stdio.h”文件,因此源文件開頭應(yīng)有以下預(yù)編譯命令:#include<stdio.h>或#include"stdio.h“stdio是standardinput&outupt的英文縮寫,其意思是標(biāo)準(zhǔn)輸入輸出。38printf函數(shù)調(diào)用的一般形式為:printf("格式控制字符串",輸出表列)其中“格式控制字符串”用于指定輸出格式。“格式控制字符串”可由格式字符串和非格式字符串兩種組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數(shù)據(jù)的類型、形式、長度、小數(shù)位數(shù)等。如:“%d”表示按十進(jìn)制整型輸出;“%ld”表示按十進(jìn)制長整型輸出;“%c”表示按字符型輸出等?!?f”表示按小數(shù)形式輸出單、雙精度實(shí)數(shù)非格式字符串在輸出時(shí)原樣照印,在顯示中起提示作用。輸出表列中給出了各個(gè)輸出項(xiàng),要求格式字符串和各輸出項(xiàng)在數(shù)量和類型上應(yīng)該一一對應(yīng)。39例2.10數(shù)據(jù)輸出程序運(yùn)行結(jié)果:688068,80D,Pa=68,b=80xis3.140000#include<stdio.h>voidmain(){inta=68,b=80;floatx=3.14;printf("%d%d\n",a,b);printf("%d,%d\n",a,b);printf("%c,%c\n",a,b);printf("a=%d,b=%d\n",a,b);printf("xis%f\n",x);}輸出第一句中,在兩%d之間加了一個(gè)空格(非格式字符),所以輸出的a,b值之間有一個(gè)空格。第二句中加入的是非格式字符逗號,因此輸出的a,b間加了一個(gè)逗號。第三句要求按字符型輸出a,b值。第四句中為了提示輸出結(jié)果又增加了非格式字符串。第五句的格式串要求按實(shí)型輸出,其他非格式字符按原型輸出。402.4C語言的運(yùn)算符與表達(dá)式2.4.1C語言運(yùn)算符簡介1.運(yùn)算符C語言的運(yùn)算符可分為算術(shù)運(yùn)算符、賦值運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、條件運(yùn)算符、逗號運(yùn)算符及一些特殊的運(yùn)算符。按運(yùn)算符與運(yùn)算對象(操作數(shù))的關(guān)系可將C語言的運(yùn)算符分為單目運(yùn)算符、雙目運(yùn)算符和三目運(yùn)算符。單目運(yùn)算符是指運(yùn)算符只需要一個(gè)操作數(shù),如!,++,--等;雙目運(yùn)算符是指運(yùn)算符需要兩個(gè)操作數(shù),即運(yùn)算符的左右兩側(cè)都需要一個(gè)操作數(shù),如+,-,*,/,%等;三目運(yùn)算符是指運(yùn)算符需要三個(gè)操作數(shù),如條件運(yùn)算符?:。41C語言的運(yùn)算符可分為以下幾類:算術(shù)運(yùn)算符:用于各類數(shù)值運(yùn)算。包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運(yùn)算,%)、自增(++)、自減(--)共七種。關(guān)系運(yùn)算符:用于比較運(yùn)算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六種。邏輯運(yùn)算符:用于邏輯運(yùn)算。包括與(&&)、或(||)、非(!)三種。位操作運(yùn)算符:參與運(yùn)算的量,按二進(jìn)制位進(jìn)行運(yùn)算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)賦值運(yùn)算符:用于賦值運(yùn)算,分為簡單賦值(=)、復(fù)合算術(shù)賦值(+=,-=,*=,/=,%=)和復(fù)合位運(yùn)算賦值(&=,|=,^=,>>=,<<=)條件運(yùn)算符:這是一個(gè)三目運(yùn)算符,用于條件求值(?:)。逗號運(yùn)算符:用于把若干表達(dá)式組合成一個(gè)表達(dá)式(,)。指針運(yùn)算符:用于取內(nèi)容(*)和取地址(&)二種運(yùn)算。求字節(jié)數(shù)運(yùn)算符:用于計(jì)算數(shù)據(jù)類型所占的字節(jié)數(shù)(sizeof)。強(qiáng)制類型轉(zhuǎn)換運(yùn)算符:強(qiáng)制進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換((類型))。分量運(yùn)算符:用于存取結(jié)構(gòu)和聯(lián)合中的成員(→,.),其優(yōu)先級在所有運(yùn)算符中是最高的。下標(biāo)運(yùn)算符:用于數(shù)組下標(biāo)的表示([]).其他運(yùn)算符:如函數(shù)調(diào)用運(yùn)算符(())。422.表達(dá)式表達(dá)式是使用運(yùn)算符和圓括號將操作數(shù)連接起來構(gòu)成的式子。C語言的操作數(shù)包括常量、變量、函數(shù)值等。例如:表達(dá)式(x-y)/(3*a+b)-6*d中包括+,-,/,*等運(yùn)算符,操作數(shù)包括x,y,a,b,3等。C語言的運(yùn)算符不僅具有不同的優(yōu)先級,而且還有一個(gè)特點(diǎn),就是它的結(jié)合性。3.簡單語句C語言中,在表達(dá)式的末尾加上一個(gè)分號“;”就構(gòu)成了簡單語句。在程序設(shè)計(jì)過程中要避免使用無意義的簡單語句。431.賦值運(yùn)算符賦值就是將一個(gè)數(shù)據(jù)值存儲(chǔ)到一個(gè)變量中。注意,賦值的對象只能是變量,而這個(gè)數(shù)據(jù)值既可以是常量,也可以是變量,還可以是有確定值的表達(dá)式。賦值運(yùn)算符記為“=”,其作用是將一個(gè)數(shù)據(jù)賦給一個(gè)變量。例如,“a=3;”其作用是執(zhí)行一次賦值操作,表示將常量3賦給變量a。2.賦值表達(dá)式由賦值運(yùn)算符“=”將一個(gè)變量和表達(dá)式連接的式子稱為賦值表達(dá)式。其一般形式為:變量=表達(dá)式例如:x=sin(a)+(i++);2.4.2賦值運(yùn)算符和賦值表達(dá)式44對賦值表達(dá)式求解的過程是:

①求賦值運(yùn)算符右側(cè)的“表達(dá)式”的值;②賦給賦值運(yùn)算符左側(cè)的變量。例如:賦值表達(dá)式“a=3*5”的值為15,執(zhí)行表達(dá)式后,變量a的值也是15。注意:一個(gè)表達(dá)式應(yīng)該有一個(gè)值

45左值(lvalue):賦值運(yùn)算符左側(cè)的標(biāo)識符變量可以作為左值;而表達(dá)式就不能作為左值(如a+b);常變量也不能作為左值,右值(rvalue):出現(xiàn)在賦值運(yùn)算符右側(cè)的表達(dá)式左值也可以出現(xiàn)在賦值運(yùn)算符右側(cè),因而左值都可以作為右值。

賦值表達(dá)式中的“表達(dá)式”,又可以是一個(gè)賦值表達(dá)式.例如:a=(b=5)分析:括弧內(nèi)的“b=5”是一個(gè)賦值表達(dá)式,它的值等于5。執(zhí)行表達(dá)式“a=(b=5)”相當(dāng)于執(zhí)行“b=5”和“a=b”兩個(gè)賦值表達(dá)式。賦值運(yùn)算符按照“自右而左”的結(jié)合順序,因此,“(b=5)”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等價(jià),最后a=5。46請分析下面的賦值表達(dá)式∶(a=3*5)=4*3分析:先執(zhí)行括弧內(nèi)的運(yùn)算,將15賦給a,然后執(zhí)行4*3的運(yùn)算,得12,再把12賦給a。最后a的值為12,整個(gè)表達(dá)式的值為12??梢钥吹健?a=3*5)出現(xiàn)在賦值運(yùn)算符的左側(cè),因此賦值表達(dá)式(a=3*5)是左值注意:在對賦值表達(dá)式(a=3*5)求解后,變量a得到值15,執(zhí)行(a=3*5)=4*3時(shí),實(shí)際上是將4*3的積12賦給變量a,而不是賦給3*5。不能寫成:a=3*5=4*347將賦值表達(dá)式作為表達(dá)式的一種,使賦值操作不僅可以出現(xiàn)在賦值語句中,而且可以以表達(dá)式形式出現(xiàn)在其他語句(如輸出語句、循環(huán)語句等)中.如:printf("%d",a=b);

分析:如果b的值為3,則輸出a的值(也是表達(dá)式a=b的值)為3。在一個(gè)語句中完成了賦值和輸出雙重功能。483.類型轉(zhuǎn)換如果賦值運(yùn)算符兩邊的數(shù)據(jù)類型不相同,系統(tǒng)將自動(dòng)進(jìn)行類型轉(zhuǎn)換,即把賦值號右邊的類型換成左邊的類型。具體規(guī)定如下:(1)整型數(shù)與實(shí)型數(shù)之間的轉(zhuǎn)換將實(shí)型數(shù)據(jù)(單、雙精度)賦予整型變量時(shí),舍去實(shí)型數(shù)據(jù)的小數(shù)部分。例如:整型變量i,執(zhí)行“i=3.14”的結(jié)果是使得i的值為3,以整數(shù)形式存儲(chǔ)在內(nèi)存中。將整型數(shù)據(jù)賦給實(shí)型(單、雙精度)變量時(shí),數(shù)值不變,但以實(shí)型數(shù)據(jù)形式存儲(chǔ)在內(nèi)存中,即增加小數(shù)部分(小數(shù)部分的值為0)。49(2)實(shí)型數(shù)據(jù)之間的轉(zhuǎn)換將一個(gè)double型數(shù)據(jù)賦給float型變量時(shí),截取其前7位有效數(shù)字,存放到float型變量的存儲(chǔ)單元(32位)中。注意,數(shù)值范圍不能溢出。例如:floata;doubleb=123.456789e100;a=b;便會(huì)出現(xiàn)溢出錯(cuò)誤。將一個(gè)float型數(shù)據(jù)賦給double型變量時(shí),其數(shù)值不變,有效位數(shù)擴(kuò)展到16位,在內(nèi)存中以64位存儲(chǔ)。50(3)整型數(shù)與字符型數(shù)之間的轉(zhuǎn)換字符型數(shù)據(jù)賦給整型變量時(shí),由于字符型只占一個(gè)字節(jié),而整型占二個(gè)字節(jié),故將字符的ASCII碼值放到整型量的低八位中,這時(shí)有兩種情況:如所用系統(tǒng)將字符型數(shù)據(jù)處理為無符號型的量或?qū)nsignedint型變量賦值,則將字符型數(shù)據(jù)(8位二進(jìn)制位)放到整型變量的低8位,高8位補(bǔ)為0。例如將字符'\376'(代表圖形字符“■”,其ASCII碼值為254)賦給int型變量a,如下圖所示。11111110‘\376’a000000001111111051如所用系統(tǒng)(如TurboC++3.0)將字符型數(shù)據(jù)處理為帶符號型的量(即signedchar),如字符最高位為0,則整型變量高8位補(bǔ)0;如字符最高位為1,則高8位全補(bǔ)1,見下圖所示。這稱為“符號擴(kuò)展”,這樣做的目的是使數(shù)值保持不變,如上述字符'/376'以整數(shù)形式輸出為-2,a的值也是-2。11111110‘\376’a111111111111111011111110‘\376’a111111111111111011111110‘\376’a111111111111111052將一個(gè)int、short、long型數(shù)據(jù)賦給一個(gè)char型變量時(shí),只將其低8位原封不動(dòng)地送到char型變量(截?cái)啵@纾篿nta=291;charb='c';b=a;賦值情況見下圖所示,字符變量b的值為35,如用“%c”格式輸出b,將得到字符“?!保ㄆ銩SCII為35)。00100011i=2910000000100100011b=3553(4)整型數(shù)據(jù)之間的轉(zhuǎn)換如將帶符號的整型數(shù)據(jù)(int型)賦給long型變量時(shí),要進(jìn)行符號擴(kuò)展,將整型數(shù)的16位送到long型低16位中。如int型數(shù)據(jù)為正值(符號位為0),則long型變量的高16位補(bǔ)0;如int型變量為負(fù)值(符號位為1),則long型變量的高16位補(bǔ)1,以保證數(shù)值不改變。如將一個(gè)long型數(shù)據(jù)賦給一個(gè)int型變量,只將long型數(shù)據(jù)中低16位原封不動(dòng)地送到int型變量(截?cái)啵?。例如:intx;longy=9;x=y;賦值情況如下圖所示,54如果y=65536(八進(jìn)制數(shù)0200000),則在賦值后x值為0,如下圖所示。000000000000000000000000000010010000000000001001y=9符號位a=9符號位000000000000000100000000000000000000000000000000b=65536符號位a=0符號位55(5)無符號整數(shù)與其他整數(shù)之間的轉(zhuǎn)換將一個(gè)unsignedint類型數(shù)據(jù)賦給一個(gè)與其長度相同的整型變量(如unsignedint→int,unsignedlong→long,unsignedshort→short)時(shí),將unsigned型變量的內(nèi)容原樣送到非unsigned型變量中,即進(jìn)行原樣復(fù)制;但如果數(shù)據(jù)范圍超過相應(yīng)整型的范圍,則會(huì)出現(xiàn)數(shù)據(jù)錯(cuò)誤。例如:unsignedintx=65535;inty;y=x;將x整個(gè)送到y(tǒng)中,如下圖所示。由于y是int型,第1位是符號位,因此y成了負(fù)數(shù)。根據(jù)補(bǔ)碼指數(shù)可知,y的值為-1,可以用printf("%d",b)來驗(yàn)證。56將非unsigned型數(shù)據(jù)賦值給長度相同的unsigned型變量,也是原樣賦值(連原有的符號也作為數(shù)值一起傳遞),yx符號位1111111111111111111111111111111157例2.11有符號數(shù)據(jù)送給無符號變量程序運(yùn)行結(jié)果:65535程序分析:賦值情況如下圖所示#include<stdio.h>voidmain(){unsignedx;inty=-1;x=y;printf("%u\n",x);}yx符號位11111111111111111111111111111111不同類型的整型數(shù)據(jù)間的賦值歸根結(jié)底就是一條,按存儲(chǔ)單元中的存儲(chǔ)形式直接傳送。584.復(fù)合賦值運(yùn)算符除了基本賦值運(yùn)算符外,C語言還提供了另外十種復(fù)合運(yùn)算符。它們就是在賦值符“=”之前加上其它二目運(yùn)算符可構(gòu)成復(fù)合賦值符。如+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。這些運(yùn)算符把“運(yùn)算”和“賦值”兩個(gè)操作結(jié)合在一起稱之為復(fù)合賦值運(yùn)算符。采用復(fù)合賦值運(yùn)算符可提高代碼執(zhí)行效率。構(gòu)成復(fù)合賦值表達(dá)式的一般形式為:變量雙目運(yùn)算符=表達(dá)式它等效于:變量=變量運(yùn)算符表達(dá)式即將左邊的(變量)與右邊的(表達(dá)式)進(jìn)行(雙目運(yùn)算符)所規(guī)定的運(yùn)算,然后將值返回給變量。例如x*=y+38 等價(jià)于x=x*(y+38)

59為便于記憶,可以這樣理解:

①x+=y(其中x為變量,y為表達(dá)式)②x+=y(將有下劃線的“x+”移到“=”右側(cè))|___↑③x=x+y(在“=”左側(cè)補(bǔ)上變量名a)注意:如y是包含若干項(xiàng)的表達(dá)式,則相當(dāng)于它有括號。對賦值表達(dá)式a+=a-=a*a,如果a的初值為3,則此賦值表達(dá)式求解步驟如下:先進(jìn)行“a-=a*a”的運(yùn)算,它相當(dāng)于a=a-a*a,a的值為3-9=-6。再進(jìn)行“a+=-6”的運(yùn)算,相當(dāng)于a=a+(-6),a的值為-6-6=-12。602.4.3強(qiáng)制類型轉(zhuǎn)換符強(qiáng)制類型轉(zhuǎn)換符就是“()”,它是單目運(yùn)算符,它把表達(dá)式的類型強(qiáng)制類型轉(zhuǎn)換成圓括號中的“數(shù)據(jù)類型名”所指定的類型。強(qiáng)制類型轉(zhuǎn)換又稱為顯示轉(zhuǎn)換。其一般形式為:(類型說明符)(表達(dá)式)其功能是把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成類型說明符所表示的類型。例如:(int)a /*把a(bǔ)轉(zhuǎn)換為整型*/(float)(x+y) /*把x+y的結(jié)果轉(zhuǎn)換為實(shí)型*/61使用強(qiáng)制轉(zhuǎn)換時(shí)應(yīng)注意以下問題:類型說明符和表達(dá)式都必須加括號,單個(gè)變量可以不加括號。例如,不要把(int)a,寫成int(a)。上式(float)(x+y)如寫成floatx+y則只是將x轉(zhuǎn)換成實(shí)型,再與y相加。無論是強(qiáng)制轉(zhuǎn)換或是自動(dòng)轉(zhuǎn)換,都只是為了本次運(yùn)算的需要而對變量的數(shù)據(jù)長度進(jìn)行的臨時(shí)性轉(zhuǎn)換,而不改變數(shù)據(jù)說明時(shí)對該變量定義的類型。例如,(int)a,如a原指定為float型,則進(jìn)行強(qiáng)制類型轉(zhuǎn)換后,得到一個(gè)int型的中間變量,它的值等于a的整數(shù)部分,而a的類型不變,仍為float型。62例2.12強(qiáng)制類型轉(zhuǎn)換程序運(yùn)行結(jié)果:x=3,a=3.140000程序分析:本例表明,a雖強(qiáng)制轉(zhuǎn)為int型,但只在運(yùn)算中起作用,是臨時(shí)的,而a本身的類型并不改變(仍為float型)。因此,(int)f的值為3(刪去了小數(shù))而f的值仍為3.14。#include<stdio.h>voidmain(){floata=3.14;intx;x=(int)a;printf("(x=%d,a=%f\n",x,a);}632.4.4算術(shù)運(yùn)算符和算術(shù)表達(dá)式

(1)基本的算術(shù)運(yùn)算符:+(加法運(yùn)算符,或正值運(yùn)算符。如:3+5、+3)-(減法運(yùn)算符,或負(fù)值運(yùn)算符。如:5-2、-3)*(乘法運(yùn)算符。如:3*5)/(除法運(yùn)算符。如:5/3)%(模運(yùn)算符,或稱求余運(yùn)算符,%兩側(cè)均應(yīng)為整型數(shù)據(jù),如:7%4的值為3)64使用上述運(yùn)算符時(shí)需要注意幾點(diǎn):兩整數(shù)相除,結(jié)果為整數(shù)(舍去小數(shù)部分),商向下取整。如,20/7,的結(jié)果為2,3/4的結(jié)果為0。但是,如果除數(shù)或被除數(shù)中有一個(gè)為負(fù)數(shù),則舍入的方向是不固定的。例如,-5/3,有的機(jī)器上得到結(jié)果-1,有的機(jī)器上得到結(jié)果-2。多數(shù)機(jī)器采取“向零取整”的方法,即-5/3=-1,取整后向零靠攏。如參與+,-,*,/運(yùn)算的兩個(gè)數(shù)中有一個(gè)為實(shí)型,則結(jié)果為double型,因?yàn)閷?shí)型都按dounle型進(jìn)行處理。取摸運(yùn)算符%實(shí)際上就是數(shù)學(xué)運(yùn)算中的求余運(yùn)算符,它要求參與運(yùn)算的兩個(gè)操作對象均為整型。求余運(yùn)算的結(jié)果等于兩數(shù)相除后的余數(shù),結(jié)果的符號與%左邊的操作數(shù)的符號相同。例如,20%3的結(jié)果為2,45%-8的結(jié)果為5(其中“-”為負(fù)值運(yùn)算符),-45%8的結(jié)果為-5。65例2.13除法及求余運(yùn)算程序運(yùn)行結(jié)果:2,-22.857143,-2.8571431程序分析:第一條輸出說明除法運(yùn)算中兩操作數(shù)均為整數(shù)時(shí)其結(jié)果為整數(shù),如操作數(shù)中出現(xiàn)負(fù)數(shù),其結(jié)果向零取整。第二條輸出說明除法運(yùn)算中兩操作數(shù)中有一個(gè)為實(shí)數(shù),其結(jié)果為double型。第三條輸出說明取模運(yùn)算是得到兩除數(shù)的余數(shù),結(jié)果符號與%左邊的操作數(shù)的符號相同。#include<stdio.h>voidmain(){printf("%d,%d\n",20/7,-20/7);printf("%f,%f\n",20.0/7,-20.0/7);printf("%d\n",100%-3);}662.4.5自增自減運(yùn)算符1.自增自減運(yùn)算符在C語言中提供了兩個(gè)特殊的運(yùn)算符:自增運(yùn)算符“++”和自減運(yùn)算符“――”。自增運(yùn)算符“++”,其功能是使變量的值自增1。自減運(yùn)算符“――”,其功能是使變量值自減1。它們均為單目運(yùn)算,都具有右結(jié)合性,可以出現(xiàn)在運(yùn)算符的前面或后面。有以下幾種形式: ++i i自增1后再參與其它運(yùn)算。 ――i i自減1后再參與其它運(yùn)算。 i++ i參與運(yùn)算后,i的值再自增1。 i―― i參與運(yùn)算后,i的值再自減1。注意區(qū)分“++”(或“――”)出現(xiàn)在運(yùn)算變量的前面還是后面,這決定著變量使用前進(jìn)行加(減)操作,還是使用后進(jìn)行加(減)的操作。67如i的初值為3,則j=++i是先執(zhí)行i加1后,再把i的值4賦給j,最終i和j的值均為4;而k=i++是先把i的值3賦給k后,再執(zhí)行i加1,最終k的值為3,i的值為4。使用自增、自減運(yùn)算符時(shí),需注意以下幾點(diǎn):自增運(yùn)算符(++)和自減運(yùn)算符(――),只能用于變量,而不能用于常量或表達(dá)式。例如,++26或(a-b)++是不合法的。自增、自減運(yùn)算符是單目運(yùn)算符,其優(yōu)先級高于基本的算術(shù)運(yùn)算符,與單目運(yùn)算符“-”(取負(fù))的優(yōu)先級相同,其結(jié)合方向是“自右至左”。68例2.14自增自減運(yùn)算程序運(yùn)行結(jié)果:9889-8-9#include<stdio.h>voidmain(){inti=8;printf("%d\n",++i);printf("%d\n",--i);printf("%d\n",i++);printf("%d\n",i--);printf("%d\n",-i++);printf("%d\n",-i--);}程序分析:i的初值為8,輸出語句第1行i加1后輸出故為9;輸出語句第2行減1后輸出故為8;第3行輸出i為8之后再加1(為9);第4行輸出i為9之后再減1(為8);第5行輸出-8之后再加1(為9),第7行輸出-9之后再減1(為8)。注意,-i++和-i――之前的“-”為負(fù)值運(yùn)算符,因此按照結(jié)合性這兩個(gè)表達(dá)式相當(dāng)于-(i++)和-(i――)。692.表達(dá)式使用中的問題說明ANSIC并沒有具體規(guī)定表達(dá)式中的子表達(dá)式的求值順序,允許各編譯系統(tǒng)自己安排。例如:對表達(dá)式a=f1()+f2()并不是所有的編譯系統(tǒng)都先調(diào)用f1(),然后調(diào)用f2()。在有的情況下結(jié)果可能不同。有時(shí)會(huì)出現(xiàn)一些令人容易搞混的問題,因此務(wù)必要小心謹(jǐn)慎。調(diào)用先后順序不同,結(jié)果可能不同。C語言中有的運(yùn)算符為一個(gè)字符,有的運(yùn)算符由兩個(gè)字符組成,為避免誤解,最好采取大家都能理解的寫法。例如:不要寫成a+++b的形式,而應(yīng)寫成(a++)+b的形式702.4.6位運(yùn)算符、位運(yùn)算表達(dá)式前面介紹的各種運(yùn)算都是以字節(jié)作為最基本位進(jìn)行的。C語言中,提供了位運(yùn)算的功能,這使得C語言也能像匯編語言一樣用來編寫系統(tǒng)程序。C語言提供了6種位運(yùn)算符,可分為兩類:位邏輯運(yùn)算符和移位運(yùn)算符。位邏輯運(yùn)算符有4種,它們是:&按位與|按位或^按位異或~取反移位運(yùn)算符有2種,它們是:<<左移>>右移711.字節(jié)和位在計(jì)算機(jī)中內(nèi)存是以字節(jié)為單位的連續(xù)的存儲(chǔ)空間,每個(gè)內(nèi)存單元(字節(jié)byte)有一個(gè)唯一的編號,即地址。一個(gè)字節(jié)一般由8個(gè)二進(jìn)制位(bit)組成,其中最右邊的一位稱為“最低位”,最左邊的一位稱為“最高位”。每個(gè)二進(jìn)制位的值是0或1。2.數(shù)值的編碼表示在計(jì)算機(jī)內(nèi)表示數(shù)值的時(shí)候,以最高位為符號位,最高位為0表示數(shù)值為正,為1表示數(shù)值為負(fù)。表示數(shù)值的編碼一般由:原碼、反碼、補(bǔ)碼。(1)原碼用最高位為符號位來表示數(shù)值的符號:最高位為0表示正數(shù),最高位為1表示為負(fù)數(shù),其余各位代表數(shù)值本身的絕對值(二進(jìn)制)。72如:+11的原碼是:00001011-11的原碼是:10001011注意,0的原碼有兩種不同的表示,+0的原碼是00000000,-0的原碼是10000000。由于0的表示方法不唯一,不適合計(jì)算機(jī)的運(yùn)算,所以計(jì)算機(jī)內(nèi)部一般不使用原碼來表示數(shù)據(jù)。(2)反碼正數(shù)的反碼與原碼相同,如+11的反碼也是00001011;而負(fù)數(shù)的反碼是:原碼除符號位外(仍為1),各位取反。例如:-11的反碼是:11110100+0的反碼是:00000000-0的反碼是:11111111同樣,0的表示方法不唯一,所以計(jì)算機(jī)內(nèi)部一般也不用反碼來表示數(shù)據(jù)。73(3)補(bǔ)碼正數(shù)的補(bǔ)碼與原碼相同,如+11的補(bǔ)碼同樣是00001011,而負(fù)數(shù)的補(bǔ)碼是:除最高位仍為1外,原碼的其余各位求反,然后再加1。例如:-11的原碼是:10001011,求反(除最高位外)后,得11110100,再加1,結(jié)果是11110101。+0的補(bǔ)碼是:00000000-0的補(bǔ)碼是其反碼11111111加1,得100000000,最高位溢出,剩下00000000。所以,用補(bǔ)碼形式表示數(shù)值0時(shí),是唯一的,都是00000000。目前計(jì)算機(jī)通常都是以補(bǔ)碼形式存放數(shù)據(jù)。因?yàn)椴捎镁幋a形式不僅數(shù)值表示唯一,而且能將符號位與其他位進(jìn)行統(tǒng)一加以處理,為硬件實(shí)現(xiàn)提供方便。742.4.7逗號運(yùn)算符和逗號表達(dá)式在C語言中,逗號“

溫馨提示

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

評論

0/150

提交評論