




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、C+程序設計(part 1),南京大學軟件學院鄭滔 Tel: 506 Room: 623,Ole-Johan Dahl Kristen Nygaard,Norwegian computer scientist Turing Award in 2001 http:/heim.ifi.uio.no/olejohan/ http:/heim.ifi.uio.no/kristen/,Father of Simula67 Father of OO programming,E.W.Dijkstra Niklaus Wirth,Swiss computer scientist Turing Award in
2、1994 http:/www.inf.ethz.ch/personal/wirth/,Design PASCAL、Modula2、Oberon,Netherland computer scientist Chair of Computer Sciences at the University of Texas at Austin from 1984 until 2000. Turing Award in1972 /users/EWD/,“A Case against the GO TO Statement” Algol 68,Dennis Ritc
3、hie Ken Thompson,American computer scientist Turing Award in 1983 (工程師獲獎) http:/cm.bell- http:/plan9.bell-,Father of C Co-inventing Unix,Bjarne Stroustrup,Ph.D, University of Aarhus, Denmark College of Engineering Chair in Computer Science Professor at Texas A typedef int INT ; C+是強類型語言 要求程序設計者在使用之前
4、對數據的類型進行聲明,表達式,操作數、操作符和標點符號組成的序列,表示一個計算過程 優(yōu)先級a+b*c 結合性a+b-c 求值次序(a+b)*(a-b)與編譯系統(tǒng)有關 類型轉換約定 int x=10; float y=2.0; x*y 表達式種類 算術表達式 關系和邏輯表達式 賦值表達式 逗號表達式 字位運算符表達式 操作符可重載,表達式,計算與類型 相同類型的兩個操作數運算后,其結果仍然為該類型的值 類型對計算的限制 類型具有取值范圍,超出取值范圍的值沒有意義 混合類型計算和類型轉換 轉換總是朝表達能力更強的方向,并且轉換總是逐個運算符進行 自動轉換(隱式類型轉換 coersion) 顯式轉換
5、(強制類型轉換 casting),表達式,賦值表達式 左值右值表達式 左值:可以出現(xiàn)在賦值表達式左部的表達式, 具有存放數據的空間 類型不同時,先計算右值表達式的值,再轉換為左值類型,然后賦值 算術表達式 增量和減量操作符 前增量(前減量) +a ( -a ) 前增量的結果是左值 后增量(后減量) a+ ( a- ) 提高編譯結果的執(zhí)行效率,表達式,條件運算符表達式 ? : 唯一的三目運算符 只計算一個運算分量 如果 和的值類型相同,且均為左值,則該條件運算符表達式為左值表達式 可嵌套 sign(x) x 0? 1: x = 0? 0 : -1 就近原則,表達式,逗號表達式 , 的值作為該逗號
6、表達式的值 int a, b, c; d = (a = 1, b = a+2, c = b+3); cout 為左值,則該逗號表達式為左值,表達式,字位運算符表達式 對整型數二進制位(bit)的操作,將整型數看作二進制序列 取反 、與 c = a*b + +b; 求值次序使交換率失去作用 int a=3; c = a+ * +a; 副作用的危害 破壞了可移植性 降低了程序的可讀性 消除副作用,語句,表達式語句 IO語句 cin、cout iostream.h 、可重載 控制流語句 順序、選擇、重復,iostream,stdio.h,語句,switch switch 后必須是整型表達式,case
7、 后必須是整型常量表達式 值各不相同 各個case(包括default)出現(xiàn)的次序可以任意 case 僅起標號作用,不改變執(zhí)行順序 break 多個case可以公用一組語句 通??梢院蚷f語句配合使用,enum,函數,原則 函數定義不允許嵌套 先定義后使用 函數的執(zhí)行機制 建立被調用函數的棧空間 保存調用函數的運行狀態(tài)和返回地址 參數傳遞 值傳遞 (call by value) 引用傳遞 (call by reference) 將控制轉交被調函數,Call by name Call by value-result,Runtime Environment,函數,函數原型 遵循先定義后使用原則 自
8、由安排函數定義的位置 標準庫函數的函數原型都在頭文件(.h)中提供,用#include 指令包含這些原型文件 用戶自定義的函數必須在源代碼中說明函數原型 函數原型是一條語句 函數原型不必含有參數的名字,只需含有參數的類型 函數原型必須和函數定義在返回值類型、函數名和參數表完全一致,編譯器在遇到函數調用時,需檢查函數原型,函數,函數重載 原則 一組重載函數,相互間至少在參數個數、類型或順序上有所不同 返回值類型不作為區(qū)別重載函數的依據 匹配重載函數的順序 嚴格 內部轉換 用戶定義的轉換 void f(long);void f(double); f(10); ambiguous,Name mang
9、ling extern “C”,函數,帶默認參數的函數 默認參數的聲明 函數原型中給出 先定義的函數中給出 默認參數的順序規(guī)定 從右到左,中間不能間斷 默認參數與函數重載 void f(int); void f(int, int=2); ambiguous,函數,內聯(lián)函數inline 目的 提高程序的可讀性 提高程序的運行效率 對象 使用頻率高的小段代碼 實現(xiàn)方法 編譯系統(tǒng)將為 inline 函數創(chuàng)建一段代碼,在每次調用時,用相應的代碼替換 限制 非遞歸 由編譯系統(tǒng)控制,函數,明智地運用inlining(Use inlining judiciously) 缺點 增大目標代碼(object co
10、de) 病態(tài)的換頁(thrashing) 降低指令快取裝置的命中率(instruction cache hit rate) 只是對編譯系統(tǒng)的提示 Big/complex/ Function pointer Compiler (outlined) static function recompile/link vs rebuild,作用域與生命期,程序的局部性原則 程序的內存結構 Code、Global data、Stack、Heap Scope 全局變量 static 局部變量 靜態(tài)局部變量 static(生命期),程序結構,程序結構 邏輯結構 物理結構 多個源文件組成 只能其中一個 文件含有主
11、函數 工程文件 外部函數 外部變量 extern,main,f1,f2,fn,cpp1,cpp2,cpp3,obj1,obj2,objn,Compiler,exe,Lib,Linker,程序結構,Static global variable static 防止名沖突 值可靠 Static function 限制使用 對函數定義的補充static Constant 缺省為 static 開放 extern,程序結構,標識符在程序中有效的范圍 程序級 外部量、外部函數 文件級 靜態(tài)函數、靜態(tài)全局量 函數級 標號、形式參數、局部量 塊級 可見性 分析在某一位置標識符的有效性 : 引用全局變量 nam
12、espace using namespce,int global;/程序級 void f() /程序級 static float f; /文件級 static void g() /文件級 void main() int x; /函數級 if (x0) float x=0; /塊級 ,多文件結構,Header File 聲明的部分 宏定義 包含指令 類型聲明 函數聲明 內聯(lián)函數 常量定義 變量聲明,編譯預處理,包含 #include “” 宏定義 define 字符串字符串 undef宏名字 帶參數的宏 條件編譯 #if#else#elif #endif#ifdef#ifndef 設定編譯器狀態(tài)
13、 #pragmawarning(disable:4101) once,數組,特征 相同數據類型 有序 連續(xù)存儲0n-1 一維數組 類型定義 函數參數 僅傳遞地址 元素個數需通過參數顯示給出,不能通過sizeof取得 字符串,數組,多維數組 定義T Ac1c2 存儲組織 參數傳遞 只能缺省第一維 降維處理,typedef T A1c2; A1 Ac1;,數組,#include int maximum(int grade, int num) int max = 0; for (int k=0;k max) max = gradek; return max; void main() int A24
14、= 68,69,70,71 , 85,86,87,89; cout “the max grade is” maximum( ); ,sizeof(A)/sizeof(A00),maximum(,A0,2*4,結構和聯(lián)合,struct 賦值同類型 align 參數傳遞 union 共享存儲空間,_declspec(align(8),結構和聯(lián)合,例:定義一個能存儲100個圖形的數組變量,其中的圖形可以是:直線、矩形、圓。 FIGURE figures100; struct Line double x1, x2, y1, y2; struct Rectangle double left, top,
15、right, bottom; struct Circle double x, y, r; ,enum FIGURE_TYPE LINE, RECTANGLE, CIRCLE; struct Line struct Rectangle FIGURE_TYPE t ; FIGURE_TYPE t; double x1, x2, y1, y2; double left, top, right, bottom; ; ; struct Circle FIGURE_TYPE t; double x, y, r; ; union FIGURE FIGURE_TYPE t; Line line; Rectan
16、gle rect; Circle circle; FIGURE figures100;,結構和聯(lián)合,void draw(FIGURE figure)多態(tài)性 switch ( figure.t ) case LINE: draw_line(figuresi.line); break; case RECTANGLE: draw_rectangle(figuresi.rect); break; case CIRCLE:draw_circle(figuresi.circle); break; void main() InputF( figures, 100 ); for (int i=0;i100;i
17、+) draw(figuresi); ,void input (Figure fig, int size) int t; for (int k=0; k t; switch (t) case LINE: figk.type = LINE; cin figk.line.x1 figi.line.y1 figk.line.x2 figi.line.y2; break; case RECTANGLE: case CIRCLE: . ,指針,處理地址信息、動態(tài)數據 指針定義與基本操作 指針與函數 指針與數組 指針與結構 多級指針 動態(tài)變量,指針定義與基本操作,定義 格式 * int *p; /p為一個
18、指針變量 語義 指針變量的值是另外一個變量的內存地址。 如:上述指針變量 p 的值為某一整型變量的內存地址。 說明 當在一個定義(或聲明)中定義(或聲明)多個指針變量時,每個指針變量前都要有* int *p,*q; /p和q均為指針變量 int *p, q; /p為指針變量,q為整型變量,指針定義與基本操作,也可以先用 typedef 定義一個指針類型,然后再用該指針類型定義指針變量,如: typedef int* Pointer; Pointer p,q; / p和q均為指針變量 取地址操作符(,9,x,0X5A12,p,0X7B77,0X5A12,1000,指針定義與基本操作,當一個指針變
19、量的值為另一個變量的地址時,通常也說成:該指針指向另一個變量,如:指針變量p指向整型變量x,可用下面的圖示法表示: Pointer literal (0 / NULL) 不指向任何對象 指針變量的初始化 區(qū)別 * 的三種用途 乘法運算符 指針定義(或聲明)符 取指針所指向的值(間接訪問),p,1000,x,指針定義與基本操作,指針的運算 賦值 對于一個指針變量,可以把一個同類型的指針值賦給它。 int x; double d; int *p, *q; p = ,指針定義與基本操作,加上或減去一個整型值 一個指針值可以與一個整型值進行加或減運算,結果為同類型的指針值。 int x; int *p
20、; p = p + 1; p = /q的值加8 ( sizeof(double) ),指針定義與基本操作,同類型的指針值相減 同類型的指針值可以相減,結果為整型值。 int *p, *q; int offset; offset = p - q; int a10; int *p, *q,offset; p = /結果值為 3,指針定義與基本操作,兩個同類型的指針值比較 兩個同類型的指針值可以進行等于(=)和不等于(!=)比較,一般不進行大于(,=)和小于(,=)比較。 指針值的輸出 int x=1; int *p= /輸出p指向的字符,即:A cout (void *)p /輸出p的值,指針定義
21、與基本操作,void * 只存放地址信息 void *p; 任何其它類型的指針均可以賦值給void指針 void *any_pointer; int x; double y; any_pointer = 不能進行指針運算和間接引用(*),若要進行指針運算或間接引用,必須作強制類型轉換。 *any_pointer /error *(int *)any_pointer) /OK *(double *)any_pointer) /OK,指針定義與基本操作,例:將某指針所指向的一塊內存清零。 void memset ( void *pointer, unsigned size) char *p = (
22、char *)pointer; for (int k=0;ksize;k+) *p+ = 0; void memset(void *, int, unsigned); void memcpy(void *, void *, unsigned size);,指針定義與基本操作,常量指針與指針常量 常量指針const * const int x=0; int y; const int *p; /p為指向常量的指針(常量指針) int *q; p = /OK! Why?,constant,P,variable,x(常量),const_cast,指針定義與基本操作,指針常量 * const 必須在定義
23、時初始化 int x, y; int * const p = /Ok,variable,P(常量),constant,x,const int * const p; ?,指針與函數,指針作為行參 提高傳輸效率 函數副作用 常量指針 Function Pointer 指向函數的指針,double f(int x) int g() void main() double (*fp) (int); / typedef double (*FP)(int); / FP fp; fp = f; fp = /Error ,函數指針,函數參數 編寫函數,使其能計算任意一元函數在某區(qū)間上的定積分 #include
24、double integrate(double (*f)(double),double a, double b) (*f)(x), a , b, double my_func(double x) void main() integrate(sin,0,1); integrate(cos,1,2); integrate(my_func,1,10); ,示例,sort,int scompare(const void *elem1, const void *elem2) TStudent *p1 = (TStudent *)elem1; TStudent *p2 = (TStudent *)elem
25、2; return strcmp(p1-name,p2-name); ,void MySort(void *base, unsigned num, unsigned width, int (*compare)(const void *elem1, const void *elem2) char *A = (char *)base; char *tmp = (char *)malloc(width); for (unsigned i=1;i0) /Aj Aj+1) memcpy(tmp,A+j*width,width); /int tmp = Aj; memcpy(A+j*width, A+(j
26、+1)*width,width);/Aj = Aj+1; memcpy(A+(j+1)*width,tmp,width); /Aj+1 = tmp; free(tmp); ,TStudent student = ; int num = sizeof(student)/sizeof(student0); int width = sizeof(student0); MySort(student,num,width,icompare);,指針與數組,數組元素操作 下標表達式 訪問效率 數組元素的指針表示法 一維數組 多維數組,int b2010; / typedef int A10; A b20;
27、int *q; q = bij *(*(b+i)+j) *(*(p+i)+j) pij,int a10; int *p; int i; p = /數組名表示其首元素的地址,是常量! (int *const) ai *(a+i) *(p+i) pi char s28 = “C+”, “PASCAL”, “FORTRAN”;,s1,C + + 0,P A S C A L 0,F O R T R A N 0,s2,指針數組,函數main的參數 帶參數和返回值的函數main的原型為 int main(int argc, char *argv, char *env) argc: 參數個數 argv: 命
28、令行參數 env: 環(huán)境參數。 示例 c: copy file1 file2 操作系統(tǒng)將啟動copy程序,調用其main函數, argc : 3 argv: copy、 file1、 file2 env:,#include #include #include void MyFormat(char *lpszFormat, .) va_list marker; va_start(marker,lpszFormat); for (int i=0;i4;i+) cout va_arg(marker,double) endl; va_end(marker); void main() MyFormat(
29、“test %f %f %f %f test_end,1.1,2.2,3.3,4.4); ,/platform : x86 typedef char * va_list; #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) /pp為指針變量,指向另一個指針 /變量(int *) int x = 2, y = 8; int *p p = 指針變量必須初始化或賦值,否則將會導致運行時刻的嚴重錯誤,多級指針,編寫一個函數,交換兩個字符串 void swap(char *p1, char *p2) char *tmp = *p1; *p1 = *
30、p2; *p2 = tmp; void main() char p18 ; strcpy(p2, abcd“); char p28 ; strcpy(p2, 1234“); cout p1 p2 endl; swap( ,動態(tài)變量,動態(tài)變量 編譯時刻無法確定 在程序運行時刻,動態(tài)產生、消亡 通過指向動態(tài)變量的指針變量來實現(xiàn)的 分配在程序的堆區(qū)(heap) 局部變量也是動態(tài)產生、消亡,但在程序運行前,編譯程序已經知道它們的存在 動態(tài)變量與C+中的靜態(tài)(static)變量屬于不同的范疇,動態(tài)變量是程序設計中的概念(與語言無關),static是C+語言中的概念。,動態(tài)變量,動態(tài)變量的產生 new n
31、ew ,int *p = new int10; int (*p2)5 = (int (*)5)p; for (int i=0;i10;i+) pi = i+1; for (int j=0;j2;j+) for (int k=0;k5;k+) cout p2jk ; cout endl; ,typedef int i5Array 5; void main() i5Array *p = new i5Array 2; for (int j=0;j2;j+) for (int k=0;k5;k+) pjk = (j*5)+(k+1); ,動態(tài)變量,動態(tài)變量的產生 庫函數 malloc void *ma
32、lloc(unsigned int size) int *p,*q; p = (int *)malloc(sizeof(int); /new int q = (int *)malloc(sizeof(int)*20); /new int20 new與malloc的區(qū)別 new自動返回相應類型的指針,malloc 要作強制類型轉換。 如果創(chuàng)建的是動態(tài)對象,new 會去調用相應類的構造函數,malloc 則否 new或malloc為動態(tài)變量申請空間時,必須在判斷申請的空間有效的情況下,才能使用,動態(tài)變量,動態(tài)變量的消亡 動態(tài)變量不會自動消亡,在程序運行期間,如果不再需要某個動態(tài)變量,應顯式地使之消
33、亡,否則將造成 memory leak 用new 產生的動態(tài)變量,用 delete 使之消亡; 用 malloc 產生的動態(tài)變量,用 free 使之消亡 delete ,cookie,動態(tài)變量的應用,數據結構 鏈表(單、雙)棧、隊列 樹、圖 結點的定義 struct NODE int content; NODE *next; ; NODE *head=NULL;,單鏈表,結點的插入 產生一個新結點: NODE *p = new NODE; p-content = some_int_value; p-next = NULL; 如果鏈表為空 head = p; 插在表頭 p-next = head; head = p;,單鏈表,如果插在表尾 NODE *q = head; while (q-next ) q = q-next; q-next = p; 插在鏈表中某一個結點(a)的后面 NODE *q = head; while (q ,單鏈表,如果插在鏈表中某一個結點(a)的前面,則: NODE *q1=NULL, *q2=head; while (q2 ,guard node,單鏈表,結點的刪除 (假設要刪除的結點的值為a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 陜西師范大學《中學體育教材教法》2023-2024學年第一學期期末試卷
- SCI論文寫作與投稿 第2版-課件 7-SCI論文摘要寫作
- 陜西理工大學《藝術素養(yǎng)拓展(美術一)》2023-2024學年第二學期期末試卷
- 陜西省商洛市第3中學2025屆高中畢業(yè)班第二次模擬考試語文試題含解析
- 陜西省度西安中學2024-2025學年3月高三線上自我檢測試題英語試題含解析
- 陜西省渭南市韓城市2024-2025學年高三下學期第二次月考試題生物試題含解析
- 陜西省西安交通大學附中2025屆高中畢業(yè)班綜合測試(二)歷史試題含解析
- 陜西省西安市蓮湖區(qū)七十中2025屆高三下學期期中聯(lián)考物理試題(創(chuàng)新班)試題含解析
- 扁腺雙切護理
- 小學生舌尖上的浪費教育
- 信訪工作條例應知應會考試題庫300題(含答案)
- 工商業(yè)分布式光伏屋面勘察要點
- 2022教學能力大賽《智能網聯(lián)汽車傳感器測試與裝調》實施報告
- 商務會客廳項目策劃書
- 2024年全球電動自行車銷量飆升
- 產業(yè)工人安全培訓考試附有答案
- 鉤蟲病護理課件
- 加油機維修保養(yǎng)記錄表
- 新視野大學英語(第四版)讀寫教程4(思政智慧版)課件 Unit1 Urban development Section A
- 形勢與政策(吉林大學)智慧樹知到課后章節(jié)答案2023年下吉林大學
- 23秋國家開放大學《民法學(2)》形考任務1-4參考答案
評論
0/150
提交評論