版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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、對數(shù)據(jù)的類型進行聲明,表達式,操作數(shù)、操作符和標點符號組成的序列,表示一個計算過程 優(yōu)先級a+b*c 結合性a+b-c 求值次序(a+b)*(a-b)與編譯系統(tǒng)有關 類型轉換約定 int x=10; float y=2.0; x*y 表達式種類 算術表達式 關系和邏輯表達式 賦值表達式 逗號表達式 字位運算符表達式 操作符可重載,表達式,計算與類型 相同類型的兩個操作數(shù)運算后,其結果仍然為該類型的值 類型對計算的限制 類型具有取值范圍,超出取值范圍的值沒有意義 混合類型計算和類型轉換 轉換總是朝表達能力更強的方向,并且轉換總是逐個運算符進行 自動轉換(隱式類型轉換 coersion) 顯式轉換
5、(強制類型轉換 casting),表達式,賦值表達式 左值右值表達式 左值:可以出現(xiàn)在賦值表達式左部的表達式, 具有存放數(shù)據(jù)的空間 類型不同時,先計算右值表達式的值,再轉換為左值類型,然后賦值 算術表達式 增量和減量操作符 前增量(前減量) +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 為左值,則該逗號表達式為左值,表達式,字位運算符表達式 對整型數(shù)二進制位(bit)的操作,將整型數(shù)看作二進制序列 取反 、與 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,函數(shù),原則 函數(shù)定義不允許嵌套 先定義后使用 函數(shù)的執(zhí)行機制 建立被調用函數(shù)的??臻g 保存調用函數(shù)的運行狀態(tài)和返回地址 參數(shù)傳遞 值傳遞 (call by value) 引用傳遞 (call by reference) 將控制轉交被調函數(shù),Call by name Call by value-result,Runtime Environment,函數(shù),函數(shù)原型 遵循先定義后使用原則 自
8、由安排函數(shù)定義的位置 標準庫函數(shù)的函數(shù)原型都在頭文件(.h)中提供,用#include 指令包含這些原型文件 用戶自定義的函數(shù)必須在源代碼中說明函數(shù)原型 函數(shù)原型是一條語句 函數(shù)原型不必含有參數(shù)的名字,只需含有參數(shù)的類型 函數(shù)原型必須和函數(shù)定義在返回值類型、函數(shù)名和參數(shù)表完全一致,編譯器在遇到函數(shù)調用時,需檢查函數(shù)原型,函數(shù),函數(shù)重載 原則 一組重載函數(shù),相互間至少在參數(shù)個數(shù)、類型或順序上有所不同 返回值類型不作為區(qū)別重載函數(shù)的依據(jù) 匹配重載函數(shù)的順序 嚴格 內部轉換 用戶定義的轉換 void f(long);void f(double); f(10); ambiguous,Name mang
9、ling extern “C”,函數(shù),帶默認參數(shù)的函數(shù) 默認參數(shù)的聲明 函數(shù)原型中給出 先定義的函數(shù)中給出 默認參數(shù)的順序規(guī)定 從右到左,中間不能間斷 默認參數(shù)與函數(shù)重載 void f(int); void f(int, int=2); ambiguous,函數(shù),內聯(lián)函數(shù)inline 目的 提高程序的可讀性 提高程序的運行效率 對象 使用頻率高的小段代碼 實現(xiàn)方法 編譯系統(tǒng)將為 inline 函數(shù)創(chuàng)建一段代碼,在每次調用時,用相應的代碼替換 限制 非遞歸 由編譯系統(tǒng)控制,函數(shù),明智地運用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、函數(shù) 工程文件 外部函數(shù) 外部變量 extern,main,f1,f2,fn,cpp1,cpp2,cpp3,obj1,obj2,objn,Compiler,exe,Lib,Linker,程序結構,Static global variable static 防止名沖突 值可靠 Static function 限制使用 對函數(shù)定義的補充static Constant 缺省為 static 開放 extern,程序結構,標識符在程序中有效的范圍 程序級 外部量、外部函數(shù) 文件級 靜態(tài)函數(shù)、靜態(tài)全局量 函數(shù)級 標號、形式參數(shù)、局部量 塊級 可見性 分析在某一位置標識符的有效性 : 引用全局變量 nam
12、espace using namespce,int global;/程序級 void f() /程序級 static float f; /文件級 static void g() /文件級 void main() int x; /函數(shù)級 if (x0) float x=0; /塊級 ,多文件結構,Header File 聲明的部分 宏定義 包含指令 類型聲明 函數(shù)聲明 內聯(lián)函數(shù) 常量定義 變量聲明,編譯預處理,包含 #include “” 宏定義 define 字符串字符串 undef宏名字 帶參數(shù)的宏 條件編譯 #if#else#elif #endif#ifdef#ifndef 設定編譯器狀態(tài)
13、 #pragmawarning(disable:4101) once,數(shù)組,特征 相同數(shù)據(jù)類型 有序 連續(xù)存儲0n-1 一維數(shù)組 類型定義 函數(shù)參數(shù) 僅傳遞地址 元素個數(shù)需通過參數(shù)顯示給出,不能通過sizeof取得 字符串,數(shù)組,多維數(shù)組 定義T Ac1c2 存儲組織 參數(shù)傳遞 只能缺省第一維 降維處理,typedef T A1c2; A1 Ac1;,數(shù)組,#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 參數(shù)傳遞 union 共享存儲空間,_declspec(align(8),結構和聯(lián)合,例:定義一個能存儲100個圖形的數(shù)組變量,其中的圖形可以是:直線、矩形、圓。 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)數(shù)據(jù) 指針定義與基本操作 指針與函數(shù) 指針與數(shù)組 指針與結構 多級指針 動態(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; ?,指針與函數(shù),指針作為行參 提高傳輸效率 函數(shù)副作用 常量指針 Function Pointer 指向函數(shù)的指針,double f(int x) int g() void main() double (*fp) (int); / typedef double (*FP)(int); / FP fp; fp = f; fp = /Error ,函數(shù)指針,函數(shù)參數(shù) 編寫函數(shù),使其能計算任意一元函數(shù)在某區(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);,指針與數(shù)組,數(shù)組元素操作 下標表達式 訪問效率 數(shù)組元素的指針表示法 一維數(shù)組 多維數(shù)組,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 = /數(shù)組名表示其首元素的地址,是常量! (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,指針數(shù)組,函數(shù)main的參數(shù) 帶參數(shù)和返回值的函數(shù)main的原型為 int main(int argc, char *argv, char *env) argc: 參數(shù)個數(shù) argv: 命
28、令行參數(shù) env: 環(huán)境參數(shù)。 示例 c: copy file1 file2 操作系統(tǒng)將啟動copy程序,調用其main函數(shù), 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 = 指針變量必須初始化或賦值,否則將會導致運行時刻的嚴重錯誤,多級指針,編寫一個函數(shù),交換兩個字符串 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)產(chǎn)生、消亡 通過指向動態(tài)變量的指針變量來實現(xiàn)的 分配在程序的堆區(qū)(heap) 局部變量也是動態(tài)產(chǎn)生、消亡,但在程序運行前,編譯程序已經(jīng)知道它們的存在 動態(tài)變量與C+中的靜態(tài)(static)變量屬于不同的范疇,動態(tài)變量是程序設計中的概念(與語言無關),static是C+語言中的概念。,動態(tài)變量,動態(tài)變量的產(chǎn)生 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)變量的產(chǎn)生 庫函數(shù) 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 會去調用相應類的構造函數(shù),malloc 則否 new或malloc為動態(tài)變量申請空間時,必須在判斷申請的空間有效的情況下,才能使用,動態(tài)變量,動態(tài)變量的消亡 動態(tài)變量不會自動消亡,在程序運行期間,如果不再需要某個動態(tài)變量,應顯式地使之消
33、亡,否則將造成 memory leak 用new 產(chǎn)生的動態(tài)變量,用 delete 使之消亡; 用 malloc 產(chǎn)生的動態(tài)變量,用 free 使之消亡 delete ,cookie,動態(tài)變量的應用,數(shù)據(jù)結構 鏈表(單、雙)棧、隊列 樹、圖 結點的定義 struct NODE int content; NODE *next; ; NODE *head=NULL;,單鏈表,結點的插入 產(chǎn)生一個新結點: 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壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 超市行業(yè)營業(yè)員工作總結
- 粵語語言藝術課程設計
- 液壓泵站課課程設計
- 稅務工作總結稅收征管執(zhí)法標準化
- 醫(yī)療器械行業(yè)人才管理
- 【八年級下冊地理中圖北京版】期中真題必刷卷A-【期中真題必刷卷】(北京專用)(解析版)
- 2024年設備監(jiān)理師考試題庫附答案(典型題)
- 咖啡館店員服務總結
- 2024年設備監(jiān)理師考試題庫【考點梳理】
- 2024年美術教案:太陽花
- 35KV變電站地質勘察與施工方案
- 2024年中學科技教育工作總結樣本(4篇)
- 2025年中國社會科學院外國文學研究所專業(yè)技術人員招聘3人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 國家開放大學電大本科《理工英語3》期末試題題庫及答案1(試卷號:1377)
- 湖北省十堰市2023-2024學年高二上學期期末調研考試 物理 含答案
- 2024-2025學年廣東省第一次普通高中學業(yè)水平合格性考試物理仿真模擬卷三及答案
- 護理安全小組工作計劃
- 2025辦公室無償租賃合同范本
- 2024年12月八省八校T8聯(lián)考高三高考物理試卷試題(含答案)
- 遼寧省撫順市撫順縣2023-2024學年八年級上學期期末考試數(shù)學試卷(含解析)
- 《中國武術的起源》課件
評論
0/150
提交評論