




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第2章 C語言程序的 基本數(shù)據(jù)類型及其運(yùn)算,申閆春 北京信息科技大學(xué) 2008年2月,2.1 C語言的數(shù)據(jù)類型,2.1.1 數(shù)據(jù)類型的一般概念 1、什么是數(shù)據(jù)類型? 數(shù)據(jù)結(jié)構(gòu) + 算法 = 程序 C語言中以“數(shù)據(jù)類型”形式存在。 根據(jù)用途不同,把數(shù)據(jù)分類為可計(jì)算的數(shù)值型、可打印、顯示的字符型等數(shù)據(jù)類型。例:定義5是整型數(shù),可以數(shù)值計(jì)算;若定義5為字符型,不能進(jìn)行數(shù)值計(jì)算,只能進(jìn)行字符顯示、打印。,2、C語言的數(shù)據(jù)類型?,主要有整型、字符型、實(shí)型(浮點(diǎn)型)、枚舉類型、數(shù)組類型、結(jié)構(gòu)體類型、共用體類型、指針類型、空類型。 在程序中對(duì)用到的所有數(shù)據(jù)都必須指定其數(shù)據(jù)類型。 不同類型的數(shù)據(jù),所占內(nèi)存的字
2、節(jié)數(shù)不同, 對(duì)應(yīng)的操作也不相同。 數(shù)據(jù)類型決定: 1、數(shù)據(jù)占內(nèi)存字節(jié)數(shù)。 2、數(shù)據(jù)取值范圍。 3、可以進(jìn)行的操作。,2.1.2 常量,1、概念:在程序運(yùn)行過程中,其值不發(fā)生變化的數(shù)據(jù),不能被改變的數(shù)據(jù)。 2、分類: 直接常量:12 -44.6 a Hello! /字符串常量 符號(hào)常量:用一個(gè)標(biāo)識(shí)符代表一個(gè)常量。 3、符號(hào)常量定義:格式:#define 常量名 直接常量 舉例:#define PRICE 100 /習(xí)慣上常量名用大寫,變量名用小寫。 #define PI 3.14 #define C1 a /符號(hào)常量的定義放在函數(shù)外面。 4、意義:(1)含義清楚。不存在二義性。 (2)在需要改變
3、一個(gè)常量時(shí),能夠做到“一改全改”。,舉例:求某商品總價(jià)。,#include #define PRICE 100 /定義符號(hào)常量 void main() int sum; sum = PRICE * 20; printf(“ %d n, sum); PRICE:?jiǎn)蝺r(jià)符號(hào)常量 20: 數(shù)量直接常量,舉例:求圓柱體的體積,#include stdio.h #define PI 3.1415926 /符號(hào)常量 main() float r,h,v; scanf(%f %f, ,常量分類,整型常量,例:5,67,100。 實(shí)型常量,例:3.14, -6.7。 字符型常量,例:a, D。 轉(zhuǎn)義字符:不能直
4、接寫出的字符。 例:n 回車換行, 單引號(hào),”雙引號(hào) 字符串常量,例:”hello”,”82427141”。 符號(hào)常量,用符號(hào)命名常量。 例:#define PRICE 100 #define PI 3.1415926,2.2 數(shù)據(jù)類型及變量,2.2.1 基本數(shù)據(jù)類型 (1) 從長(zhǎng)度上分,有8位、16位、32位和64位。 (2) 從數(shù)據(jù)的符號(hào)來分,有無符號(hào)數(shù)和有符號(hào)數(shù)。 (3) 按照數(shù)據(jù)的數(shù)學(xué)性質(zhì),分為整型、實(shí)型和字符型。 數(shù)值型數(shù)據(jù)的類型及表示形式,見表2-3(p15)。,類型標(biāo)識(shí)符 名 字 取值范圍 char字符型ASCII字符代碼 unsigned char無符號(hào)字符型 0 255 si
5、gned char有符號(hào)字符型-27 27-1 int整型-215 215-1 unsigned int無符號(hào)整型 0 216-1 singned int有符號(hào)整型 同 int float浮點(diǎn)10-38 1038 double雙精度型10-308 10308 void 空值型 無值,2.2.2 變量及變量的定義,1、概念:在程序運(yùn)行過程中,其值可以改變的數(shù)據(jù),在內(nèi)存單元申請(qǐng)一個(gè)空間,可以存放常量數(shù)據(jù)。 2、要素:(1)變量名。每個(gè)變量都必須有一個(gè)名字變量名,變量命名遵循標(biāo)識(shí)符命名規(guī)則。代表內(nèi)存中的一個(gè)存儲(chǔ)單元。 (2)變量值。在程序運(yùn)行過程中,變量值存儲(chǔ)在內(nèi)存中。在程序中,通過變量名來引用變量
6、的值。,3、標(biāo)識(shí)符(identifier),(1) 標(biāo)識(shí)符就是一個(gè)名字(如常量名、變量名、函數(shù)名)。有規(guī)定的命名規(guī)則。 (2) 組成:只能由字母、數(shù)字、下劃線組成。且第一個(gè)字符必須為字母或下劃線。 (3) 長(zhǎng)度:標(biāo)識(shí)符的有效長(zhǎng)度隨系統(tǒng)而異,如果超長(zhǎng),則超長(zhǎng)部分被舍棄。VC+6.0中規(guī)定最大長(zhǎng)度為247個(gè)字符。 (4) 標(biāo)識(shí)符命名的良好習(xí)慣見名知意。 例如:name(姓名)、age(年齡)。,4、變量定義,數(shù)據(jù)類型 變量名,變量名2; int a1,a2; float x1,x2; double y1,y2; char c1,c2; 習(xí)慣上,變量名用小寫字母。 常量名用大寫字母。,例如: #in
7、clude void main() float m; m = 1.11; m = 2 * m; m = m+2.2; printf(”%f”,m); char c1,c2; / 定義字符型變量 int x,y,z; / 定義整型變量 double volume; / 定義雙精度型變量 float sum,average; / 定義實(shí)型變量 unsigned long distance;/定義無符號(hào)長(zhǎng)整型變量,2.2.3 變量的初始化,變量初始化:給變量賦初值的的語句,稱為變量初始化。 要求對(duì)所有用到的變量,必須先定義、后使用。 變量賦初值有兩種方式: 1、在定義變量的同時(shí)賦初值(也叫變量初始化
8、)。 (出現(xiàn)在函數(shù)體的聲明部分) 格式:數(shù)據(jù)類型 變量名=初值,變量名2=初值2; 2、通過一個(gè)賦值語句給變量賦初值。 (出現(xiàn)在函數(shù)體的執(zhí)行部分) 格式:變量名 = 初值; 兩種方式的效果是等價(jià)的。 例如:int a,b=3; int a, b; b=3; 注意:沒有賦初值的變量并不意味著該變量中沒有數(shù)值,而只表明該變量中尚未存放特定值。,關(guān)于變量的幾點(diǎn)說明,1、程序中用到的變量必須“先定義(declare),后使用”。 2、C語言的關(guān)鍵字不能用作變量名。 3、C語言對(duì)英文字母的大小寫敏感,即同一字母的大小寫,被認(rèn)為是兩個(gè)不同的字符。 4、定義變量時(shí),給幾個(gè)變量賦相同的初值, 應(yīng)寫成 : in
9、t a=3,b=3,c=3; 不能寫成: int a=b=c=3; 5、給變量賦值時(shí),正常情況下應(yīng)給變量賦相同類型的數(shù)據(jù)。若給變量賦與其類型不同的數(shù)據(jù)時(shí),需進(jìn)行類型轉(zhuǎn)換(后面介紹賦值語句時(shí)詳細(xì)介紹)。,32個(gè)關(guān)鍵字:(由系統(tǒng)定義,不能再定義) 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 unsigned union
10、void volatile while,變量舉例,double p=15.5,d=0.1; float x,y,z=4.53; short int i=j=k=555; char c=a; 下面程序中有幾處錯(cuò)誤? include void main() int student, age; int if = adrress = 1; float score = 90; stadent = 2; /undeclared identifier Age = 20.7; /undeclared identifier printf(%d %d %d %f,if,student,age,score); ,錯(cuò)
11、誤: 1、if:為關(guān)鍵詞。 2、int if=address=1; 應(yīng)分別賦初值。 3、stadent:未定義的標(biāo)識(shí)符,拼寫錯(cuò)誤。 4、Age:未定義的標(biāo)識(shí)符,大小寫敏感。 對(duì)score和age賦值時(shí)會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)化。 90轉(zhuǎn)化為90.0; 20.7轉(zhuǎn)化為20。 類型轉(zhuǎn)換在賦初值和不同類型數(shù)據(jù)進(jìn)行混合運(yùn)算時(shí)都會(huì)遇到。有規(guī)定的轉(zhuǎn)換規(guī)則。,2.2.4 數(shù)據(jù)類型轉(zhuǎn)換,在語言中,整型、實(shí)型和字符型數(shù)據(jù)之間可以進(jìn)行混合運(yùn)算(因?yàn)樽址麛?shù)據(jù)與整型數(shù)據(jù)可以通用)。 如果一個(gè)運(yùn)算符兩側(cè)的操作數(shù)的數(shù)據(jù)類型不同,則系統(tǒng)按“先轉(zhuǎn)換、后運(yùn)算”的原則,首先將數(shù)據(jù)自動(dòng)轉(zhuǎn)換成同一類型,然后在同一類型數(shù)據(jù)間進(jìn)行運(yùn)算。 當(dāng)要對(duì)
12、不同類型的數(shù)據(jù)進(jìn)行操作時(shí),應(yīng)首先將其轉(zhuǎn)換成相同的數(shù)據(jù)類型,然后進(jìn)行操作。 有兩種轉(zhuǎn)換方式: 1、隱式類型轉(zhuǎn)換(自動(dòng)轉(zhuǎn)換,先轉(zhuǎn)換、后運(yùn)算) 2、顯式類型轉(zhuǎn)換,1、隱式類型轉(zhuǎn)換(自動(dòng)轉(zhuǎn)換,先轉(zhuǎn)換、后運(yùn)算) 所謂隱式類型轉(zhuǎn)換就是在編譯時(shí)由編譯程序按照一定規(guī)則自動(dòng)完成。 轉(zhuǎn)換發(fā)生條件: 運(yùn)算轉(zhuǎn)換不同類型數(shù)據(jù)混合運(yùn)算時(shí)。 賦值轉(zhuǎn)換把一個(gè)值賦給與其類型不同的變量時(shí)。 輸出轉(zhuǎn)換輸出時(shí)轉(zhuǎn)換成指定的輸出格式。 函數(shù)調(diào)用轉(zhuǎn)換實(shí)參與形參類型不一致時(shí)轉(zhuǎn)換。,轉(zhuǎn)換規(guī)則:,1、縱向向上的箭頭表示不同類型的 轉(zhuǎn)換方向(由低類型轉(zhuǎn)化為高類 型),不表示轉(zhuǎn)換所經(jīng)的步驟。 2、橫向向左的箭頭表示必須的轉(zhuǎn)換。,int i; flo
13、at f; double d; long e; i=2; f=2.5; d=3.9; e=3; ,10+a+i*f-d/e,int,double,double,double,double,思考:根據(jù)已知變量定義及賦值語句,計(jì)算以下表達(dá)式的值,并說明每一步所得結(jié)果的數(shù)據(jù)類型。,2、顯式類型轉(zhuǎn)換(強(qiáng)制轉(zhuǎn)換) 一般形式: (要轉(zhuǎn)換成的數(shù)據(jù)類型)(被轉(zhuǎn)換的表達(dá)式) 舉例:int i; i = i + (int)9.801 float x,y; x=2.3 ; y=4.5; (int)(x+y) / 6 (int) (int)x+y / 6.5 (double),說明:強(qiáng)制轉(zhuǎn)換得到的是所需類型的中間變量
14、,原變量或表達(dá)式的類型不變。ssssssssssss 例如,(double)a 只是將變量a的值轉(zhuǎn)換成一個(gè)double型的中間量,a的數(shù)據(jù)類型并未轉(zhuǎn)換成double型。 當(dāng)被轉(zhuǎn)換的表達(dá)式是一個(gè)簡(jiǎn)單表達(dá)式時(shí),外面的一對(duì)圓括號(hào)可以缺省。 例如: (double)a 等價(jià)于(double)(a) /*將變量a的值轉(zhuǎn)換成double型*/ (int)(x + y) /*將x+y的結(jié)果轉(zhuǎn)換成int型*/ (float)5 / 2等價(jià)于(float)(5)/2 /*將5轉(zhuǎn)換成實(shí)型,再除以2(=2.5)*/ (float)(5 / 2) /*將5整除2的結(jié)果(2)轉(zhuǎn)換成實(shí)型(2.0)*/,#include
15、void main() float x; int i; x=3.6; i=(int)x; printf(x=%f,i=%d,x,i); ,思考:以下程序的輸出結(jié)果是什么?,x=3.600000,i=3,程序運(yùn)行結(jié)果:,結(jié)論:較高類型向較低類型轉(zhuǎn)換時(shí)可能發(fā)生精度損失問題,例:已知三角形的邊長(zhǎng)a、b、c,求三角形周長(zhǎng)的一半。,#include void main() float a,b,c,s; a=3;b=4;c=5; s=1/2 * (a+b+c); printf(s=%8.2f,s); ,s= 0.00,程序運(yùn)行結(jié)果:,?,s= 6.00,程序運(yùn)行結(jié)果:,改為:1.0/2 (1/2.0) 或
16、 (float)1/2 (1/(float)2),在求三角形面積時(shí)會(huì)用到周長(zhǎng)的一半。 改為:1.0/2 1/2.0 1.0/2.0 或 (float)1/2 1/(float)2) (float)1/(float)2,2.3 運(yùn)算符和表達(dá)式,1、表達(dá)式:由操作符和操作數(shù)連接起來的、符合C語法規(guī)則的式子。例:a-b、c=9.8。 賦值表達(dá)式:進(jìn)行賦值操作,如:變量初始化。 算術(shù)表達(dá)式:一般計(jì)算,如加、減、乘、除等。 關(guān)系表達(dá)式:進(jìn)行比較判斷。 邏輯表達(dá)式:進(jìn)行邏輯比較判斷。 條件表達(dá)式:進(jìn)行條件滿足與否的判斷。 逗號(hào)表達(dá)式:實(shí)際上是一種復(fù)雜運(yùn)算,可以 包含多個(gè)算術(shù)表達(dá)式。,2.3.1 運(yùn)算符和表
17、達(dá)式概述,2、C語言的操作符 (1)算術(shù)運(yùn)算符 + - * / % (2)關(guān)系運(yùn)算符 = | 它相當(dāng)于: a=a+(m-n); int t=5; t+=t-=t*t; ? -15,-40,賦值運(yùn)算符包含: 簡(jiǎn)單賦值運(yùn)算符:= 復(fù)合賦值運(yùn)算符:+=, -=,*=,/=,%=, 簡(jiǎn)單賦值運(yùn)算符的一般形式為: 變量 = 表達(dá)式; 它的作用是將一個(gè)表達(dá)式的值賦給一個(gè)變量。 復(fù)合賦值運(yùn)算的一般格式為: 變量 雙目運(yùn)算符 = 表達(dá)式; 復(fù)合賦值運(yùn)算符 它等價(jià)于:變量 = 變量 雙目運(yùn)算符 (表達(dá)式)。 只有當(dāng)表達(dá)式簡(jiǎn)化為一個(gè)變量或一個(gè)常數(shù)時(shí),兩邊的括號(hào)可以省略。,1、賦值運(yùn)算 賦值符號(hào)=就是賦值運(yùn)算符,它
18、的作用是將一個(gè)表達(dá)式的值賦給一個(gè)變量。 賦值運(yùn)算符的一般形式為: 變量 = 賦值表達(dá)式; 例如,x = 5; y = (float)5 / 2; 如果表達(dá)式值的類型,與被賦值變量的類型不一致,但都是數(shù)值型或字符型時(shí),系統(tǒng)自動(dòng)地將表達(dá)式的值轉(zhuǎn)換成被賦值變量的數(shù)據(jù)類型,然后再賦值給變量。 思考題:假設(shè)變量num的數(shù)據(jù)類型為float,其值為2.5,則執(zhí)行“num = (int)num”后,num的值等于多少? float num=2.5; num = (int)num; printf(num=%fn,num);,2、復(fù)合賦值運(yùn)算符是由賦值運(yùn)算符之前再加一個(gè)雙目運(yùn)算符構(gòu)成的。 復(fù)合賦值運(yùn)算的一般格式
19、為: 變量 雙目運(yùn)算符 = 表達(dá)式 復(fù)合賦值運(yùn)算符 它等價(jià)于:變量 = 變量 雙目運(yùn)算符 (表達(dá)式)。 當(dāng)表達(dá)式為簡(jiǎn)單表達(dá)式時(shí),表達(dá)式外的一對(duì)圓括號(hào)才可缺省,否則可能出錯(cuò)。 例如:x += 3 /* 等價(jià)于x=x+3 */ y *= x+6 /*等價(jià)于y=y*(x+6),而不是y=y*x+6*/ C語言規(guī)定的10種復(fù)合賦值運(yùn)算符如下: +=,-=,*=,/=,%=;/*復(fù)合算術(shù)運(yùn)算符(5個(gè))*/ int b; a=1.2; b=a*3;,? b,b=3,例2,a+=3; x*=y+8,a=a+3; x=x*(y+8),例3,a=b=5; a=7+(b=8),? a,b,a=5 ;b=5 a=1
20、5;b=8,自右而左 的結(jié)合性,2.3.3 算術(shù)運(yùn)算符及算術(shù)表達(dá)式,1、 基本算術(shù)運(yùn)算符 +、-、*、/和求模(%) 2、自增自減運(yùn)算符 i+ 或 +i (相當(dāng)于i = i + 1;) i- - 或 - - i (相當(dāng)于i = i - 1;),基本算術(shù)運(yùn)算符:+ - * / % (% 模運(yùn)算符或求余運(yùn)算符) 說明:兩個(gè)整數(shù)相除的結(jié)果為整數(shù),舍去小數(shù)部分。 當(dāng)商為負(fù)數(shù)時(shí),多采用“向零取整”的方法。 例: 5/3 = 1 -5/3 = -1 注意:兩個(gè)整數(shù)相除,結(jié)果要求舍去小數(shù)部分,而不是四舍五入的方法。 例:a*b/c-1.5+a 分析算術(shù)運(yùn)算的優(yōu)先級(jí)和結(jié)合性。 如果加減乘除運(yùn)算中有一個(gè)數(shù)為實(shí)數(shù)
21、,則結(jié)果是double型。因?yàn)樗袑?shí)數(shù)都按double型運(yùn)算。,算術(shù)表達(dá)式:用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象(也稱操作數(shù)、常量、變量、函數(shù))連接起來的、符合C語法規(guī)則的式子。 例: a*b/c-1.5+a 優(yōu)先級(jí)和結(jié)合性:先乘除、后加減,有括號(hào)先算括號(hào)。 自左至右。 說明:如果一個(gè)運(yùn)算符兩側(cè)的數(shù)據(jù)類型不同,先自動(dòng)進(jìn)行類型轉(zhuǎn)換,使二者具有同一類型,然后進(jìn)行運(yùn)算。,自增、自減運(yùn)算符,作用:自增運(yùn)算符()使單個(gè)變量的值增1; 自減運(yùn)算符()使單個(gè)變量的值減1。,例,i=3; A)j=+i; B)j=i+; C)j=-i+;,i=i+1,i=i-1,? j,i,A) j=4 i=4 j=3 i=4 j=-
22、3,格式:前置:+i ,- -i(在使用i之前,使i的值加(減)1) 后置:i+ ,i- - (在使用i之后,使i的值加(減)1),+和- -結(jié)合方向 是“自右至左”,j=-i+; 相當(dāng)于j=-(i+);,例,i=3; A) c=(i+)+(i+); B) a=i+; b=i+; c=a+b;,? c, i,A) c=6 i=5 B) c=7 i=5,兩處i值都為3,例,? i, j,i=4 j=4 表達(dá)式的值:7,自左而右組合,例,i=3; printf(“%d,%d”,i,i+),?,4, 3,函數(shù)參數(shù)自右至左求值,例3中的自左至右不是指+運(yùn)算符的結(jié)合性,而是指C編譯系統(tǒng)在處理多個(gè)運(yùn)算符連
23、寫情況時(shí),多采用自左而右盡可能多的將若干個(gè)字符組成一個(gè)運(yùn)算符。,說明: (1) 自增、自減運(yùn)算是語言特有的,常用于循環(huán)語句中,使循環(huán)控制變量加(或減),以及指針變量中,使指針指向下(或上)一個(gè)地址。 (2) 自增、自減運(yùn)算符,不能用于常量和表達(dá)式。 例如,5+、- -(a+b)等都是非法的。 (3) +和- -的結(jié)合方向?yàn)樽杂抑磷蟆?(4) 如果對(duì)一個(gè)變量的自增自減運(yùn)算,單獨(dú)構(gòu)成語句,而不是作為表達(dá)式的一部分時(shí),前置和后置運(yùn)算效果一樣,都是使變量自加。 如i+;和 +i;是一樣的,都是使i加。 (5) 在表達(dá)式中,連續(xù)使用同一變量進(jìn)行自增或自減運(yùn)算時(shí),很容易出錯(cuò),所以最好避免這種用法。,2.3
24、.4 關(guān)系運(yùn)算符和關(guān)系表達(dá)式,= (大于或等于) (大于) (小于),關(guān)系運(yùn)算符, = = != (6種),優(yōu)先級(jí),賦值 關(guān)系( 后2前4 ) 算術(shù),關(guān)系表達(dá)式,用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式連接起來的式子.,算術(shù)、關(guān)系、邏輯、賦值、字符。,值,真(1) 假(0),舉例,已知: (a=3 b=2 c=1 d=0),0,a=bc,d=ab+c,1,53 ?,d=ab+c?,關(guān)系運(yùn)算符和關(guān)系表達(dá)式,2.3.5 邏輯運(yùn)算符和邏輯表達(dá)式,! (邏輯非) c=a|b; printf(a=%dnb=%dnc=%dn,a,b,c); ,應(yīng)用:按位或運(yùn)算常用來對(duì)一個(gè)數(shù)據(jù)的某些位定值為。例如:如果想使一個(gè)數(shù)的低位改為
25、,只需將與進(jìn)行按位或運(yùn)算即可。,例: 是一個(gè)整數(shù)(位), 有表達(dá)式: | 則低位全置為,高位保留原樣。,三、“異或”運(yùn)算符(),異或運(yùn)算符也稱XOR運(yùn)算符。它的規(guī)則是: 若參加運(yùn)算的兩個(gè)二進(jìn)制位同號(hào)則結(jié)果為(假) 異號(hào)則結(jié)果為(真) 參與運(yùn)算數(shù)仍以補(bǔ)碼出現(xiàn)。 規(guī)則:異號(hào),為1。,即:00=0,01=1,10=1, 11=0,即: 071052=023 (八進(jìn)制數(shù)),例:,例:95可寫成算式如下: 00001001 00000101 00001100 可見:95=12 上機(jī): #include main() int a=9; a=a5; printf(a=%dn,a); ,() 使特定位翻轉(zhuǎn),設(shè)
26、有,想使其低位翻轉(zhuǎn),即變?yōu)椋優(yōu)???梢詫⑺c進(jìn)行運(yùn)算,即:,運(yùn)算符應(yīng)用:,運(yùn)算結(jié)果的低位正好是原數(shù)低位的翻轉(zhuǎn)。可見,要使哪幾位翻轉(zhuǎn)就將與其進(jìn)行運(yùn)算的該幾位置為即可。,因?yàn)樵瓟?shù)中的與進(jìn)行運(yùn)算得,得,故保留原數(shù)。,例如:01200=012,() 與相,保留原值,() 交換兩個(gè)值,不用臨時(shí)變量,例如:,。 想將和的值互換,可以用以下賦值語句實(shí)現(xiàn): ab; ba; ab;, () (ab的結(jié)果,a已變成) () (ba的結(jié)果,b已變成) () (ab的結(jié)果,a已變成), 執(zhí)行前兩個(gè)賦值語句:“;”和“;”相當(dāng)于b=b(ab)。 再執(zhí)行第三個(gè)賦值語句: 。由于a的值等于(),b的值等于(),因此,相當(dāng)于
27、a=,即a的值等于,等于。 得到原來的值。,即等效于以下兩步:,四、 “取反”運(yùn)算符(),是一個(gè)單目(元)運(yùn)算符,用來對(duì)一個(gè)二進(jìn)制數(shù)按位取反,即將變,將變。例如,是對(duì)八進(jìn)制數(shù)(即二進(jìn)制數(shù))按位求反。 規(guī)則: 變,變。,五、 左移運(yùn)算符(),左移運(yùn)算符是用來將一個(gè)數(shù)的各二進(jìn)制位全部左移若干位。,例如:a=2 將的二進(jìn)制數(shù)左移位,右補(bǔ)。 若,即二進(jìn)制數(shù), 左移位得,(十進(jìn)制數(shù)),高位左移后溢出,舍棄,低位補(bǔ)0。,左移位相當(dāng)于該數(shù)乘以,左移位相當(dāng)于該數(shù)乘以22,152=60,即乘了。但此結(jié)論只適用于該數(shù)左移時(shí)被溢出舍棄的高位中不包含的情況。 假設(shè)以一個(gè)字節(jié)(位)存一個(gè)整數(shù),若為無符號(hào)整型變量,則時(shí),
28、左移一位時(shí)溢出的是,而左移位時(shí),溢出的高位中包含。,六、右移運(yùn)算符(),右移運(yùn)算符是a2表示將a的各二進(jìn)制位右移2位,移到右端的低位被舍棄,對(duì)無符號(hào)數(shù),高位補(bǔ)0。,例如: a=017時(shí): a的值用二進(jìn)制形式表示為00001111, 舍棄低2位11: a2=00000011,右移一位相當(dāng)于除以2 右移n位相當(dāng)于除以2n。,例:#include main() unsigned a,b; printf(input a number: ); scanf(%d, ,在右移時(shí),需要注意符號(hào)位問題: 對(duì)無符號(hào)數(shù),右移時(shí)左邊高位移入0;對(duì)于有符號(hào)的值,如果原來符號(hào)位為0(該數(shù)為正),則左邊也是移入0。如果符號(hào)
29、位原來為1(即負(fù)數(shù)),則左邊移入0還是1,要取決于所用的計(jì)算機(jī)系統(tǒng)。有的系統(tǒng)移入0,有的系統(tǒng)移入1。移入0的稱為“邏輯右移”,即簡(jiǎn)單右移;移入1的稱為“算術(shù)右移”。,例:a的值是八進(jìn)制數(shù)113755: a: 1001011111101101 (用二進(jìn)制形式表示) a1: 0100101111110110 (邏輯右移時(shí)) a1: 1100101111110110 (算術(shù)右移時(shí)),在有些系統(tǒng)中,a1得八進(jìn)制數(shù)045766,而在另一些系統(tǒng)上可能得到的是145766。Turbo C和其他一些C編譯采用的是算術(shù)右移,即對(duì)有符號(hào)數(shù)右移時(shí),如果符號(hào)位原來為1,左面移入高位的是1。,七、位運(yùn)算賦值運(yùn)算符,位運(yùn)
30、算符與賦值運(yùn)算符可以組成復(fù)合賦值運(yùn)算符。 例如: scanf(“%o”, ,運(yùn)行情況如下:(輸入) , 217 (的值) , 13 (的值) 輸入的值為八進(jìn)制數(shù)331, 其二進(jìn)制形式為11011001 經(jīng)運(yùn)算最后得到的d為00001101 即八進(jìn)制數(shù),十進(jìn)制數(shù)13。,例2 循環(huán)移位,要求將進(jìn)行右循環(huán)移位,將右循環(huán)移位,即將中原來左面()位右移位,原來右端位移到最左面位。, 將的右端位先放到中的高位中,實(shí)現(xiàn)語句:(); 將右移位,其左面高位位補(bǔ), 實(shí)現(xiàn)語句:; 將與進(jìn)行按位或運(yùn)算,即|;,步驟:,程序如下: #include void main() unsigned a,b,c; int n;
31、scanf(“a=%o,n=%d”, ,運(yùn)行情況如下: , 3 ,運(yùn)行開始時(shí)輸入八進(jìn)制數(shù)157653, 即二進(jìn)制數(shù)1101111110101011 循環(huán)右移位后得二進(jìn)制數(shù)0111101111110101 即八進(jìn)制數(shù)75765,2.4.3 位段,信息的存取一般以字節(jié)為單位。但有時(shí)存儲(chǔ)一個(gè)信息不必用一個(gè)字節(jié),而只需占一個(gè)或幾個(gè)二進(jìn)制位。例如,“真”或“假”用或表示,只需位即可。存放一個(gè)開關(guān)量時(shí),只有0和1兩種狀態(tài)。在計(jì)算機(jī)用于過程控制、參數(shù)檢測(cè)或數(shù)據(jù)通信領(lǐng)域時(shí),控制信息往往只占一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位,常常在一個(gè)字節(jié)中放幾個(gè)信息。 為了節(jié)省存儲(chǔ)空間,并使處理簡(jiǎn)便,語言又提供了一種數(shù)據(jù)結(jié)構(gòu),稱
32、為 “位段”或“位域” 。 所謂“位段”是把一個(gè)字節(jié)中的二進(jìn)位劃分為幾個(gè)不同的區(qū)域,并說明每個(gè)區(qū)域的位數(shù)。每個(gè)域有一個(gè)域名,允許在程序中按域名進(jìn)行操作。這樣就可以把幾個(gè)不同的對(duì)象用一個(gè)字節(jié)的二進(jìn)制位域來表示。 C語言允許在一個(gè)結(jié)構(gòu)體中以位為單位來指定其成員所占內(nèi)存長(zhǎng)度,這種以位為單位的成員稱為“位段”或稱“位域” ( bit field) 。利用位段能夠用較少的位數(shù)存儲(chǔ)數(shù)據(jù)。,(1) 可以人為地將一個(gè)整型變量data分為幾部分。 但是用這種方法給一個(gè)字節(jié)中某幾位賦值太麻煩。 (2) 可以用位段結(jié)構(gòu)體的方法。,怎樣向一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位賦值和改變它的值呢?可以用以下兩種方法:,1、位域
33、的定義和位域變量的說明 位域定義與結(jié)構(gòu)定義相仿,其形式為: struct 位域結(jié)構(gòu)名 位域列表 ; 其中:位域列表的形式為: 類型說明符 位域名:位域長(zhǎng)度 例如: struct bs int a:8; int b:2; int c:6; ;,位域變量的說明與結(jié)構(gòu)變量說明的方式相同。 可采用先定義后說明,同時(shí)定義說明或者直接說明這三種方式。 例如: struct bs int a:8; int b:2; int c:6; data; 說明data為bs變量,共占兩個(gè)字節(jié)。其中位域a占8位,位域b占2位,位域c占6位。,例: struct packed-data unsigned :; unsig
34、ned:; unsigned:; unsigned:; int ; data;,對(duì)于位域的定義有以下幾點(diǎn)說明: (1)一個(gè)位域必須存儲(chǔ)在同一個(gè)字節(jié)中,不能跨兩個(gè)字節(jié)。如一個(gè)字節(jié)所??臻g不夠存放另一位域時(shí),應(yīng)從下一單元起存放該位域。也可以有意使某位域從下一單元開始。 例如: struct bs unsigned a:4 unsigned :0 /*空域*/ unsigned b:4 /*從下一單元開始存放*/ unsigned c:4 在這個(gè)位域定義中,a占第一字節(jié)的4位,后4位填0表示不使用,b從第二字節(jié)開始,占用4位,c占用4位。,(2)由于位域不允許跨兩個(gè)字節(jié),因此位域的長(zhǎng)度不能大于一個(gè)字
35、節(jié)的長(zhǎng)度,也就是說不能超過8位二進(jìn)位。 (3)位域可以無位域名,這時(shí)它只用來作填充或調(diào)整位置。無名的位域是不能使用的。 例如: struct k int a:1 int :2 /*該2位不能使用*/ int b:3 int c:2 ; 從以上分析可以看出,位域在本質(zhì)上就是一種結(jié)構(gòu)類型,不過其成員是按二進(jìn)位分配的。,2、位域的使用 位域的使用和結(jié)構(gòu)成員的使用相同,其一般形式為: 位域變量名位域名 位域允許用各種格式輸出。 例: main() struct bs unsigned a:1; unsigned b:3; unsigned c:4; bit, *pbit; bit.a=1; bit.b
36、=7; bit.c=15; printf(%d,%d,%dn,bit.a,bit.b,bit.c); pbit= ,上例程序中定義了位域結(jié)構(gòu)bs,三個(gè)位域?yàn)閍,b,c。說明了bs類型的變量bit和指向bs類型的指針變量pbit。這表示位域也是可以使用指針的。程序的9、10、11三行分別給三個(gè)位域賦值(應(yīng)注意賦值不能超過該位域的允許范圍)。程序第12行以整型量格式輸出三個(gè)域的內(nèi)容。第13行把位域變量bit的地址送給指針變量pbit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復(fù)合的位運(yùn)算符 ,4、include 或:#include “stdio.h” 在調(diào)用標(biāo)準(zhǔn)輸入輸出函數(shù)時(shí)必須
37、使用include 文件包含命令將 stdio.h頭文件包含進(jìn)來。 include 文件包含命令都是放在程序的開頭。 注意:include 在.c文件中可以省略,在.cpp文件中不能省略。 在TC環(huán)境中,若使用printf()或scanf()函數(shù),則前面的預(yù)編譯命令可以省略!在VC+環(huán)境中不能省略!,2.5.1 字符輸入/輸出函數(shù),1、字符輸入函數(shù)getchar() 例:getchar()函數(shù)的應(yīng)用。 #include void main() int c; printf(please input a character:); c=getchar(); printf(What inputed i
38、s %cn,c); ,單個(gè)字符的輸入getchar函數(shù) 作用:從終端(鍵盤、輸入設(shè)備)輸入一個(gè)字符。 格式:getchar(); 注:getchar函數(shù)沒有參數(shù),所接受的字符可以賦給字符型或整型變量,也可以作為表達(dá)式的一部分。 舉例:,#include void main() char c1; c1=getchar(); putchar(c1); putchar(getchar(); ,輸入: a ,a _,輸入: a b ,ab_,?,思考:分別輸入a和ab時(shí)輸出為什么不同? 輸出框中的下劃線表示光標(biāo)。,2、字符輸出函數(shù)putchar(),例:利用putchar()函數(shù)將字符輸出到顯示終端上
39、。 #include void main() int a; a=100; printf( output the character n); putchar(a); ,單個(gè)字符的輸出putchar函數(shù) 作用:向終端(顯示器、輸出設(shè)備)輸出一個(gè)字符。 格式:putchar(ch); 注:其中ch可以是字符型(整型)變量、常量或表達(dá)式 也可以是一個(gè)轉(zhuǎn)義字符,如putchar(n)、putchar(101) 舉例: #include void main() char ch1B,ch2=O,ch3=Y; putchar(”); /*輸出雙引號(hào)*/ putchar(ch1);putchar(ch2);pu
40、tchar(ch3);/*輸出BOY*/ putchar(”); /*輸出雙引號(hào)*/ 該程序輸出”BOY”。,思 考? 想從鍵盤輸入三個(gè)字母,然后將字母輸出。編寫程序。 想從鍵盤輸入三個(gè)小寫字母,然后將字母變成大寫,再輸出。編寫程序。 想從鍵盤輸入三個(gè)大寫字母,然后將字母變成小寫,再輸出。編寫程序。,2.5.2 格式化輸入輸出函數(shù),1、格式化輸出函數(shù)printf函數(shù) Printf ( ” 格式描述串 ” ,輸出項(xiàng)表列 ) “格式描述串”由一系列“格式轉(zhuǎn)換說明符”組成。 作用:向終端(或輸出設(shè)備)輸出若干個(gè)任意類型的數(shù)據(jù)。 格式:printf(“格式控制字符串” ,輸出列表); 說明: 1、“格
41、式控制字符串“是用雙撇號(hào)引起來的字符串,包括三種信息: (1)格式說明:由%和格式字符組成。 (如%d、%f) (將輸出的數(shù)據(jù)轉(zhuǎn)換為指定的格式輸出。),(2)普通字符:需要按原樣輸出的字符。 (3)轉(zhuǎn)義字符: (如t、n、b、r等) 2、“輸出列表”是需要輸出的一些數(shù)據(jù),可以是表達(dá)式。 3、printf函數(shù)和putchar函數(shù)的區(qū)別: putchar函數(shù)只能輸出字符,而且只能時(shí)一個(gè)字符;而printf函數(shù)可以輸出多個(gè)數(shù)據(jù),而且是任意類型。 必須強(qiáng)調(diào):“格式控制字符串”中的格式字符,必須與“輸出列表”中輸出項(xiàng)的數(shù)據(jù)類型兼容,否則會(huì)引起輸出錯(cuò)誤。 注:1)整型和字符型可以通用。 2)tb連寫,退一
42、個(gè)制表位。 如:printf(“abcbthello”); 輸出結(jié)果為:abchello。,例2,#include void main() int a,b; a=3; b=4; printf(“輸出結(jié)果為:”); printf(“%d %dn”,a,b); printf(“a=%d, b=%dn”,a,b); printf(“a+b=%d”,a+b); ,輸出結(jié)果為:3 4 a=3, b=4 a+b=7 _,例1,printf(“sum=%d n %c”, x, ch);,普通字符,格式說明,轉(zhuǎn)義字符,如果x=100,ch= A ,那么下面的輸出語句將輸出什么結(jié)果?,輸出列表,sum=100
43、A_,例1:體會(huì)printf函數(shù)中不同組成部分的輸出形式 例2:輸出列表分別為空、變量或表達(dá)式時(shí)的輸出。 注:輸出框中的下劃線表示光標(biāo)的位置。,格式說明必須以開始,以格式字符結(jié)束。 一般形式如下: % 標(biāo)志 寬度 .精度 l 格式字符,-,-,n,m,d/f/c/u/s等,長(zhǎng)整型整數(shù),輸出數(shù)據(jù)向左靠攏,輸出數(shù)據(jù)最小寬度,對(duì)實(shí)數(shù):輸出小數(shù)點(diǎn)位數(shù); 對(duì)字符串:截取字符的個(gè)數(shù),格式說明的一般形式,注意:m和n都是正整數(shù)。m指數(shù)據(jù)輸出的最小寬度,若指定的寬度m小于數(shù)據(jù)的實(shí)際寬度,則按實(shí)際寬度輸出。,格式字符,附加格式說明字符,格式字符,必須強(qiáng)調(diào):“格式控制字符串”中的格式字符,必須與“輸出列表”中輸出
44、項(xiàng)的數(shù)據(jù)類型兼容,否則會(huì)引起輸出錯(cuò)誤。 注:整型和字符型可以通用。 格式字符X, x: 用X時(shí),以大寫字母輸出af,否則以小寫輸出af。,#include main() int num1=123; long num2=123456; /*用3種不同格式,輸出int型數(shù)據(jù)num1的值*/ printf(num1=%d,num1=%5d,num1=%-5d,num1=%2dn, num1,num1,num1,num1); /*用3種不同格式,輸出long型數(shù)據(jù)num2的值*/ printf(num2=%ld,num2=%8ld,num2=%5ldn,num2,num2,num2); printf(
45、num1=%ldn,num1); ,格式輸出舉例d格式符,對(duì)于整數(shù),還可用八進(jìn)制、無符號(hào)形式(%o(小寫字母o))和十六進(jìn)制、無符號(hào)形式(%x)輸出。對(duì)于unsigned型數(shù)據(jù),也可用%u格式符,以十進(jìn)制、無符號(hào)形式輸出。 所謂無符號(hào)形式是指,不論正數(shù)還是負(fù)數(shù),系統(tǒng)一律當(dāng)作無符號(hào)整數(shù)來輸出。 例如,printf(%d,%o,%xn,-1,-1,-1);,綜合舉例,float x,y; x=111111.111; y=222222.222; printf(“%f”,x+y);,333333.328125,整數(shù)部分全部輸出, 小數(shù)部分輸出6位,因有效位數(shù)為7位,因此 后面數(shù)字不準(zhǔn)確。,float
46、x=123.456; printf(“%f”,x); printf(“%10f”,x); printf(“%10.2f”,x); printf(“%.2f”,x); printf(“%-10.2f”,x);,123.456001 123.456001 123.46 123.46 123.46,實(shí)數(shù)最常用的 兩種輸出格式,格式輸出舉例f格式符,對(duì)于實(shí)數(shù),也可使用格式符%e,以標(biāo)準(zhǔn)指數(shù)形式輸出: 尾數(shù)中的整數(shù)部分大于等于1、小于10,小數(shù)點(diǎn)占一位,尾數(shù)中的小數(shù)部分占6位;指數(shù)部分占5位(如e-003),其中e占一位,指數(shù)符號(hào)占一位,指數(shù)占3位,共計(jì)13位。 也可使用格式符%g,讓系統(tǒng)根據(jù)數(shù)值的大小
47、,自動(dòng)選擇%f或%e格式、且不輸出無意義的零。,float x=123.456; printf(“%e”,x); printf(“%10e”,x); printf(“%10.2e”,x); printf(“%.2e”,x); printf(“%-10.2e”,x);,綜合舉例,1.234560e+002 1.234560e+002 1.23e+002 1.23e+002 1.23e+002,輸出: 1.234560e+002,指數(shù)部分,尾數(shù)部分,格式輸出舉例e格式符,2 6 5,總寬度為 13,格式輸出舉例c格式符,#include void main() char c=A; int i=65; printf(c=%c,%5c,%dn,c,c,c); printf(i=%d,%c,i,i); ,c=A,A,65 i=65,A,注意,在C語言中,整數(shù)可以用字符形式輸出,字符數(shù)據(jù)也可以用整數(shù)形式輸出。將整數(shù)用字符形式輸出時(shí),系統(tǒng)首先求該數(shù)與256的余數(shù),然后將余數(shù)作為ASCII碼,轉(zhuǎn)換成相應(yīng)的字符輸出。,需要強(qiáng)調(diào)的是:在C語言中,整數(shù)可以用字符形式輸出,字符數(shù)據(jù)也可以用整數(shù)形式輸出。將整數(shù)用字符形式輸出時(shí),系統(tǒng)首先求該數(shù)與256的余數(shù),然后將余數(shù)作為ASCII碼,轉(zhuǎn)換成相應(yīng)的字符輸出。 #include main( ) char
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)村土地承包經(jīng)營權(quán)與農(nóng)村文化傳承保護(hù)合同
- 二零二五年度魚塘承包權(quán)及養(yǎng)殖技術(shù)培訓(xùn)轉(zhuǎn)讓合同
- Unit 3 Writing Home Lesson 15 Sending the Postcards同步練習(xí)(含答案含聽力原文無聽力音頻)
- Unit 1 Going to Beijing Lesson 6 Danny Is Lost!同步練習(xí)(含答案含聽力原文無音頻)
- 2025年度高端餐飲品牌區(qū)域代理權(quán)合作協(xié)議書
- 二零二五年度智能家居銷售總額提成及市場(chǎng)拓展合同
- 2025年巢湖b2貨運(yùn)上崗證模擬考試
- 在校實(shí)習(xí)生實(shí)習(xí)合同
- 2024年正規(guī)離婚協(xié)議
- 2025年遂寧年貨運(yùn)從業(yè)資格證考試題庫
- GA 1383-2017報(bào)警運(yùn)營服務(wù)規(guī)范
- 資料交接移交確認(rèn)單
- 2023年青島恒星科技學(xué)院?jiǎn)握芯C合素質(zhì)考試筆試題庫及答案解析
- 民族宗教新疆歷史課件
- 高低壓開關(guān)柜安裝檢驗(yàn)記錄
- 部編語文八年級(jí)上冊(cè)1-3單元教材分析課件
- (完整版)SF-36評(píng)分標(biāo)準(zhǔn)
- 研究思路圖模板
- 職員員工行為規(guī)范檢查表
- 一級(jí)公司向二級(jí)公司授權(quán)管理制度
- sm通道開關(guān)量冗余輸入端子模塊使用說明書
評(píng)論
0/150
提交評(píng)論