![第2章 數(shù)據(jù)類型及運算_第1頁](http://file4.renrendoc.com/view/1beb401d4eb08f81271447adf9b62617/1beb401d4eb08f81271447adf9b626171.gif)
![第2章 數(shù)據(jù)類型及運算_第2頁](http://file4.renrendoc.com/view/1beb401d4eb08f81271447adf9b62617/1beb401d4eb08f81271447adf9b626172.gif)
![第2章 數(shù)據(jù)類型及運算_第3頁](http://file4.renrendoc.com/view/1beb401d4eb08f81271447adf9b62617/1beb401d4eb08f81271447adf9b626173.gif)
![第2章 數(shù)據(jù)類型及運算_第4頁](http://file4.renrendoc.com/view/1beb401d4eb08f81271447adf9b62617/1beb401d4eb08f81271447adf9b626174.gif)
![第2章 數(shù)據(jù)類型及運算_第5頁](http://file4.renrendoc.com/view/1beb401d4eb08f81271447adf9b62617/1beb401d4eb08f81271447adf9b626175.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第2章數(shù)據(jù)類型與運算問題原由用計算機解決問題既是直接的,也是精確的。然而,C語言是如何運用有限的存儲空間實現(xiàn)精確計算?具有哪些運算規(guī)則和實現(xiàn)技術?如何實現(xiàn)對硬件的操作?等等,這些都是本章所要討論的問題。
基本數(shù)據(jù)的存儲、常用運算符與表達式、數(shù)據(jù)類型轉換、位運算等。教學重點能力要求掌握:程序中各種運算關系和表達方式
了解:基本數(shù)據(jù)類型的存儲方式
熟悉:數(shù)據(jù)類型的轉換方法運和位運算的功能作用
本章介紹的知識內(nèi)容第2章數(shù)據(jù)類型與運算
§2.5
編譯預處理命令
§2.4
位運算
§2.3
基本運算
§2.2
常量與變量
§2.1
數(shù)據(jù)類型及其存儲
§2.6
算法案例程序設計§2.1數(shù)據(jù)類型及其存儲[實例2-1]計算并輸出兩個數(shù)的和
#include<stdio.h>voidmain(){inta=100000,b=200000;//定義兩個整型變量,并賦值printf(“a*b=%d\n”,a+b);//輸出兩個數(shù)的和}[運行程序]a+b=300000在高級程序設計語言中,數(shù)據(jù)類型是一個非常重要的概念,如果數(shù)據(jù)類型定義不當,會使程序產(chǎn)生錯誤結果。2.1.1數(shù)據(jù)類型的引出2.1.1
數(shù)據(jù)類型的引出[實例2-2]計算并輸出兩個數(shù)的乘積
#include<stdio.h>voidmain(){inta=100000,b=200000;//定義兩個整型變量,并賦值printf(“a*b=%d\n”,a*b);//輸出兩個數(shù)的乘積}[運行程序]a*b=-1478364802.1.1
數(shù)據(jù)類型的引出問題分析:兩個程序同樣的定義方法,為什么實例2-1的結果是正確的,而a*b出現(xiàn)負數(shù),即乘法的結果是錯誤的?因為
100000*200000的結果已超出了C語言所能表示的整數(shù)的范圍。對于實例2-2,我們可將變量a,b由整型改為實型。修改如下所示:
#include<stdio.h>voidmain(){floatta=100000,b=200000;
//定義兩個實型變量,并賦值printf(“a*b=%f\n”,a*b);//輸出兩個數(shù)的乘積}[運行程序]a*b=20000000000.000000
2.1.2
數(shù)據(jù)的存儲方式數(shù)據(jù)是程序處理的對象,也是程序設計所要描述的主要內(nèi)容,數(shù)據(jù)類型是指編譯系統(tǒng)對數(shù)據(jù)分配存儲單元的安排,并且不同的數(shù)據(jù)類型分配不同的存儲單元(長度)和存儲形式。數(shù)據(jù)類型是對數(shù)據(jù)進行存儲和操作、生成相應的程序代碼所必不可少的信息。C語言中基本數(shù)據(jù)類型有:
整型:int實型:float字符型:char
其它類型數(shù)據(jù)都是基于這3種基本類型的。不同類型的數(shù)據(jù)在內(nèi)存中占用的存儲單元長度是不同的。因此,不同類型的數(shù)據(jù)具有不同的存儲方式。
1、整數(shù)數(shù)據(jù)的存儲方式
計算機中所有的數(shù)據(jù)(數(shù)字數(shù)據(jù)和字符數(shù)據(jù))都是以二進制數(shù)進行存儲的。例如一個十進制整數(shù),先轉換為二進制形式,例如整數(shù)10,以二進制形式表示是1010,然后才能存放到存儲單元中。如果以字節(jié)(8位)為單位進行存儲,最大存儲容量為:11111111相當于十進制數(shù)的255,8位字節(jié)所表示的數(shù)值范圍如下圖所示:
2.1.2
數(shù)據(jù)的存儲方式
2、實型數(shù)據(jù)的存儲方式
對于一個整數(shù),位數(shù)越多,表示的數(shù)據(jù)量越大。而對于實數(shù),例如π的值為3.141596…,不是位數(shù)越多表示的數(shù)據(jù)量越大,而是位數(shù)越多,能表示得越精確。在計算機中一般以4個字節(jié)存儲一個浮點數(shù)。并分成兩個部分:一般用3個字節(jié)存放數(shù)值部分(包括數(shù)符),用1個字節(jié)存放指數(shù)部分(包括指數(shù)的符號)。
3、字符型數(shù)據(jù)的存儲方式計算機中的字符包括英文字母、數(shù)字字符和特殊字符。計算機并不是將字符本身存放到存儲單元中,而是按照ASCII將字符轉換為代碼存儲到相應的存儲單元中。例如,大寫字母A相應的ASCII代碼是65,而65用二進制表示為1000001,所以在存儲單元中的信息是010000001(第1位補0,以湊足8位)。
2.1.2
數(shù)據(jù)的存儲方式計算機中每一個存儲單元中存放數(shù)據(jù)的范圍都是有限的,而且為了處理數(shù)據(jù)的方便,不得不對數(shù)據(jù)進行限制和分類。C/C++語言的數(shù)據(jù)類型十分豐富,可分為基本數(shù)據(jù)類型和復合數(shù)據(jù)類型兩類,如下圖所示:2.1.3
數(shù)據(jù)的存儲類型1、整型數(shù)據(jù)
整型(int)數(shù)據(jù)用來聲明程序中的常量和變量的數(shù)據(jù)類型。下表給出了C語言中的整型數(shù)據(jù)類型,它是根據(jù)ANSI標準給定的類型。2.1.3
數(shù)據(jù)的存儲類型類型標識符數(shù)據(jù)類型類型長度數(shù)值范圍可用運算符
[signed]int有符號整型2/16-32768~32767
+,-,*,/,++,――,%unsigned[int]無符號整型2/160~65535[signed]short[int]短整型2/16-32768~32767Unsignedshort[int]無符號短整型2/160~65535[signed]long[int]長整型4/32-2147483648~2147483647Unsignedlong[int]無符號長整型4/320~4294967295
2、實型數(shù)據(jù)
實型也稱為浮點型,C語言中的浮點型分為單精度浮點型(float)和雙精度浮點型(double),主要用來表示含有小數(shù)點的小數(shù)(如0.618)或非常大的數(shù)(如3.14*1013)。C提供了三種浮點數(shù)據(jù)類型,如下表所示:2.1.3
數(shù)據(jù)的存儲類型類型標識符數(shù)據(jù)類型類型長度數(shù)值范圍有效位數(shù)可用運算符
float單精度型
4/32
±3.4(10-38~1038)7位數(shù)字+,-,*,/,++,――
double雙精度型
8/64±1.7(10-308~10308)15位數(shù)字
longdouble長雙精度型
16/128±1.2(10-4092~104092)19位數(shù)字
3、字符型數(shù)據(jù)
C語言中的char類型主要用來處理字符型數(shù)據(jù)。通常,一個字符數(shù)據(jù)占一個字節(jié)寬度的內(nèi)存存儲單元。并且在字符類型中,分為帶符號字符型和不帶符號字符型,如下表所示:2.1.3
數(shù)據(jù)的存儲類型類型標識符數(shù)據(jù)類型類型長度數(shù)值范圍
[unsigned]char無符號字符型1/80~255
[signed]char有符號字符型1/8-128~+127
[注意]不同的數(shù)據(jù)類型,在使用中有不同的規(guī)則,主要體現(xiàn)在以下幾個方面:
(1)
表中類型標識符一欄中方括號內(nèi)的內(nèi)容是可選的,例如[signed]int通常簡寫為int。
(2)不同的數(shù)據(jù)類型有不同的操作。例如整型數(shù)可以取余操作,實型數(shù)據(jù)卻不行;整型、實型數(shù)據(jù)可以進行加減運算,字符數(shù)據(jù)卻不行。
(3)不同的數(shù)據(jù)類型出現(xiàn)的運算錯誤不同,例如整形數(shù)的錯誤是溢出;浮點數(shù)的錯誤是有效數(shù)字位不夠而影響精度;如果類型定義錯誤(例如把實型定義為整型),將出現(xiàn)結果的完全錯誤。在進行程序設計時,要根據(jù)變量所描述的數(shù)據(jù)性質來確定數(shù)據(jù)類型,否則會得出錯誤結果。2.1.3
數(shù)據(jù)的存儲類型§2.2常量與變量1、整型常量
(1)整型常量即為可帶負號的整常數(shù),沒有小數(shù)部分。它可以用十進制、八進制和十六進制三種方法來表示。
(2)整型常量中的長整型用L作后綴,如87543L或87543l等。
(3)整型常量中的無符號型用U(或u)作后綴表示,例如6725U或6725u等。
(4)如果一個常量的后綴是U(u)和L(l),都表示為unsignedlong類型的常量,例如4933ul,37845LU,41156Lu等。
C語言中的數(shù)據(jù)對用戶呈現(xiàn)的形式有兩種:常量和變量。所謂常量,
是指在程序執(zhí)行期間其值不發(fā)生變化的量。2.2.1常量2.2.1常量
2、實型常量實型常量在C中又稱浮點型常量,它是由整數(shù)部分和小數(shù)部分(必須有小數(shù)點)組成的,并且只有十進制的表示方式。實型常量主要有兩種表示法,小數(shù)表示法和指數(shù)表示法。實型常量的缺省為double型,后綴用F(或f)表示單精度(float)類型,后綴用L(或l)表示長精度(longdouble)類型。
3、字符常量字符常量是用一對單引號括起的一個字符,例如‘A’,‘+’,‘’(空格)等都是字符常量。C語言中的字符常量用關鍵字char來定義。2.2.1常量
3、字符常量
除了以上形式的字符常量外,在C中還提供了一種特殊形式的字符常量,即以“\”開頭的字符系列,例如‘\n’代表一個換行符。下表列出了C語言中常用的這種特殊字符。形式ASCII值功能含義形式ASCII功能含義
\a0x07響鈴\?0x3F(63)問號“?”
\b0x08退格符,移到前一列\(zhòng)\x5C(92)反斜線“\”
\f0x0C(12)換頁符,移到下頁首\’0x27(39)單引號“’”
\n0x0A(10)換行符,移到下一行\(zhòng)"0x22(34)雙引號“””\r0x0D(13)回車符,移到本行\(zhòng)0
0字符串結束符\t0x09水平制表符,橫向\ddd8進制數(shù)字符\vx0B(11)垂直制表符,縱向\xhh16進制數(shù)字符2.2.1常量
4、字符串常量雙引號是字符串的定界符,字符串中可以包含空格符、轉義序列或其它字符,也可包含C字符集以外的字符,如漢字等,只要C編譯器支持漢字系統(tǒng)就可以。
[注意]字符常量與字符串常量之間的區(qū)別:
(1)
字符常量用單引號括起,而字符串常量用雙引號括起。
(2)字符常量是用一個字符型變量存放的,并且一個字符常量在內(nèi)存中僅占1個字節(jié);而字符串常量是用一個一維字符數(shù)組來存放的,并且要占多個字節(jié)。在C中,凡是字符串都有一個結束符,該結束符用‘\0’表示。
(3)字符常量與字符串常量所具有的操作功能不同。字符串常量有連接、拷貝等功能,字符常量具有加法和減法運算,而字符串常量不具有這種運算。
2.2.1常量5、符號常量
當在一個程序中多次用到一個常量時,可用一個與常量相關的標識符來替代,這種相關的標識符稱為符號常量。例如用PI來代表圓周率π(3.1415926)。在C語言中定義符號常量的方法有兩種:一種是使用關鍵字const來定義符號常量,另一種是使用宏定義命令來定義符號常量。
[注意]類型定義時千萬要注意常數(shù)大小與數(shù)據(jù)類型相一致:
(1)例如:constfloatPI=3.1415926;
(2)本例中盡管等號右邊的常數(shù)是double型(3.141593后面沒有長度說明則默認為double型),但因為符號常量的類型float只能存儲7位有效位精度的實數(shù),所以PI的實際值為3.141593(最后1位4舍5入)。如果將常量PI的類型改為double型,則能全部接受上述位數(shù)字。2.2.2變量變量是指在程序執(zhí)行期間其值發(fā)生變化的量。變量一旦被定義了類型后,便受到類型保護,確保對其值不進行非法操作。在C語言中的變量有三種類型:整型變量、實型變量和字符變量。這些變量都具有三個基本要素:名字、類型和值。
1、變量命名
(1)系統(tǒng)規(guī)定的保留字(即關鍵字)不可再作為變量名、函數(shù)名、類型名等其它名字使用。
(2)命名變量應盡量做到“見名知意”,這樣既有助于記憶,又增加了可讀性。
(3)變量名字一般常用小寫字母。
(4)變量名用多個字符構成,一般不要超過31個字符為宜。
(5)變量名中不能有空格,也不能包括除英文字符、數(shù)字和下畫線之外的其它特殊符號。2.2.2變量
(1)<類型標識符>:為該變量的數(shù)據(jù)類型及類型修飾符,如int,float,unsignedshort等。
(2)<變量名>:用戶定義的一般標識符,用來表示一個變量.
(3)<初值表達式>:C語言可用兩種方法給變量賦值,一是在定義變量之后用賦值符“=”給變量賦初值;另外還可以在定義變量時直接給變量賦初值,這種賦值也稱為變量初始化。
(4)省略號:表示在一條語句中可以定義多個變量,但各變量之間必須用逗號隔開。
2、變量定義定義變量是用一個說明語句進行的,其格式如下:<類型標識符><變量名>[=<初值表達式>],…,2.2.2變量
3、變量使用說明(1)在同一個程序塊內(nèi),不允許定義同名變量,但在不同的程序塊中,可定義同名變量。(2)將一個字符常量賦給一個字符變量并不是把該字符本身存放到內(nèi)存單元去,而是將該字符的ASCII代碼放到存儲單元中。
[注意]在C語言中有字符常量,卻沒有字符串變量。那么,用什么類型的變量來存放字符串呢?在后面的章節(jié)中,我們將會介紹用字符數(shù)組來存放字符串。2.2.2
變量#include<stdio.h>main(){inta=3;doubleb=1.456;charr=‘A’;printf(“%d\n”,a);printf(“%f\n”,b);printf(“%d%f\n”,a,b);printf(“a=%d,b=%f\n”,a,b);printf(“%d\n”,10);printf(“%c\n”,r);printf(“%c,%d,%c”,r,r,97);printf(“%d”,b);
}31.45600031.456000a=3,b=410AA,65,a-1477468750運行結果:程序中的運算是由運算符與表達式來實現(xiàn)的。C語言中的運算符很豐富,因此表達式的種類也很多。按照運算符在表達式中的作用,可以分為6大類:
算術運算符關系運算符賦值運算符邏輯運算符逗號運算符條件運算符相應地,表達式也有6種對應類型。正是這些豐富的運算符和表達式,保證了各種操作的方便實現(xiàn)。這里,我們僅分別介紹前3種運算符與表達式。
后3種運算符與表達式在第3章中結合程序的控制結構一起介紹?!?.3基本運算運算符由字符組成,用來連接常量、變量、函數(shù),以組成表達式?;具\算符指算術運算符、賦值運算符、逗號運算符。
1、算術運算符可分為雙目運算符和單目運算符兩種類型。
(1)
雙目運算符:使用兩個操作數(shù)的操作符稱為雙目運算符,包括:加(+)、減(-)、乘(*)、除(/)、求余(%)。雙目運算符運算符名稱運算實例運算功能+相加a+b求a與b的和-相減a-b求a與b的差*相乘a*b求a與b的積/相除a/b求a除以b的商%求余a%b求a除以b的余2.3.1基本運算符
[注意]C語言規(guī)定基礎算術運算符的優(yōu)先級同數(shù)學中的優(yōu)先級一樣,為先做*、/、%;后做+、—,而且前者優(yōu)先級高于后者,其中有些運算符在計算中需要注意以下幾個方面:①在5個基礎運算符中,除%運算符只用于int型運算外,其它4個運算符對int型、float型和double型變量都適用。②“/”對于整型數(shù)來說是除法取整操作,例如5/2的結果為2;而對于實數(shù)來說是通常意義的除法運算,例如5.0/2.0的結果是2.5。③“%”取余(也稱求模)只能對整型數(shù)進行操作,例如5%2的結果是1,4%2的結果是0。2.3.1基本運算符2.3.1基本運算符(2)單目運算符使用一個操作數(shù)的操作符稱為單目運算符,包括:+(取正)、-(取負)、++(自增)、--(自減)。其表達式與應用規(guī)則,如下表所示:單目運算符運算符名稱運算實例功能等價++自增++a或a++a=a+1--自減--a或b--a=a-1+取正+(a)+a-取負-(a)-a[實例2-6
]#include<stdio.h>voidmain(void){inta,b,k=10;a=k++,b=++k;printf(“k=%d,a=%d”,b=%d\n”,k,a,b);k=10,a=--k,b=k--;printf(“k=%d,a=%d”,b=%d\n”,k,a,b);}[運行程序]k=12,a=10,b=12k=8,a=9,b=92.3.1基本運算符2.3.1基本運算符j=3;k=++j;printf(“%d%d”,j,k);//k=4,j=4j=3;k=j++;printf(“%d%d”,j,k);//k=3,j=4j=3;printf(“%d”,++j);j=3;printf(“%d”,j++);a=3;b=5;c=(++a)*b;printf(“%d%d”,j,k);//c=20,a=4a=3;b=5;c=(a++)*b;printf(“%d%d”,j,k);//c=15,a=4
[問題點撥
]自增運算符(++)和自減運算符(--)是C/C++語言中特有的運算符,能使程序變得更為簡潔。在使用時要特別以下幾點:
(1)自增運算符和自減運算符只能用于變量,不能用于常量或表達式,例如7++或(a+b)++都是不合法的。因為7是常量,常量的值不能改變,而(a+b)++是無法確認和實現(xiàn)的。
(2)++和--的結合方向是“自右至左”,而運算符的結合方向是“自左至右”。如果表達式為-i++,那么,i的左邊是負號運算符,右邊是自加運算符。如果i的原值等于3,若按左結合規(guī)則,則相當于(-i)++,而(-i)++是不合法的,因為對表達式不能進行自加自減運算。2.3.1基本運算符2.3.1基本運算符
2、賦值運算符C語言的賦值運算符共有11種,可分為簡單的賦值運算符、算術賦值運算符和位賦值運算符
⑴簡單賦值運算符:就是用“=”來表示賦值運算。它的作用是將“=”右邊的數(shù)據(jù)賦值給“=”左邊變量。
⑵算術賦值運算符:是在簡單賦值運算符的基礎上擴充的賦值運算符。運算符運算符名稱運算符類型運算實例功能等價+=加賦值雙目運算a+=ba=a+b-=減賦值雙目運算a-=ba=a-b*=乘賦值雙目運算a*=ba=a*b/=除賦值雙目運算a/=ba=a/b%=求余賦值雙目運算a%=ba=a%b2.3.1基本運算符
3、逗號運算符逗號運算符是C/C++中一個比較特殊的運算符。使用逗號運算符“,”可以將多個表達式組成為一個表達式。逗號運算符的優(yōu)先級是所有運算符中最低的。例如:
d1,d2,d3,d4
這便是一個逗號表達式,其中d1,d2,d3和d4各為一個表達式。
整個逗號表達式的值和類型由最后一個表達式?jīng)Q定。計算一個逗號表達式的值時,從左至右依次計算各個表達式的值,最后計算的一個表達式的值和類型便是整個逗號表達式的值和類型。2.3.2運算符的優(yōu)先級與結合性一般而言,單目運算符優(yōu)先級較高,賦值運算符優(yōu)先級低;算術運算符優(yōu)先級較高,關系和邏輯運算符優(yōu)先級較低。多數(shù)運算符具有左結合性,單目運算符、三目運算符、賦值運算符具有右結合性。2.3.3基本表達式
1、算術表達式由算術運算符和括號將運算對象連接起來的式子稱為算術表達式,算術表達式的值是一個數(shù)值,運算對象包括常量、變量和函數(shù)等。
2、賦值表達式由賦值運算符將一個變量和一個表達式連接起來的式子稱為“賦值表達式”,它的一般形式為:變量=表達式。
表達式是由運算符和操作數(shù)通過運算符連接而形成的一個有意義的算式,操作數(shù)包含了常量、變量、函數(shù)和其它一些命名的標識符。表達式的類型由運算符的種類和操作數(shù)的類型來決定,多種類型的表達式表現(xiàn)了C語言對數(shù)值運算和非數(shù)值運算的強大的功能。2.3.3基本表達式
3、逗號表達式由逗號運算符將兩個表達式連接起來稱為逗號表達式。
<表達式l>,<表達式2>【格式說明】
逗號表達式的值的求解過程是:先求解<表達式1>,再求解<表達式2>,整個逗號表達式的值為<表達式2>的值。例如,x=2*8,x*10,則x的值為16,整個逗號表達式的值為160。又例如,z=(x=10,10+20);則x的值為10,z的值為30。2.3.4表達式中的類型轉換
1、自動類型轉換自動數(shù)據(jù)類型轉換也稱隱含類型轉換。在表達式中把一個值賦給與其不同類型的變量或函數(shù)的實參與形參類型不一致時操作系統(tǒng)會實行自動類型轉換。轉換規(guī)則如下:⑴將表達式中的char或short全部自動轉換為相應的int型:將float轉換為double型,如圖2-4(a)所示。⑵當一個運算符兩端的運算量類型不一致時,按“向高看齊”的原則,對“較低”的類型進行提升。如圖2-4(b)所示。⑶一般的算術轉換是在表達式的運算過程中自動進行的,如圖2-4(c)所示。2.3.4表達式中的類型轉換
注意:int型最低,double型最高。short型char型自動轉換成int型,float型自動轉換成double型,這種隱含的類型轉換是一種保值映射,即在轉換中數(shù)據(jù)的精度不受損失。chardouble←longfloat→double高Short↑↑unsignedcharlonglongunsignedshort↑↑floatdoubleunsignedunsignlong↑↑unsignedlongint←char,shortcharshort→int低
(a)(b)(c)圖2-4自動數(shù)據(jù)類型轉換floatint規(guī)則:對于數(shù)值類型,A的取值范圍完全包含在B內(nèi)AB隱含類型轉換:自動類型轉換2.3.4表達式中的類型轉換
2、強制類型轉換強制數(shù)據(jù)類型轉換又稱為顯式轉換。它是將某種類型強制性地轉換為指定的類型,并且分為顯式強制轉換和隱式強制轉換兩種。
(1)
顯式強制轉換:它是通過強制轉換運算符來實現(xiàn)的,其格式有如下兩種形式:【格式說明】將<表達式>的類型強制轉換成<類型說明符>所指定的類型。需要注意的是:
(a)這是一種不安全的轉換。因為強制轉換可能會出現(xiàn)將高類型轉換為低類型的情況,這時數(shù)據(jù)精度要受到損失。因此,這是不安全的轉換。
2.3.4表達式中的類型轉換或<類型標識符>(<表達式>)(<類型標識符>)<表達式>【格式說明】將<表達式>的類型強制轉換成<類型說明符>所指定的類型。需要注意的是:
(b)
這種轉換暫時性的,是“一次性”的。例如:inta(3),m;doubleb;b=3.56+double(a);m=a+5;在b=3.56+double(a)表達式中,是通過顯式強制轉換a為double型的,而在其后的表達式m=a+5中的a仍然為int型的??梢姡@式強制轉換僅在強制轉換運算符作用在表達式上時,該表達式被強制轉換為指定類型,而不被強制轉換時,表達式仍是原來類型。2.3.4表達式中的類型轉換2.3.4表達式中的類型轉換
(2)隱式強制轉換
(a)在賦值表達式中,當左值(賦值運算符左邊的值)和右值(賦值運算符右邊的值)類型不同時,一律將右值類型強制轉換為左值的類型。
(b)
函數(shù)有返回值的調(diào)用中,總是將return后面的表達式的類型強制轉換為該函數(shù)的類型(當兩者類型不一致時)?!緦嵗?-7】求余運算“x%3”,其中“x”為float型,在程序中怎樣實現(xiàn)這個求余運算。[問題分析]由于求余運算“x%3”要求于兩側均為整型量,而x為float型,顯然是不合法的。但由于強制類型轉運算的優(yōu)先級高于%,因此可以先進行(int)x的運算,得到一個整型值,然后再對3求余。
[程序實現(xiàn)]#include<stdio.h>voidmain(void){doublex,inti;x=3.6;i=(int)x;printf(“x=%f”,i=%d\n”,x,i);}2.3.4表達式中的類型轉換[問題點撥]
在程序設計中,有時運算表達式必須借助強制類型轉換,否則,不能實現(xiàn)運算目的。此外,在函數(shù)調(diào)用時,有時為了使實參類型與形參類型一致,可以用強制類型轉換運算符得到一個所需要類型的參數(shù)。位運算對字節(jié)或字節(jié)內(nèi)部的二進制進行測試、設置、移位或邏輯運算。位運算是通過位操作符來實現(xiàn)的,位操作符是用來進行二進制位運算的運算符。C語言提供了6種位運算操作符,其優(yōu)先級、結合方向、要求參加運算對象的個數(shù)及其作用如下表所示?!?.4位運算2.4.1位運算的特點運算符優(yōu)先級作用要求運算符的個數(shù)結合方向~高低按位取反單目從右到左<<、>>左移、右移雙目從左到右&按位與雙目從左到右∧按位異或雙目從左到右∣按位或雙目從左到右位運算的運算量只能是整型或字符型的數(shù)據(jù),不能為實型數(shù)據(jù)。C語言提供了兩類位運算,一類是邏輯位運算,另一類是移位運算。2.4.2邏輯運算符
1、“按位與”運算“按位與”運算是將兩個二進制位的操作數(shù)從低位(最右位)到高位依次對齊后進行與運算。其運算規(guī)則是:
1&1=1;1&0=0;0&1=0;0&0=0
邏輯位運算分為:“按位與”、“按位或”、“按位異或”和“按位反”等4種運算形式。邏輯位運算的運算對象只能是整形或字符型數(shù)據(jù),不能為實型數(shù)據(jù)。2.4.2邏輯運算符
2、“按位或”運算“按位或”運算是將兩個二進制位的操作數(shù)從低位(最右位)到高位依次對齊后進行與運算。其運算規(guī)則是:
1|0=1;0|1=1;1|1=1;0|0=0
2.4.2邏輯運算符
3、“按位異或”運算“按位異或”運算是將兩個二進制位的操作數(shù)從低位(最右位)到高位依次對齊后進行異或運算。其運算規(guī)則是:
0∧0=0;1∧1=0;0∧1=1;1∧0=12.4.2邏輯運算符
4、“按位取反”運算“按位取反”運算用來對一個二進制數(shù)按位取反,即將0變1,1變0。2.4.3移位運算
1、“左移”運算左移運算用來將一個數(shù)的各二進位全部向左移若干位,將左邊移出的的高位舍棄,右邊空出的位補0。A的值a的二進制形式A<<1A<<2640100000001000000001000000001270111111101111111001111111002.4.3移位運算
2、“右移”運算右移運算用來將一個數(shù)的各二進位全部向右移若干位,將右邊移出的的低位舍棄,左邊高位空出的位要根據(jù)符號位的情況進行補充,對無符號數(shù)補0;對有符號數(shù),若為正數(shù)則補0,若為負數(shù)則補1a:1001011111101101a>>1:0100101111110110(邏輯右移時)a>>1:1100101111110110(算術右移時)2.4.3移位運算
3、位運算賦值運算符同算術運算符與賦值運算符在一起可以組成復合賦值運算符一樣,位運算符與賦值運算符可以組成5種復合賦值運算符,并由這些位運算賦值運算符可以構成位運算賦值表達式,如表所示:運算符運算符名稱運算性質結合方向運算例子功能等價&=位與賦值雙目運算從左到右A&=b
a=a&b∣=位或賦值雙目運算從左到右a∣=b
a=a∣b∧=(XOR)位異或賦值雙目運算從左到右a∧=b
a=a∧b~=位反賦值單目運算從右到左a~=b
a=a~b<<=左移位賦值雙目運算從左到右a<<=b
a=a<<b>>=右移位賦值雙目運算從左到右a>>=b
a=a>>b所謂“編譯預處理”,就是在C/C++語言編譯程序對C/C++源程序進行編譯前,由編譯預處理程序對這些編譯預處理命令進行處理的過程。C/C++提供了三種類型的預處理命令:宏定義命令、文件包含命令和條件編譯命令。為了與一般C/C++語句相區(qū)別,這些命令均以符號“#”開頭。因此,在C/C++程序中凡是以“#”開頭的行都為“編譯預處理”命令行,凡是以“#”開頭的命令都是預處理命令
宏定義命令是用來將一個標識符定義為一個字符串,該標識符被稱為宏名,被定義的字符串稱為替換文本。宏定義命令有兩種格式:一種是不帶參數(shù)的宏定義(也稱簡單宏定義),另一種是帶參數(shù)的宏定義?!?.5編譯預處理命令2.5.1宏定義命令
1、不帶參數(shù)的宏定義不帶參數(shù)的宏定義是用一個指定的標識符(宏名)來代表一個字符串,它的一般格式為:或#define<宏名><字符串>#define<宏名>【格式說明】define是系統(tǒng)關鍵字,<宏名>是一個標識符,<字符串>是任意的字符序列?!咀⒁狻渴褂煤甓x命令定義符號常量時,盡管它具有常量的屬型,但在編譯預處理完成后已不是一個具有一定類型的常量名(此時PI被字串3.1415926所替代)。因此,在隨后的編譯中再無法發(fā)現(xiàn)由它引起的數(shù)據(jù)類型誤用的錯誤。2.5.1宏定義命令#definePI3.14#include<stdio.h>main(){floatr=1.0;floatarea=PI*r*r;printf("Theareaofthecircleis%f",area);return0;}2.5.1宏定義命令
2、帶參數(shù)的宏定義宏定義不僅可以定義簡單的宏名來表示字符串,而且還可以定義類似函數(shù)的帶參數(shù)宏名和字符串(即宏體)進行參數(shù)置換?!靖袷秸f明】
<宏名>是一個標識符;<參數(shù)表>中可以有一個參數(shù),也可以有多個參數(shù),多個參數(shù)用逗號分隔;<宏體>是被替換用的字符序列。在替換時,<宏體>中與參數(shù)表中相同的標識符的字符序列被程序中所引用這個宏定義時所提供的與該標識符所對應的字符序列所替換。#define<宏名>(<參數(shù)表>)(<宏體>)2.5.2文件包含命令所謂“文件包含”,是指一個源文件可以將另一個源文件的全部內(nèi)容包含進來?!靖袷秸f明】include是關鍵字,<filename>為要包含的文件名稱,也稱為頭文件,表示預處理到系統(tǒng)規(guī)定的路徑中去獲得這個文件(即C編譯系統(tǒng)所提供的并存放在指定的子目錄下的頭文件)。找到文件后,用文件內(nèi)容替換該語句。
或#include<filename>#include“filename”2.5.3條件編譯命令條件編譯命令是用來定義某些編譯內(nèi)容要在滿足一定條件下才參與編譯的,否則將不參與編譯。常用的條件編譯命令有如下3種格式:或#ifdef<標識符><程序段1>#else<程序段2>#endif#ifdef<標識符><程序段1>#endif1.格式一【格式說明】其中:ifdef,else和endif都是關鍵字。<程序段1>和<程序段2>是由若干條預處理命令和語句組成的。2.5.3條件編譯命令2.格式二【格式說明】
其中:ifndef,else和endif都是關鍵字,其余同格式一。當<標識符>未被定義時,則<程序段1>參與編譯,否則<程序段2>參與編譯。在省略#else時則無<程序段2>,當<標識符>已被定義時,便去執(zhí)行#endif后面的程序。
或#ifndef<標識符><程序段1>#else<程序段2>#endif#ifndef<標識符><程序段1>#endif3.格式三【格式說明】
其中:ifndef,else和endif都是關鍵字,其余同格式一。
#if<常量表達式1><程序段1>#elif<常量表達式2><程序段2>#elif<常量表達式3><程序段3>#else<程序段n+1>#endif2.5.3條件編譯命令1、案例描述
根據(jù)公式:sum=money*((1+rate),year)計算存款到期時的本息合計sum(稅前),輸出時保留兩位小數(shù)。2.案例分析設三個變量,存款金額money和存期year為整型變量,年利率rate為浮點型變量rate。輸入:從鍵盤輸入存款金額money、存期year、年利率rate。輸出:本息合計sum(保留兩位小數(shù))。3.算法描述sum=money*((1+rate),year)§2.6算法案例程序設計2.6.1計算銀行存款的本息2.6.1計算銀行存款的本息#include<stdlib.h>#include<math.h>intmain(){intmoney,year;doublerate,sum;printf(“Pleaseinputmoney:”);scanf(“%d”,&money);printf(“Pleaseinputyear:”);scanf(“%d”,&year);printf(“Enterrate:”);scanf(“%1f”,&rate);sum=money*pow((1+rate),year);printf(“sum=%.2f\n”,sum);}4、程序實現(xiàn)[運行結果]Pleaseinputmoney:5000↙Pleaseinputyear:3↙Pleaseinputrate:0.03↙Sum=5463,641、案例描述對于年、月、日的描述,不同國家有不同的描述方式。英國式的寫法(日/月/年)和美國式的寫法(月/日/年)。輸入:從鍵盤輸入正確的年、月、日輸出:中、英、美式的日期寫法。
2.案例分析設year表示年,month表示月,day表示天,類型均為整型。
3.算法描述
(1)輸入年、月、日給變量year、month、day;
(2)輸出中國式的日期寫法;
(3)輸出英國式的日期寫法;
(4)輸出美國式的日期寫法。2.6.2日期寫法#include<stdlib.h>main(){intday,month,year;printf(“year,month,day=\n”);scanf(“%d%d%d”,&year,&month,&day);printf(“DateinPRCformis%d%d%d\n”,year,
month,day);printf(“DateinUKformis%d%d%d\”,day,month,year);printf(“DateinUSAformis%d%d%d\n”,month,day,year):system(“pause”);}4、程序實現(xiàn)2.6.2日期寫法
1、案例描述編寫一個C語言程序,能隨機產(chǎn)生一個四位整數(shù),同時給出各位數(shù)字和。2.案例分析
⑴用庫函數(shù)中的隨機函數(shù)rand()產(chǎn)生一個隨機的整數(shù):rand()是一個返回隨機整數(shù)的函數(shù),它能夠生成在0到RAND_MAX之間的任意整數(shù),而且每個整數(shù)出現(xiàn)的幾率均等。需要注意的是,這個函數(shù)和RAND_MAX均定義在stdlib.h這個庫中,所以要使用隨機數(shù)必須要包含這個庫。如何生成在a到b中的任意整數(shù)呢?這里提供兩種辦法:
①a+rand()%(b-a);②a+rand()/RAND_MAX*(b-a)。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 范本指南留置擔保合同
- 個人服務合同
- 房地產(chǎn)銷售合作合同協(xié)議書范本
- 美容師實習生聘用合同
- 紗線采購合同模板
- 個人過橋資金借款合同
- 工程施工合同協(xié)議書范文
- 暖通工程承包合同
- 環(huán)境衛(wèi)生承包合同范本
- 長期供貨合同范本
- 2024-2025學年北京市豐臺區(qū)高三語文上學期期末試卷及答案解析
- 公路電子收費系統(tǒng)安裝合同范本
- 2021年全國高考物理真題試卷及解析(全國已卷)
- 綜合實踐項目 制作水族箱飼養(yǎng)淡水魚 教學設計-2024-2025學年魯科版生物六年級上冊
- 建設用地土壤污染風險評估技術導則(HJ 25.3-2019代替HJ 25.3-2014)
- JJG 692-2010無創(chuàng)自動測量血壓計
- 徐州市2023-2024學年八年級上學期期末地理試卷(含答案解析)
- 飲料對人體的危害1
- 數(shù)字經(jīng)濟學導論-全套課件
- 中考記敘文閱讀
- 產(chǎn)科溝通模板
評論
0/150
提交評論