計算機系統(tǒng)導論 課件 第二章高級語言程序_第1頁
計算機系統(tǒng)導論 課件 第二章高級語言程序_第2頁
計算機系統(tǒng)導論 課件 第二章高級語言程序_第3頁
計算機系統(tǒng)導論 課件 第二章高級語言程序_第4頁
計算機系統(tǒng)導論 課件 第二章高級語言程序_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第二章高級語言程序

變量和常量及其類型

表達式及運算符

控制結構和函數(shù)調用高級語言程序主要教學目標了解C語言發(fā)展概述,以及相應的C語言標準規(guī)范了解C程序中變量、常量的定義和引用之間的關系理解C程序中變量、常量的類型與機器級表示之間的關系理解編譯器對C語言表達式的轉換處理任務理解編譯器對控制結構語句和函數(shù)調用的基本處理任務理解變量的作用域與變量的存儲分配之間的關系從C程序的基本要素出發(fā),引出后續(xù)各個章節(jié)的內容高級語言程序本章內容包括:變量和常量及其類型C程序中的變量及其類型C程序中的常量及其類型表達式及運算符表達式中的運算符C語言中的基本運算控制結構和函數(shù)調用C語言中的控制結構語句C語言中的函數(shù)調用變量的作用域與存儲分配C標準I/O庫函數(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ù)表達式和運算符變量循環(huán)結構語句函數(shù)調用標準I/O庫函數(shù)調用C語言概述本課程基于“IA-32/x86-64+Linux+GCC+C語言”介紹計算機系統(tǒng)基礎內容高級語言程序:C語言程序機器級代碼:IA-32/x86-64架構操作系統(tǒng):Linux編譯器及開發(fā)工具:GCCC語言(起源于貝爾實驗室)1970年,肯·湯普森用B語言寫了第一個UNIX操作系統(tǒng)1972年,丹尼斯·里奇在B語言基礎上設計了C語言1983年,加尼·斯楚士舒普把C語言又擴展成C++C標準:ANSIC(ISOC90)、ISOC99C語言特點簡單靈活、抽象程度低(接近硬件)、安全性和規(guī)范性較弱C語言中的變量變量的特點表示一個可變化的“值”——必須分配一個存儲空間只能有一個唯一的“定義”——所在存儲空間的首地址應先定義后引用

——可在表達式中或賦值語句等號左邊引用變量的定義必須給出數(shù)據(jù)類型和名字,必要時給出存儲類型(如static)變量定義所在位置和存儲類型不同,其作用域和生存期不同編譯器根據(jù)不同的作用域將變量分配在不同的存儲空間中變量的數(shù)據(jù)類型簡單數(shù)據(jù)類型有無符號整型、帶符號整型、浮點類型、指針型C語言標準規(guī)定了每種數(shù)據(jù)類型的最小取值范圍復雜數(shù)據(jù)類型有數(shù)組(array)、結構(struct)、聯(lián)合(union)等關于變量的作用域及所分配存儲空間的相關內容參見第6章C語言中的常量三種類型的常量字面量(字面值)#define定義的常量符號

const定義的常量名

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

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

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

&&

;|對

‖;……運算過程不同:按位對

整體結果類型不同:位串對

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

若高位移出的是1,則左移時發(fā)生溢出帶符號整數(shù):算術左移、算術右移左移:高位移出,低位補0。可能溢出!

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

無符號數(shù):0擴展,前面補0帶符號整數(shù):符號擴展,前面補符截斷:長轉短

丟棄高位,可能發(fā)生“溢出”例1(擴展操作):在大端機上輸出si,usi,i,ui的十進制和十六進制值是什么?shortsi=-32768;unsignedshortusi=si;inti=si;unsingnedui=usi;si=-327688000usi=327688000i=-32768FFFF8000ui=3276800008000例2(截斷操作):i和j是否相等?inti=32768;shortsi=(short)i;intj=si;不相等!i=3276800008000si=-327688000j=-32768FFFF8000原因:對i截斷時發(fā)生了溢出,即:32768截斷為16位數(shù)時,因其超出16位能表示的最大值,故無法截斷為正確的16位數(shù)!C語言標準規(guī)定,長數(shù)轉換為短數(shù)的結果是未定義的(UB)沒有規(guī)定編譯器必須報錯C語言中的控制結構為描述操作執(zhí)行過程,編程語言會提供一套描述機制,這種機制稱為控制結構不同的控制結構描述了程序中相關操作之間不同的執(zhí)行順序順序執(zhí)行、選擇執(zhí)行、循環(huán)執(zhí)行C語言中的控制結構流程控制語句編譯器必須將各類流程控制語句轉換為機器級代碼關于不同控制結構語句對應的機器級代碼在第6章介紹C語言中的函數(shù)調用模塊化程序設計使用入口參數(shù)和返回參數(shù)將多個子程序分離C語言中的函數(shù)調用實現(xiàn)了程序的模塊化設計C語言中的函數(shù)調用一個C程序由若干函數(shù)組成,從main()函數(shù)開始函數(shù)之間可以嵌套調用,也可以遞歸調用函數(shù)必須先定義后引用函數(shù)的定義和原型聲明定義用于構建一個對象,意味著在編譯器轉換得到的機器級代碼中需要為這個對象分配存儲空間聲明說明存在相應對象,被聲明的對象一定存在唯一的定義若聲明的對象無定義,則該聲明無效,會出現(xiàn)鏈接錯誤C語言中的函數(shù)調用函數(shù)的原型聲明函數(shù)必須先定義后引用若函數(shù)在被引用前未定義,則須先給出其原型聲明intadd(intx,inty){ returnx+y;}intmain(){ int t1=125;intt2=80; int sum=add(t1,t2); returnsum;}先定義后引用定義引用C語言中的函數(shù)調用函數(shù)的原型聲明若函數(shù)在被引用前未定義,則須先給出其原型聲明引用前沒有定義的情況下,先聲明后使用,被引用的函數(shù)定義在其他模塊,或在調用(引用)函數(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語言中的函數(shù)調用函數(shù)定義函數(shù)定義由函數(shù)頭部和函數(shù)體兩部分組成函數(shù)體中定義的變量為局部變量(有靜態(tài)局部變量和自動變量)函數(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ù)體兩個函數(shù)體中都定義了局部變量result,不加“static”表示非靜態(tài)局部變量,即為自動(auto)變量形式參數(shù)列表C語言中的函數(shù)調用函數(shù)調用機制函數(shù)調用時,執(zhí)行流程將從調用函數(shù)轉到被調用函數(shù)轉入執(zhí)行前,入口參數(shù)(實參)應傳遞給形式參數(shù)實參必須與形參類型一致或能轉換為形參類型數(shù)據(jù)返回時將返回值傳遞給調用函數(shù)返回參數(shù)類型與函數(shù)定義類型一致右邊例子中存在4次類型轉換5.6轉換為5后傳遞給形參r5轉換為浮點類型計算2*3.14*r計算結果31.4轉換為int型數(shù)31將int型數(shù)31轉換為float型后,再賦給變量x實參intfunct(intr){return2*3.14*r;}intmain(){floatx=funct(5.6);……}形參C語言中的函數(shù)調用C程序的執(zhí)行流程和主函數(shù)main()一個完整的C程序中一定有且僅有一個main()函數(shù)main()是執(zhí)行起點,也定義了完整的執(zhí)行過程。若把函數(shù)調用關系用一棵樹表示,則main()為樹根main()返回類型為int,無“return0;”時自動產生返回值0main()稱為主函數(shù),出main()外的函數(shù)稱為普通函數(shù)普通函數(shù)可在所定義的文件中被調用,也可在其他文件中被調用編譯器會將C語言源程序文件轉換為對應平臺的機器級代碼C語言程序中各種語句(包括函數(shù)調用)對應的機器級代碼表示將在第5章(IA-32/x86-64指令系統(tǒng))和第6章(程序的機器級表示)介紹。但是,編譯器如何對C語言源程序進行分析處理和代碼轉換,需要參看編譯技術相關教材和資料。函數(shù)的作用域和生存期C程序中函數(shù)的作用域和生存期一個C程序由多個C語言源程序文件組成一個C源程序文件由一系列外部定義和外部聲明構成所有函數(shù)的定義都屬于外部定義所有外部定義的對象可在整個程序中被引用函數(shù)的作用域是整個程序(可被程序中任何函數(shù)調用)函數(shù)的生存期是整個程序執(zhí)行過程(可在程序結束前任何時候被調用)每個函數(shù)對應的目標代碼都會占有存儲空間在程序執(zhí)行過程中,每個函數(shù)所占空間的位置不會發(fā)生變化,因此,函數(shù)代碼應分配在靜態(tài)存儲區(qū)每個函數(shù)對應的代碼一定唯一、只讀、不可寫、可執(zhí)行變量的作用域及其存儲分配C程序變量的作用域和生存期變量的值可變,因此變量需分配存儲空間變量的定義本質上是告知編譯器需要給變量分配存儲空間變量只能有唯一的定義,也即只能有唯一的存儲空間編譯器根據(jù)變量的作用域和生存期進行存儲空間分配變量的作用域和生存期與其存儲特性(靜態(tài)、全局、局部)相關變量的引用有讀(表達式中)和寫(賦值語句等號左邊)兩種對變量的讀和寫都是對其存儲空間的操作關于不同存儲特性變量的存儲空間分配,將在第6章(程序的機器級表示)和第7章(程序的鏈接)介紹變量的作用域及其存儲分配C程序中變量的定義全局(外部)、局部全局(外部)變量:定義在所有函數(shù)外部的變量局部變量:定義在某個函數(shù)體中的變量靜態(tài)、非靜態(tài)靜態(tài)變量:定義中加“static”的變量非靜態(tài)變量:定義中不加“static”的變量組合形成4種不同的變量非靜態(tài)全局變量、靜態(tài)全局變量非靜態(tài)局部(自動)變量、靜態(tài)局部變量C程序中外部變量聲明若在某函數(shù)種需要引用在其他文件中定義的全局變量,則需要在該函數(shù)所在的文件中給出加“extern”的外部變量聲明全局變量的作用域及其存儲分配非靜態(tài)全局變量簡稱全局變量,出現(xiàn)在文件中所有函數(shù)定義前作用域和生存期同函數(shù)的作用域和生存期編譯器將其分配在靜態(tài)存儲區(qū),且可讀可寫靜態(tài)全局變量作用域僅限所在文件中定義的函數(shù),生存期為整個程序執(zhí)行過程編譯器將其分配在靜態(tài)存儲區(qū),且可讀可寫只有所在文件的函數(shù)可對其進行讀寫操作不同文件中可定義相同名字的靜態(tài)全局變量,其作用域不同,被分配在不同的靜態(tài)存儲區(qū)靜態(tài)函數(shù)僅在其定義所在文件中被引用,可在不同的文件中定義同名函數(shù)局部變量的作用域及其存儲分配非靜態(tài)局部變量簡稱局部變量或自動變量,在某函數(shù)體中定義作用域為其定義所在的最小復合語句函數(shù)的形參可看成局部變量,其作用域僅為函數(shù)體每次執(zhí)行函數(shù),局部變量空間都經歷“分配-使用-取消”過程編譯器將其分配在動態(tài)存儲區(qū),且可讀可寫靜態(tài)局部變量作用域僅在所定義的函數(shù)內,生存期為整個程序執(zhí)行過程編譯器將其分配在靜態(tài)存儲區(qū),且可讀可寫只有定義所在函數(shù)可對其進行讀寫操作不同函數(shù)中可定義相同名字的靜態(tài)局部變量靜態(tài)全局變量和靜態(tài)局部變量統(tǒng)稱為靜態(tài)變量(加“static”)C標準I/O庫函數(shù)用戶程序可通過調用特定的I/O函數(shù)的方式提出I/O

溫馨提示

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

評論

0/150

提交評論