計(jì)算機(jī)系統(tǒng)導(dǎo)論 課件 第二章高級(jí)語(yǔ)言程序_第1頁(yè)
計(jì)算機(jī)系統(tǒng)導(dǎo)論 課件 第二章高級(jí)語(yǔ)言程序_第2頁(yè)
計(jì)算機(jī)系統(tǒng)導(dǎo)論 課件 第二章高級(jí)語(yǔ)言程序_第3頁(yè)
計(jì)算機(jī)系統(tǒng)導(dǎo)論 課件 第二章高級(jí)語(yǔ)言程序_第4頁(yè)
計(jì)算機(jī)系統(tǒng)導(dǎo)論 課件 第二章高級(jí)語(yǔ)言程序_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第二章高級(jí)語(yǔ)言程序

變量和常量及其類型

表達(dá)式及運(yùn)算符

控制結(jié)構(gòu)和函數(shù)調(diào)用高級(jí)語(yǔ)言程序主要教學(xué)目標(biāo)了解C語(yǔ)言發(fā)展概述,以及相應(yīng)的C語(yǔ)言標(biāo)準(zhǔn)規(guī)范了解C程序中變量、常量的定義和引用之間的關(guān)系理解C程序中變量、常量的類型與機(jī)器級(jí)表示之間的關(guān)系理解編譯器對(duì)C語(yǔ)言表達(dá)式的轉(zhuǎn)換處理任務(wù)理解編譯器對(duì)控制結(jié)構(gòu)語(yǔ)句和函數(shù)調(diào)用的基本處理任務(wù)理解變量的作用域與變量的存儲(chǔ)分配之間的關(guān)系從C程序的基本要素出發(fā),引出后續(xù)各個(gè)章節(jié)的內(nèi)容高級(jí)語(yǔ)言程序本章內(nèi)容包括:變量和常量及其類型C程序中的變量及其類型C程序中的常量及其類型表達(dá)式及運(yùn)算符表達(dá)式中的運(yùn)算符C語(yǔ)言中的基本運(yùn)算控制結(jié)構(gòu)和函數(shù)調(diào)用C語(yǔ)言中的控制結(jié)構(gòu)語(yǔ)句C語(yǔ)言中的函數(shù)調(diào)用變量的作用域與存儲(chǔ)分配C標(biāo)準(zhǔn)I/O庫(kù)函數(shù)/*---sum.c---*/intsum(inta[],unsignedlen){ int i,sum=0; for (i=0;i<=len–1;i++) sum+=a[i]; returnsum;}/*---main.c---*/intmain(){ inta[1]={100}; intresult;result=sum(a,1);printf(“%d”,result);}常數(shù)表達(dá)式和運(yùn)算符變量循環(huán)結(jié)構(gòu)語(yǔ)句函數(shù)調(diào)用標(biāo)準(zhǔn)I/O庫(kù)函數(shù)調(diào)用C語(yǔ)言概述本課程基于“IA-32/x86-64+Linux+GCC+C語(yǔ)言”介紹計(jì)算機(jī)系統(tǒng)基礎(chǔ)內(nèi)容高級(jí)語(yǔ)言程序:C語(yǔ)言程序機(jī)器級(jí)代碼:IA-32/x86-64架構(gòu)操作系統(tǒng):Linux編譯器及開發(fā)工具:GCCC語(yǔ)言(起源于貝爾實(shí)驗(yàn)室)1970年,肯·湯普森用B語(yǔ)言寫了第一個(gè)UNIX操作系統(tǒng)1972年,丹尼斯·里奇在B語(yǔ)言基礎(chǔ)上設(shè)計(jì)了C語(yǔ)言1983年,加尼·斯楚士舒普把C語(yǔ)言又?jǐn)U展成C++C標(biāo)準(zhǔn):ANSIC(ISOC90)、ISOC99C語(yǔ)言特點(diǎn)簡(jiǎn)單靈活、抽象程度低(接近硬件)、安全性和規(guī)范性較弱C語(yǔ)言中的變量變量的特點(diǎn)表示一個(gè)可變化的“值”——必須分配一個(gè)存儲(chǔ)空間只能有一個(gè)唯一的“定義”——所在存儲(chǔ)空間的首地址應(yīng)先定義后引用

——可在表達(dá)式中或賦值語(yǔ)句等號(hào)左邊引用變量的定義必須給出數(shù)據(jù)類型和名字,必要時(shí)給出存儲(chǔ)類型(如static)變量定義所在位置和存儲(chǔ)類型不同,其作用域和生存期不同編譯器根據(jù)不同的作用域?qū)⒆兞糠峙湓诓煌拇鎯?chǔ)空間中變量的數(shù)據(jù)類型簡(jiǎn)單數(shù)據(jù)類型有無符號(hào)整型、帶符號(hào)整型、浮點(diǎn)類型、指針型C語(yǔ)言標(biāo)準(zhǔn)規(guī)定了每種數(shù)據(jù)類型的最小取值范圍復(fù)雜數(shù)據(jù)類型有數(shù)組(array)、結(jié)構(gòu)(struct)、聯(lián)合(union)等關(guān)于變量的作用域及所分配存儲(chǔ)空間的相關(guān)內(nèi)容參見第6章C語(yǔ)言中的常量三種類型的常量字面量(字面值)#define定義的常量符號(hào)

const定義的常量名

常量的定義#define常量:隨場(chǎng)景變化,但確定場(chǎng)景下不變(如RADIUS)const常量:任何場(chǎng)景下都不變(如圓周率pi)字面量:可帶小數(shù)點(diǎn)和字母E、前綴0x、后綴U或u等(如2.85E10、0x12BF、12345、12345U、0x3F8Cu)字面量的處理編譯器需將字面量轉(zhuǎn)換為二進(jìn)制表示形式編譯器需根據(jù)C語(yǔ)言標(biāo)準(zhǔn)確定字面量的數(shù)據(jù)類型在不同的C語(yǔ)言標(biāo)準(zhǔn)中,同一字面量數(shù)據(jù)類型可能不同(見3.2.3)關(guān)于不同類型的變量和常量的二進(jìn)制表示在第3章介紹1#include<stdio.h>2#defineRADIUS20.03intmain(){4constdoublepi=3.14159;5doublecircum=2*pi*RADIUS;6 ……7}C語(yǔ)言中的表達(dá)式表達(dá)式用于描述對(duì)變量和常量的各種組合運(yùn)算表達(dá)式由運(yùn)算符連接變量和常量而組成

表達(dá)式中可嵌套表達(dá)式表達(dá)式中的運(yùn)算符與運(yùn)算算術(shù)運(yùn)算符、按位運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、自增/自減運(yùn)算符、取地址/取內(nèi)容運(yùn)算符以及各種括號(hào)等運(yùn)算符之間有特定的優(yōu)先級(jí)和結(jié)合順序編譯器根據(jù)運(yùn)算符優(yōu)先級(jí)和結(jié)合順序?qū)Ρ磉_(dá)式進(jìn)行處理,生成對(duì)應(yīng)的機(jī)器級(jí)代碼(指令序列)每個(gè)表達(dá)式對(duì)應(yīng)一個(gè)指令執(zhí)行序列,其中多為運(yùn)算類指令運(yùn)算類指令在CPU中執(zhí)行時(shí),在特定的運(yùn)算部件中進(jìn)行運(yùn)算關(guān)于不同類型數(shù)據(jù)的各類運(yùn)算方法和運(yùn)算部件在第4章介紹關(guān)于運(yùn)算類指令將在第5章介紹C語(yǔ)言程序中的運(yùn)算算術(shù)運(yùn)算(最基本的運(yùn)算)無符號(hào)數(shù)、帶符號(hào)整數(shù)、浮點(diǎn)數(shù)的+、-、*、/運(yùn)算等按位運(yùn)算用途對(duì)位串實(shí)現(xiàn)“掩碼”(mask)操作或相應(yīng)的其他處理(主要用于對(duì)多媒體數(shù)據(jù)或狀態(tài)/控制信息進(jìn)行處理)操作按位或:“|”按位與:“&”按位取反:“~”按位異或:“^”問題:如何從16位采樣數(shù)據(jù)y中提取高位字節(jié),并使低字節(jié)為0?可用“&”實(shí)現(xiàn)“掩碼”操作:y&0xFF00例如,當(dāng)y=0x2C0B時(shí),得到結(jié)果為:0x2C00C語(yǔ)言程序中的運(yùn)算邏輯運(yùn)算用途用于關(guān)系表達(dá)式的運(yùn)算例如,if(x>y并i<100)then……中的“并”運(yùn)算操作“‖”表示“OR”運(yùn)算“&&”表示“AND”運(yùn)算

例如,if((x>y)&&(i<100))then……“!”表示“NOT”運(yùn)算與按位運(yùn)算的差別符號(hào)表示不同:&

對(duì)

&&

;|對(duì)

‖;……運(yùn)算過程不同:按位對(duì)

整體結(jié)果類型不同:位串對(duì)

邏輯值C語(yǔ)言程序中的運(yùn)算移位運(yùn)算用途提取部分信息擴(kuò)大或縮小數(shù)值的2、4、8…倍操作左移::x<<k;右移:x>>kC語(yǔ)言中不區(qū)分是邏輯還是算術(shù)移位,編譯器根據(jù)x的類型確定無符號(hào)數(shù):邏輯左移、邏輯右移高(低)位移出,低(高)位補(bǔ)0,可能溢出!問題:何時(shí)可能發(fā)生溢出?如何判斷溢出?

若高位移出的是1,則左移時(shí)發(fā)生溢出帶符號(hào)整數(shù):算術(shù)左移、算術(shù)右移左移:高位移出,低位補(bǔ)0??赡芤绯觯?/p>

溢出判斷:若移出的位不等于新的符號(hào)位,則溢出。右移:低位移出,高位補(bǔ)符,可能發(fā)生有效數(shù)據(jù)丟失。如何從16位數(shù)據(jù)y中提取高位字節(jié)?某字長(zhǎng)為8的機(jī)器中,x、y和z都是8位無符號(hào)整數(shù),已知x=80,則y=x/2=?z=2x=?(y>>8)送8位寄存器移位!y=40?z=160?C語(yǔ)言程序中的運(yùn)算位擴(kuò)展和位截?cái)噙\(yùn)算用途類型轉(zhuǎn)換時(shí)可能需要數(shù)據(jù)擴(kuò)展或截?cái)嗖僮鰿語(yǔ)言中沒有專門操作運(yùn)算符,編譯器根據(jù)類型轉(zhuǎn)換前后數(shù)據(jù)的長(zhǎng)短,確定是擴(kuò)展還是截?cái)鄶U(kuò)展:短轉(zhuǎn)長(zhǎng)

無符號(hào)數(shù):0擴(kuò)展,前面補(bǔ)0帶符號(hào)整數(shù):符號(hào)擴(kuò)展,前面補(bǔ)符截?cái)啵洪L(zhǎng)轉(zhuǎn)短

丟棄高位,可能發(fā)生“溢出”例1(擴(kuò)展操作):在大端機(jī)上輸出si,usi,i,ui的十進(jìn)制和十六進(jìn)制值是什么?shortsi=-32768;unsignedshortusi=si;inti=si;unsingnedui=usi;si=-327688000usi=327688000i=-32768FFFF8000ui=3276800008000例2(截?cái)嗖僮鳎篿和j是否相等?inti=32768;shortsi=(short)i;intj=si;不相等!i=3276800008000si=-327688000j=-32768FFFF8000原因:對(duì)i截?cái)鄷r(shí)發(fā)生了溢出,即:32768截?cái)酁?6位數(shù)時(shí),因其超出16位能表示的最大值,故無法截?cái)酁檎_的16位數(shù)!C語(yǔ)言標(biāo)準(zhǔn)規(guī)定,長(zhǎng)數(shù)轉(zhuǎn)換為短數(shù)的結(jié)果是未定義的(UB)沒有規(guī)定編譯器必須報(bào)錯(cuò)C語(yǔ)言中的控制結(jié)構(gòu)為描述操作執(zhí)行過程,編程語(yǔ)言會(huì)提供一套描述機(jī)制,這種機(jī)制稱為控制結(jié)構(gòu)不同的控制結(jié)構(gòu)描述了程序中相關(guān)操作之間不同的執(zhí)行順序順序執(zhí)行、選擇執(zhí)行、循環(huán)執(zhí)行C語(yǔ)言中的控制結(jié)構(gòu)流程控制語(yǔ)句編譯器必須將各類流程控制語(yǔ)句轉(zhuǎn)換為機(jī)器級(jí)代碼關(guān)于不同控制結(jié)構(gòu)語(yǔ)句對(duì)應(yīng)的機(jī)器級(jí)代碼在第6章介紹C語(yǔ)言中的函數(shù)調(diào)用模塊化程序設(shè)計(jì)使用入口參數(shù)和返回參數(shù)將多個(gè)子程序分離C語(yǔ)言中的函數(shù)調(diào)用實(shí)現(xiàn)了程序的模塊化設(shè)計(jì)C語(yǔ)言中的函數(shù)調(diào)用一個(gè)C程序由若干函數(shù)組成,從main()函數(shù)開始函數(shù)之間可以嵌套調(diào)用,也可以遞歸調(diào)用函數(shù)必須先定義后引用函數(shù)的定義和原型聲明定義用于構(gòu)建一個(gè)對(duì)象,意味著在編譯器轉(zhuǎn)換得到的機(jī)器級(jí)代碼中需要為這個(gè)對(duì)象分配存儲(chǔ)空間聲明說明存在相應(yīng)對(duì)象,被聲明的對(duì)象一定存在唯一的定義若聲明的對(duì)象無定義,則該聲明無效,會(huì)出現(xiàn)鏈接錯(cuò)誤C語(yǔ)言中的函數(shù)調(diào)用函數(shù)的原型聲明函數(shù)必須先定義后引用若函數(shù)在被引用前未定義,則須先給出其原型聲明intadd(intx,inty){ returnx+y;}intmain(){ int t1=125;intt2=80; int sum=add(t1,t2); returnsum;}先定義后引用定義引用C語(yǔ)言中的函數(shù)調(diào)用函數(shù)的原型聲明若函數(shù)在被引用前未定義,則須先給出其原型聲明引用前沒有定義的情況下,先聲明后使用,被引用的函數(shù)定義在其他模塊,或在調(diào)用(引用)函數(shù)之后intbuf[2]={1,2};voidswap();intmain(){swap();return0;}externintbuf[];

int*bufp0=&buf[0];staticint*bufp1;voidswap(){inttemp;bufp1=&buf[1];temp=*bufp0;*bufp0=*bufp1;*bufp1=temp;}原型聲明引用定義C語(yǔ)言中的函數(shù)調(diào)用函數(shù)定義函數(shù)定義由函數(shù)頭部和函數(shù)體兩部分組成函數(shù)體中定義的變量為局部變量(有靜態(tài)局部變量和自動(dòng)變量)函數(shù)頭部1constdoublepi=3.14159265;2doublearea_of_circle(doublex)3{4doubleresult;5result=pi*x*x;6returnresult;7}8doublecircum_of_circle(doublex)9{10doubleresult;11result=2*pi*x;12returnresult;13}函數(shù)體兩個(gè)函數(shù)體中都定義了局部變量result,不加“static”表示非靜態(tài)局部變量,即為自動(dòng)(auto)變量形式參數(shù)列表C語(yǔ)言中的函數(shù)調(diào)用函數(shù)調(diào)用機(jī)制函數(shù)調(diào)用時(shí),執(zhí)行流程將從調(diào)用函數(shù)轉(zhuǎn)到被調(diào)用函數(shù)轉(zhuǎn)入執(zhí)行前,入口參數(shù)(實(shí)參)應(yīng)傳遞給形式參數(shù)實(shí)參必須與形參類型一致或能轉(zhuǎn)換為形參類型數(shù)據(jù)返回時(shí)將返回值傳遞給調(diào)用函數(shù)返回參數(shù)類型與函數(shù)定義類型一致右邊例子中存在4次類型轉(zhuǎn)換5.6轉(zhuǎn)換為5后傳遞給形參r5轉(zhuǎn)換為浮點(diǎn)類型計(jì)算2*3.14*r計(jì)算結(jié)果31.4轉(zhuǎn)換為int型數(shù)31將int型數(shù)31轉(zhuǎn)換為float型后,再賦給變量x實(shí)參intfunct(intr){return2*3.14*r;}intmain(){floatx=funct(5.6);……}形參C語(yǔ)言中的函數(shù)調(diào)用C程序的執(zhí)行流程和主函數(shù)main()一個(gè)完整的C程序中一定有且僅有一個(gè)main()函數(shù)main()是執(zhí)行起點(diǎn),也定義了完整的執(zhí)行過程。若把函數(shù)調(diào)用關(guān)系用一棵樹表示,則main()為樹根main()返回類型為int,無“return0;”時(shí)自動(dòng)產(chǎn)生返回值0main()稱為主函數(shù),出main()外的函數(shù)稱為普通函數(shù)普通函數(shù)可在所定義的文件中被調(diào)用,也可在其他文件中被調(diào)用編譯器會(huì)將C語(yǔ)言源程序文件轉(zhuǎn)換為對(duì)應(yīng)平臺(tái)的機(jī)器級(jí)代碼C語(yǔ)言程序中各種語(yǔ)句(包括函數(shù)調(diào)用)對(duì)應(yīng)的機(jī)器級(jí)代碼表示將在第5章(IA-32/x86-64指令系統(tǒng))和第6章(程序的機(jī)器級(jí)表示)介紹。但是,編譯器如何對(duì)C語(yǔ)言源程序進(jìn)行分析處理和代碼轉(zhuǎn)換,需要參看編譯技術(shù)相關(guān)教材和資料。函數(shù)的作用域和生存期C程序中函數(shù)的作用域和生存期一個(gè)C程序由多個(gè)C語(yǔ)言源程序文件組成一個(gè)C源程序文件由一系列外部定義和外部聲明構(gòu)成所有函數(shù)的定義都屬于外部定義所有外部定義的對(duì)象可在整個(gè)程序中被引用函數(shù)的作用域是整個(gè)程序(可被程序中任何函數(shù)調(diào)用)函數(shù)的生存期是整個(gè)程序執(zhí)行過程(可在程序結(jié)束前任何時(shí)候被調(diào)用)每個(gè)函數(shù)對(duì)應(yīng)的目標(biāo)代碼都會(huì)占有存儲(chǔ)空間在程序執(zhí)行過程中,每個(gè)函數(shù)所占空間的位置不會(huì)發(fā)生變化,因此,函數(shù)代碼應(yīng)分配在靜態(tài)存儲(chǔ)區(qū)每個(gè)函數(shù)對(duì)應(yīng)的代碼一定唯一、只讀、不可寫、可執(zhí)行變量的作用域及其存儲(chǔ)分配C程序變量的作用域和生存期變量的值可變,因此變量需分配存儲(chǔ)空間變量的定義本質(zhì)上是告知編譯器需要給變量分配存儲(chǔ)空間變量只能有唯一的定義,也即只能有唯一的存儲(chǔ)空間編譯器根據(jù)變量的作用域和生存期進(jìn)行存儲(chǔ)空間分配變量的作用域和生存期與其存儲(chǔ)特性(靜態(tài)、全局、局部)相關(guān)變量的引用有讀(表達(dá)式中)和寫(賦值語(yǔ)句等號(hào)左邊)兩種對(duì)變量的讀和寫都是對(duì)其存儲(chǔ)空間的操作關(guān)于不同存儲(chǔ)特性變量的存儲(chǔ)空間分配,將在第6章(程序的機(jī)器級(jí)表示)和第7章(程序的鏈接)介紹變量的作用域及其存儲(chǔ)分配C程序中變量的定義全局(外部)、局部全局(外部)變量:定義在所有函數(shù)外部的變量局部變量:定義在某個(gè)函數(shù)體中的變量靜態(tài)、非靜態(tài)靜態(tài)變量:定義中加“static”的變量非靜態(tài)變量:定義中不加“static”的變量組合形成4種不同的變量非靜態(tài)全局變量、靜態(tài)全局變量非靜態(tài)局部(自動(dòng))變量、靜態(tài)局部變量C程序中外部變量聲明若在某函數(shù)種需要引用在其他文件中定義的全局變量,則需要在該函數(shù)所在的文件中給出加“extern”的外部變量聲明全局變量的作用域及其存儲(chǔ)分配非靜態(tài)全局變量簡(jiǎn)稱全局變量,出現(xiàn)在文件中所有函數(shù)定義前作用域和生存期同函數(shù)的作用域和生存期編譯器將其分配在靜態(tài)存儲(chǔ)區(qū),且可讀可寫靜態(tài)全局變量作用域僅限所在文件中定義的函數(shù),生存期為整個(gè)程序執(zhí)行過程編譯器將其分配在靜態(tài)存儲(chǔ)區(qū),且可讀可寫只有所在文件的函數(shù)可對(duì)其進(jìn)行讀寫操作不同文件中可定義相同名字的靜態(tài)全局變量,其作用域不同,被分配在不同的靜態(tài)存儲(chǔ)區(qū)靜態(tài)函數(shù)僅在其定義所在文件中被引用,可在不同的文件中定義同名函數(shù)局部變量的作用域及其存儲(chǔ)分配非靜態(tài)局部變量簡(jiǎn)稱局部變量或自動(dòng)變量,在某函數(shù)體中定義作用域?yàn)槠涠x所在的最小復(fù)合語(yǔ)句函數(shù)的形參可看成局部變量,其作用域僅為函數(shù)體每次執(zhí)行函數(shù),局部變量空間都經(jīng)歷“分配-使用-取消”過程編譯器將其分配在動(dòng)態(tài)存儲(chǔ)區(qū),且可讀可寫靜態(tài)局部變量作用域僅在所定義的函數(shù)內(nèi),生存期為整個(gè)程序執(zhí)行過程編譯器將其分配在靜態(tài)存儲(chǔ)區(qū),且可讀可寫只有定義所在函數(shù)可對(duì)其進(jìn)行讀寫操作不同函數(shù)中可定義相同名字的靜態(tài)局部變量靜態(tài)全局變量和靜態(tài)局部變量統(tǒng)稱為靜態(tài)變量(加“static”)C標(biāo)準(zhǔn)I/O庫(kù)函數(shù)用戶程序可通過調(diào)用特定的I/O函數(shù)的方式提出I/O

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論