E7ABA0名詞的空間域時(shí)間域和物理存儲(chǔ)位置課件_第1頁
E7ABA0名詞的空間域時(shí)間域和物理存儲(chǔ)位置課件_第2頁
E7ABA0名詞的空間域時(shí)間域和物理存儲(chǔ)位置課件_第3頁
E7ABA0名詞的空間域時(shí)間域和物理存儲(chǔ)位置課件_第4頁
E7ABA0名詞的空間域時(shí)間域和物理存儲(chǔ)位置課件_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

空間域:一個(gè)類型或量值,從程序的什么位置到什么位置是有效的,是可以引用的,是占據(jù)內(nèi)存的。時(shí)間域:一個(gè)類型或量值,在程序執(zhí)行過程中,從什么時(shí)刻開始到什么時(shí)刻是占據(jù)內(nèi)存的。第6章名詞的空間域、時(shí)間域和物理存儲(chǔ)位置空間域:一個(gè)類型或量值,從程序的什么位置到什么位置是有效的,名詞的空間域和時(shí)間域不完全一致。有空間域的類型或量值,一定有時(shí)間域。即在程序的某位置可以訪問的類型或量值,此時(shí)一定占據(jù)內(nèi)存;有時(shí)間域的類型或量值,不一定有空間域。即有的時(shí)候,程序執(zhí)行到某個(gè)位置,某個(gè)類型或量值雖然占據(jù)內(nèi)存,但無法訪問,即在該位置不可見。名詞的空間域和時(shí)間域不完全一致。6.1C/C++程序的邏輯結(jié)構(gòu)程序從小到大可分為如下邏輯單位:語句(statement):分號(hào)結(jié)束2.模塊(block): 一對(duì)花括號(hào)括起的若干語句。3.嵌套模塊: 多對(duì)花括號(hào)的嵌套。6.1C/C++程序的邏輯結(jié)構(gòu)程序從小到大可分為如下邏輯單4.文件(file): 程序的存盤單位。文件中通常包含多個(gè)模塊(或嵌套模塊),每個(gè)模塊內(nèi)包含多個(gè)語句。5.工程(project): 工程是功能單位,是對(duì)多個(gè)文件進(jìn)行組織和管理的框架。同一個(gè)工程內(nèi)的文件之間可以交換數(shù)據(jù),共享函數(shù)。6.工作區(qū)(workspace): 工作區(qū)是VC++最大的開發(fā)單位,是對(duì)多個(gè)工程進(jìn)行組織和管理的框架。一個(gè)工作區(qū)內(nèi)的多個(gè)工程應(yīng)該是相關(guān)的。不同工程間可以共享文件。4.文件(file):圖6.1C/C++程序邏輯結(jié)構(gòu)圖6.1C/C++程序邏輯結(jié)構(gòu)6.2名詞性的類型和量值在各邏輯結(jié)構(gòu)上的空間域6.2.1模塊域模塊{}是空間作用域的最小范圍。缺省情況下,定義在模塊內(nèi)(一對(duì)花括號(hào)內(nèi))的類型和量值,其有效范圍是從定義位置到本模塊結(jié)束。出本模塊右花括號(hào)后,該類型或量值因?yàn)獒尫艃?nèi)存空間而失效,無法訪問。6.2名詞性的類型和量值在各邏輯結(jié)構(gòu)上的空間域6.2.1模例6.1量值模塊作用域的驗(yàn)證#include<stdio.h>intfun(intx)voidmain(){ inta=10; intb; printf("a=%d\n",a);

b=fun(a);

printf("a=%d,b=%d\n",a,b);}調(diào)用fun函數(shù),a(10)為實(shí)參fun函數(shù)的聲明intfun(intx){ inta=20;

printf("a=%d,x=%d\n",a,x); returna+x;}fun內(nèi)定義的a只在fun內(nèi)有效返回a+x的值(20+10)例6.1量值模塊作用域的驗(yàn)證調(diào)用fun函數(shù),a(10)為a=10a=20,x=10a=10,b=30Pressanykeytocontinuemain()中的輸出fun()中的輸出main()中的輸出a=10main()中的輸出fun()中的輸出main()例6.1量值模塊作用域的驗(yàn)證#include<stdio.h>intfun(intx)voidmain(){ inta=10; intb; printf("a=%d\n",a);

b=fun(a);

printf("a=%d,b=%d\n",a,b);

printf(“x=%d\n",x);}調(diào)用fun函數(shù),a(10)為實(shí)參fun函數(shù)的聲明編譯出錯(cuò):errorC2065:'x':undeclaredidentifierintfun(intx){ inta=20;

printf("a=%d,x=%d\n",a,x);

printf("b=%d\n",b); returna+x;}fun內(nèi)定義的a只在fun內(nèi)有效返回a+x的值(20+10)編譯出錯(cuò):errorC2065:'b':undeclaredidentifier例6.1量值模塊作用域的驗(yàn)證調(diào)用fun函數(shù),a(10)為E7ABA0名詞的空間域時(shí)間域和物理存儲(chǔ)位置課件例6.2類型模塊作用域的驗(yàn)證#include<stdio.h>Personfun();Personfun(){ structPerson { intid; charname[10]; }ZS={1,"張三"}; returnZS;}voidmain(){ PersonLiSi;

LiSi=fun();}fun內(nèi)定義的類型Person,只在fun內(nèi)有效在main函數(shù)內(nèi)聲明一個(gè)在fun函數(shù)內(nèi)定義的Person類型的變量LiSi,編譯出錯(cuò)聲明Person類型的變量ZS,并賦值例6.2類型模塊作用域的驗(yàn)證fun內(nèi)定義的類型Perso例6.2類型模塊作用域的驗(yàn)證#include<stdio.h>structPerson { intid; charname[10]; };Personfun();voidmain(){ PersonLiSi; LiSi=fun(); printf("id=%d\n",LiSi.id); printf("name=%s\n",LiS);}Personfun(){ PersonZS={1,"張三"}; returnZS;}id=1name=張三Pressanykeytocontinue例6.2類型模塊作用域的驗(yàn)證id=16.2.2嵌套模塊的層域當(dāng)一個(gè)模塊內(nèi)嵌套另一個(gè)模塊時(shí),定義在內(nèi)層模塊的類型和量值的空域就是內(nèi)層模塊;定義在外層模塊內(nèi)的類型和量值的空域是外層模塊,當(dāng)然涵蓋內(nèi)存模塊,即在內(nèi)層模塊內(nèi)可以引用定義在外層模塊內(nèi)的類型和量值。當(dāng)內(nèi)層模塊內(nèi)定義了和外層模塊內(nèi)同名的類型和量值時(shí),內(nèi)層的類型和量值覆蓋了外層模塊的同名類型和量值,導(dǎo)致只能引用內(nèi)層中定義的部分。6.2.2嵌套模塊的層域例6.3嵌套模塊中的同名類型或量值的空間域#include<stdio.h>voidmain(){

structPerson { intid; charname[10]; };

structDate { intyear; intmonth; intday; };main函數(shù)內(nèi)(外層模塊)定義的Person類型main函數(shù)內(nèi)(外層模塊)定義的Date類型例6.3嵌套模塊中的同名類型或量值的空間域main函數(shù)內(nèi)

PersonZS; {//內(nèi)嵌模塊開始

structPerson { intid; charname[10]; intClass; };

PersonLiSi; DateBirthday; printf("sizeof(LiSi)=%d\n",sizeof(LiSi)); }//內(nèi)嵌模塊結(jié)束 printf("sizeof(ZS)=%d\n",sizeof(ZS)); printf("%d",sizeof(LiSi));}聲明外層模塊定義的Person類型的變量ZS內(nèi)、外層定義了同名的Person類型,LiSi是內(nèi)層的Person類型的變量?jī)?nèi)層模塊定義的同名Person類型,成員不同聲明外層模塊定義的Date類型的變量Birthday,外層定義,內(nèi)層可見在內(nèi)層輸出內(nèi)層Person類型變量LiSi的大小在外層輸出外層Person類型變量ZS的大小在外層輸出內(nèi)層Person類型變量LiSi的大小,編譯出錯(cuò) PersonZS;聲明外層模塊定義的Person類型的變sizeof(LiSi)=20sizeof(ZS)=16Pressanykeytocontinuesizeof(LiSi)=206.2.3文件域程序的所有代碼都是寫在文件中的。用C/C++編寫程序,最少要有一個(gè)文件。在文件內(nèi)定義的類型或量值(注意:不包含在任何模塊中,而是直接定義在文件中)的空間域是從定義位置開始,到本文件的結(jié)束。本文件內(nèi),在定義該類型或量值后面的任何模塊內(nèi)或模塊外,都可以引用該類型或量值。類型只能定義在前,引用在后。變量通常定義在前,引用在后。變量如果定義在后,引用在先,必須在引用前明確用關(guān)鍵字extern聲明。6.2.3文件域例6.4文件中定義的類型或量值的空間域#include<stdio.h>structPerson{ intid; charname[10];};inti; 定義在文件中的Person類型定義在文件中的int型變量i例6.4文件中定義的類型或量值的空間域定義在文件中的Pevoidmain(){

PersonZS={1,"張三"}; {

i=10; printf("i=%d\n",i);

} printf(“id=%dname=%s\n",ZS.id,ZS.name);}在main函數(shù)的外層模塊中聲明一個(gè)Person類型的變量ZS,并賦值在main函數(shù)的內(nèi)層模塊中引用整型變量i,并賦值i=10id=1name=張三Pressanykeytocontinuevoidmain()在main函數(shù)的外層模塊中聲明一個(gè)Pe一個(gè)編譯出錯(cuò)的示例程序:

程序中,將Person類型的定義寫在文件的后端,而文件前端的main函數(shù)模塊內(nèi),引用了后面才定義的Person類型。程序編譯出錯(cuò)。

一個(gè)編譯出錯(cuò)的示例程序:#include<stdio.h>inti;voidmain(){ PersonZS={1,"張三"};

{ i=10; printf("i=%d",i); } printf("%d%s\n",ZS.id,ZS.name);}structPerson{ intid; charname[10];};在main函數(shù)的外層模塊中聲明一個(gè)定義在文件后面的Person類型的變量ZS,并賦值。編譯出錯(cuò)定義在文件后面的Person類型#include<stdio.h>在main函數(shù)的外層模塊中用extern聲明定義在后的變量的情況。例6.6變量的先聲明,再應(yīng)用,而后定義#include<stdio.h>#include<string.h>structPerson{ intid; charname[10];};定義在文件前面的Person類型用extern聲明定義在后的變量的情況。定義在文件前面的Pe voidmain(){ externinti; i=10; externPersonZS; ZS.id=1; strcpy(ZS.name,"張三"); printf("i=%d\n",i); printf(“id=%dname=%s\n",ZS.id,ZS.name);}PersonZS;inti; 定義在文件后面的變量i,ZS聲明在文件后面定義的變量i聲明在文件后面定義的變量ZSi=10id=1name=張三Pressanykeytocontinue voidmain()定義在文件后面的變量i,ZS聲明在文#include<stdio.h>#include<string.h>structPerson{ intid; charname[10];};

voidmain(){ PersonZS={1,"張三"}; inti=10; printf("i=%d\n",i); printf("%d%s\n",ZS.id,ZS.name);

externintj; j=200; printf(“j=%d\n",j); intj;}

出錯(cuò)原因:”定義在后,重新聲明,然后引用”的規(guī)則模塊外(文件內(nèi))的全局變量在模塊內(nèi)引用的規(guī)則,不能應(yīng)用于模塊內(nèi)聲明的局部變量。注意:”定義在后,重新聲明,然后引用”的規(guī)則不適合類型,只適合變量。#include<stdio.h>出錯(cuò)原因:”定義在后,重新6.2.4工程域工程中可以有多個(gè)文件每個(gè)文件中可以有多個(gè)全局的類型、全局的量值和全局的函數(shù)模塊函數(shù)模塊內(nèi)可以有多個(gè)局部的類型和局部的量值。局部的類型和量值的空間域限制在它所在的模塊,不會(huì)影響到同一個(gè)工程中的其它文件。能夠在一個(gè)工程中的多個(gè)文件之間相互影響的是一個(gè)文件內(nèi)的全局類型、全局量值和全局函數(shù)模塊。6.2.4工程域例6.7工程內(nèi)全局類型和量值空間域(包含3個(gè)文件)(1)在VC++中創(chuàng)建Win32ConsoleApplication工程MyMFile(系統(tǒng)會(huì)自動(dòng)添加文件擴(kuò)展名.dsw)(2)創(chuàng)建C++SourceFile文件MyMFile0(系統(tǒng)會(huì)自動(dòng)添加文件擴(kuò)展名.cpp),文件內(nèi)容如下:intMyMax(intx,inty){ returnx>y?x:y;}求最大值函數(shù)例6.7工程內(nèi)全局類型和量值空間域(包含3個(gè)文件)求最大值(3)新建C/C++HeaderFile文件MyMFile(系統(tǒng)會(huì)自動(dòng)添加文件擴(kuò)展名.h),文件內(nèi)容如下:#include<stdio.h>#include<string.h>structPerson{ intid; charname[10];};intMyMax(int,int);inti=100;定義在本工程中各個(gè)文件內(nèi)的函數(shù)(MyFile0.cpp)的聲明對(duì)系統(tǒng)頭文件的包含本工程要使用的類型定義本工程中其它文件要使用的全局變量的定義。(3)新建C/C++HeaderFile文件MyMFil(4)新建C++SourceFile文件MyMFile1,文件內(nèi)容如下:#include"MyMFile.h"voidmain(){ PersonZS; ZS.id=i; strcpy(ZS.name,"張三");

printf("i=%d\n",i); printf(“id=%dname=%s",ZS.id,ZS.name); intmax;

max=MyMax(2,20); printf("max=%d",max); putchar('\n');}i=100id=100name=張三max=20Pressanykeytocontinue寫成:#include<MyMFile.h>出錯(cuò),用戶自定義的頭文件只能使用雙引號(hào)(4)新建C++SourceFile文件MyMFile1可能會(huì)有這樣的情況:某些全局類型、全局量值和函數(shù)只使用在某幾個(gè)特定文件中。這時(shí),要單獨(dú)新建特定的頭文件,只在這幾個(gè)文件中,包含該頭文件,在其它文件中不要包含該頭文件。就是說,一個(gè)工程中,可以根據(jù)全局內(nèi)容的使用范圍,創(chuàng)建多個(gè)不同的頭文件。某些全局類型、全局量值和函數(shù)嚴(yán)格限定只能使用在某一個(gè)特定文件中。這時(shí),將它們定義在這個(gè)文件中,并且在全局量值和函數(shù)的定義前使用關(guān)鍵字static。這時(shí),同工程的其它文件無法使用??赡軙?huì)有這樣的情況:如果MyMFile0.cpp文件的內(nèi)容是如下形式:static

intMyMax(intx,inty){ returnx>y?x:y;}這時(shí),程序就會(huì)出錯(cuò)。原因是MyMax函數(shù)用static關(guān)鍵字,被限定在本文件MyMFile0.cpp中的其它函數(shù)調(diào)用,同工程的其它文件中的函數(shù)無法使用該函數(shù),導(dǎo)致MyMFile1.cpp中的main函數(shù)調(diào)用出錯(cuò)。

如果MyMFile0.cpp文件的內(nèi)容是如下形式:6.3名詞性的類型和量值在各邏輯結(jié)構(gòu)上的時(shí)間域通常:類型和量值的時(shí)間域和空間域是一致的。特殊情況下:用關(guān)鍵字static對(duì)定義的變量和函數(shù)做限定時(shí),空間域和時(shí)間域不同,時(shí)間域會(huì)大于空間域。6.3名詞性的類型和量值在各邏輯結(jié)構(gòu)上的時(shí)間域通常:類型和量6.3.1模塊內(nèi)static模塊內(nèi)用static定義的變量,其空間域仍然限定在該模塊,但其時(shí)間域是整個(gè)工程,即在工程存活期內(nèi),該變量都占據(jù)內(nèi)存,一直保持著原來的量值,但是在模塊外由于超出空間域而無法訪問,在模塊內(nèi)由于空間域和時(shí)間域重合,可以被訪問。這種變量叫“靜態(tài)變量”。與其相對(duì),缺省定義的變量,叫做“動(dòng)態(tài)變量”,如通常的inta;詳細(xì)的可以寫為autointa;。動(dòng)態(tài)量值在其被定義的模塊外同時(shí)喪失空間域和時(shí)間域,即其占用的內(nèi)存被釋放,它的值當(dāng)然就不存在了,也就無法訪問了6.3.1模塊內(nèi)static例6.8計(jì)算1-5的階乘#include<stdio.h>intfac(int);

voidmain(){ inti; for(i=1;i<=5;i++) printf("%d!=%d\n",i,fac(i));}循環(huán)調(diào)用階乘函數(shù)階乘函數(shù)的聲明例6.8計(jì)算1-5的階乘循環(huán)調(diào)用階乘函數(shù)階乘函數(shù)的聲明intfac(intn)

{

staticintf=1;

f=f*n; return(f);}定義f為靜態(tài)變量1!=12!=23!=64!=245!=120Pressanykeytocontinueintfac(intn) 定義f為靜態(tài)變量1!=1main()fac(1)fac(1)staticintf=1returnff=f*n=1fac(2)f=1returnff=f*n=2fac(2)fac(3)f=2returnff=f*n=6fac(3)fac(4)fac(4)f=6returnff=f*n=24fac(5)fac(5)f=24returnff=f*n=120main()fac(1)fac(1)staticintf#include<stdio.h>intfac(int);

voidmain(){ inti; for(i=1;i<=5;i++) printf("%d!=%d\n",i,fac(i));}intfac(intn)

{

intf=1;

f=f*n; return(f);}1!=12!=23!=34!=45!=5Pressanykeytocontinue#include<stdio.h>intfac(intnmain()fac(1)fac(1)intf=1returnff=f*n=1fac(2)intf=1returnff=f*n=2fac(2)fac(3)intf=1returnff=f*n=3fac(3)fac(4)fac(4)intf=1returnff=f*n=4fac(5)fac(5)intf=1returnff=f*n=5main()fac(1)fac(1)intf=1retur6.3.2文件內(nèi)的static

文件內(nèi)只有三種成分:1.類型的定義;2.全局變量的定義;3.函數(shù)的定義。 定義在文件內(nèi)而模塊外的類型其時(shí)間域和空間域永遠(yuǎn)相同,是整個(gè)工程。 文件內(nèi)定義的全局量值和函數(shù),默認(rèn)情況下時(shí)間域也是整個(gè)工程的運(yùn)行時(shí)間。所以在本工程內(nèi)的其它文件中,可以訪問。 當(dāng)在定義全局量值和函數(shù)時(shí),用static加以限定,這時(shí)的全局量值和函數(shù)的時(shí)間域是整個(gè)工程,但空間域被限定在本文件。6.3.2文件內(nèi)的static例6.9工程內(nèi)全局類型和量值時(shí)間域(1)在VC++環(huán)境中新建工程tem。(2)新建C++SourceFile文件tem1。輸入如下代碼:inta=1;(3)新建C++SourceFile文件tem2。輸入如下代碼:#include<stdio.h>voidmain(){ externinta; printf(“a=%d\n",a);}對(duì)定義在本工程其它文件中全局變量的聲明a=1Pressanykeytocontinue例6.9工程內(nèi)全局類型和量值時(shí)間域?qū)Χx在本工程其它文件中例6.9工程內(nèi)全局類型和量值時(shí)間域(1)在VC++環(huán)境中新建工程tem。(2)新建C++SourceFile文件tem1。輸入如下代碼:staticb=2;(3)新建C++SourceFile文件tem2。輸入如下代碼:#include<stdio.h>voidmain(){ externintb;

printf("b=%d\n",b);}在文件tem1中變量b是用static定義的,它的空間域被限定在文件tem1中編譯出錯(cuò):在文件tem2中無法對(duì)b聲明和調(diào)用。例6.9工程內(nèi)全局類型和量值時(shí)間域在文件tem1中變量b是例6.9工程內(nèi)全局類型和量值時(shí)間域(1)在VC++環(huán)境中新建工程tem。(2)新建C++SourceFile文件tem1。輸入如下代碼:inta=1;(3)新建C++SourceFile文件tem2。輸入如下代碼:#include<stdio.h>voidmain(){ inta; printf(“a=%d\n",a);}main()函數(shù)內(nèi)的局部變量,未賦值;而并非tem1文件中聲明的全局變量a,初值為1a=-858993460Pressanykeytocontinue例6.9工程內(nèi)全局類型和量值時(shí)間域main()函數(shù)內(nèi)的局部6.3.3關(guān)于static的總結(jié)static用在模塊中,作用是:擴(kuò)大時(shí)間域;static用在文件中,作用是:縮小空間域; 靜態(tài)變量(模塊內(nèi)和文件內(nèi))是在編譯時(shí)賦初值的,即無論程序運(yùn)行幾次初值只賦一次;模塊內(nèi)的動(dòng)態(tài)變量每次調(diào)用一切重新開始。靜態(tài)變量速度快,耗費(fèi)資源;動(dòng)態(tài)變量反之。6.3.3關(guān)于static的總結(jié)6.3.3關(guān)于static的總結(jié) 對(duì)不初始化的靜態(tài)變量(模塊內(nèi)和文件內(nèi)),系統(tǒng)會(huì)自動(dòng)賦0(數(shù)值型)或空字符(字符型); 對(duì)模塊內(nèi)動(dòng)態(tài)變量,是隨機(jī)數(shù)。 對(duì)不初始化的文件內(nèi)動(dòng)態(tài)變量(即不用static限定的文件內(nèi)變量),系統(tǒng)也會(huì)自動(dòng)賦初值0或空字符。所以,有的書中將文件中的變量都叫做“靜態(tài)變量”。6.3.3關(guān)于static的總結(jié)例6.9工程內(nèi)全局類型和量值時(shí)間域(1)在VC++環(huán)境中新建工程tem。(2)新建C++SourceFile文件tem1。輸入如下代碼:inta;(3)新建C++SourceFile文件tem2。輸入如下代碼:#include<stdio.h>voidmain(){ externinta; printf(“a=%d\n",a);}對(duì)不初始化的文件內(nèi)動(dòng)態(tài)變量,系統(tǒng)也會(huì)自動(dòng)賦初值0a=0Pressanykeytocontinue例6.9工程內(nèi)全局類型和量值時(shí)間域?qū)Σ怀跏蓟奈募?nèi)動(dòng)態(tài)變6.4變量的物理存儲(chǔ)位置定義的變量通常情況下,無論是動(dòng)態(tài)的還是靜態(tài)的,都是存儲(chǔ)在ROM(隨機(jī)只讀存儲(chǔ)器,內(nèi)存)中的。在小型計(jì)算機(jī)或大型計(jì)算機(jī)中允許用關(guān)鍵字register定義存儲(chǔ)在CPU的寄存器中的變量,該變量的存取速度更快。但CPU的寄存器數(shù)量很少,所以這樣的變量通常是對(duì)程序運(yùn)行速度影響很大的循環(huán)變量。寄存器變量只能是動(dòng)態(tài)的。用register定義的寄存器變量,運(yùn)行在微機(jī)環(huán)境中,編譯器會(huì)自己將其轉(zhuǎn)化為存儲(chǔ)在ROM中。6.4變量的物理存儲(chǔ)位置定義的變量通常情況下,無論是動(dòng)態(tài)的還例6.10寄存器變量的定義和使用#include<stdio.h>voidmain(){

registerinti; for(i=0;i<10;i++) printf("i=%d\n",i);}上面程序運(yùn)行在微機(jī)和其它計(jì)算機(jī)上的物理機(jī)制不同,但結(jié)果相同。例6.10寄存器變量的定義和使用空間域:一個(gè)類型或量值,從程序的什么位置到什么位置是有效的,是可以引用的,是占據(jù)內(nèi)存的。時(shí)間域:一個(gè)類型或量值,在程序執(zhí)行過程中,從什么時(shí)刻開始到什么時(shí)刻是占據(jù)內(nèi)存的。第6章名詞的空間域、時(shí)間域和物理存儲(chǔ)位置空間域:一個(gè)類型或量值,從程序的什么位置到什么位置是有效的,名詞的空間域和時(shí)間域不完全一致。有空間域的類型或量值,一定有時(shí)間域。即在程序的某位置可以訪問的類型或量值,此時(shí)一定占據(jù)內(nèi)存;有時(shí)間域的類型或量值,不一定有空間域。即有的時(shí)候,程序執(zhí)行到某個(gè)位置,某個(gè)類型或量值雖然占據(jù)內(nèi)存,但無法訪問,即在該位置不可見。名詞的空間域和時(shí)間域不完全一致。6.1C/C++程序的邏輯結(jié)構(gòu)程序從小到大可分為如下邏輯單位:語句(statement):分號(hào)結(jié)束2.模塊(block): 一對(duì)花括號(hào)括起的若干語句。3.嵌套模塊: 多對(duì)花括號(hào)的嵌套。6.1C/C++程序的邏輯結(jié)構(gòu)程序從小到大可分為如下邏輯單4.文件(file): 程序的存盤單位。文件中通常包含多個(gè)模塊(或嵌套模塊),每個(gè)模塊內(nèi)包含多個(gè)語句。5.工程(project): 工程是功能單位,是對(duì)多個(gè)文件進(jìn)行組織和管理的框架。同一個(gè)工程內(nèi)的文件之間可以交換數(shù)據(jù),共享函數(shù)。6.工作區(qū)(workspace): 工作區(qū)是VC++最大的開發(fā)單位,是對(duì)多個(gè)工程進(jìn)行組織和管理的框架。一個(gè)工作區(qū)內(nèi)的多個(gè)工程應(yīng)該是相關(guān)的。不同工程間可以共享文件。4.文件(file):圖6.1C/C++程序邏輯結(jié)構(gòu)圖6.1C/C++程序邏輯結(jié)構(gòu)6.2名詞性的類型和量值在各邏輯結(jié)構(gòu)上的空間域6.2.1模塊域模塊{}是空間作用域的最小范圍。缺省情況下,定義在模塊內(nèi)(一對(duì)花括號(hào)內(nèi))的類型和量值,其有效范圍是從定義位置到本模塊結(jié)束。出本模塊右花括號(hào)后,該類型或量值因?yàn)獒尫艃?nèi)存空間而失效,無法訪問。6.2名詞性的類型和量值在各邏輯結(jié)構(gòu)上的空間域6.2.1模例6.1量值模塊作用域的驗(yàn)證#include<stdio.h>intfun(intx)voidmain(){ inta=10; intb; printf("a=%d\n",a);

b=fun(a);

printf("a=%d,b=%d\n",a,b);}調(diào)用fun函數(shù),a(10)為實(shí)參fun函數(shù)的聲明intfun(intx){ inta=20;

printf("a=%d,x=%d\n",a,x); returna+x;}fun內(nèi)定義的a只在fun內(nèi)有效返回a+x的值(20+10)例6.1量值模塊作用域的驗(yàn)證調(diào)用fun函數(shù),a(10)為a=10a=20,x=10a=10,b=30Pressanykeytocontinuemain()中的輸出fun()中的輸出main()中的輸出a=10main()中的輸出fun()中的輸出main()例6.1量值模塊作用域的驗(yàn)證#include<stdio.h>intfun(intx)voidmain(){ inta=10; intb; printf("a=%d\n",a);

b=fun(a);

printf("a=%d,b=%d\n",a,b);

printf(“x=%d\n",x);}調(diào)用fun函數(shù),a(10)為實(shí)參fun函數(shù)的聲明編譯出錯(cuò):errorC2065:'x':undeclaredidentifierintfun(intx){ inta=20;

printf("a=%d,x=%d\n",a,x);

printf("b=%d\n",b); returna+x;}fun內(nèi)定義的a只在fun內(nèi)有效返回a+x的值(20+10)編譯出錯(cuò):errorC2065:'b':undeclaredidentifier例6.1量值模塊作用域的驗(yàn)證調(diào)用fun函數(shù),a(10)為E7ABA0名詞的空間域時(shí)間域和物理存儲(chǔ)位置課件例6.2類型模塊作用域的驗(yàn)證#include<stdio.h>Personfun();Personfun(){ structPerson { intid; charname[10]; }ZS={1,"張三"}; returnZS;}voidmain(){ PersonLiSi;

LiSi=fun();}fun內(nèi)定義的類型Person,只在fun內(nèi)有效在main函數(shù)內(nèi)聲明一個(gè)在fun函數(shù)內(nèi)定義的Person類型的變量LiSi,編譯出錯(cuò)聲明Person類型的變量ZS,并賦值例6.2類型模塊作用域的驗(yàn)證fun內(nèi)定義的類型Perso例6.2類型模塊作用域的驗(yàn)證#include<stdio.h>structPerson { intid; charname[10]; };Personfun();voidmain(){ PersonLiSi; LiSi=fun(); printf("id=%d\n",LiSi.id); printf("name=%s\n",LiS);}Personfun(){ PersonZS={1,"張三"}; returnZS;}id=1name=張三Pressanykeytocontinue例6.2類型模塊作用域的驗(yàn)證id=16.2.2嵌套模塊的層域當(dāng)一個(gè)模塊內(nèi)嵌套另一個(gè)模塊時(shí),定義在內(nèi)層模塊的類型和量值的空域就是內(nèi)層模塊;定義在外層模塊內(nèi)的類型和量值的空域是外層模塊,當(dāng)然涵蓋內(nèi)存模塊,即在內(nèi)層模塊內(nèi)可以引用定義在外層模塊內(nèi)的類型和量值。當(dāng)內(nèi)層模塊內(nèi)定義了和外層模塊內(nèi)同名的類型和量值時(shí),內(nèi)層的類型和量值覆蓋了外層模塊的同名類型和量值,導(dǎo)致只能引用內(nèi)層中定義的部分。6.2.2嵌套模塊的層域例6.3嵌套模塊中的同名類型或量值的空間域#include<stdio.h>voidmain(){

structPerson { intid; charname[10]; };

structDate { intyear; intmonth; intday; };main函數(shù)內(nèi)(外層模塊)定義的Person類型main函數(shù)內(nèi)(外層模塊)定義的Date類型例6.3嵌套模塊中的同名類型或量值的空間域main函數(shù)內(nèi)

PersonZS; {//內(nèi)嵌模塊開始

structPerson { intid; charname[10]; intClass; };

PersonLiSi; DateBirthday; printf("sizeof(LiSi)=%d\n",sizeof(LiSi)); }//內(nèi)嵌模塊結(jié)束 printf("sizeof(ZS)=%d\n",sizeof(ZS)); printf("%d",sizeof(LiSi));}聲明外層模塊定義的Person類型的變量ZS內(nèi)、外層定義了同名的Person類型,LiSi是內(nèi)層的Person類型的變量?jī)?nèi)層模塊定義的同名Person類型,成員不同聲明外層模塊定義的Date類型的變量Birthday,外層定義,內(nèi)層可見在內(nèi)層輸出內(nèi)層Person類型變量LiSi的大小在外層輸出外層Person類型變量ZS的大小在外層輸出內(nèi)層Person類型變量LiSi的大小,編譯出錯(cuò) PersonZS;聲明外層模塊定義的Person類型的變sizeof(LiSi)=20sizeof(ZS)=16Pressanykeytocontinuesizeof(LiSi)=206.2.3文件域程序的所有代碼都是寫在文件中的。用C/C++編寫程序,最少要有一個(gè)文件。在文件內(nèi)定義的類型或量值(注意:不包含在任何模塊中,而是直接定義在文件中)的空間域是從定義位置開始,到本文件的結(jié)束。本文件內(nèi),在定義該類型或量值后面的任何模塊內(nèi)或模塊外,都可以引用該類型或量值。類型只能定義在前,引用在后。變量通常定義在前,引用在后。變量如果定義在后,引用在先,必須在引用前明確用關(guān)鍵字extern聲明。6.2.3文件域例6.4文件中定義的類型或量值的空間域#include<stdio.h>structPerson{ intid; charname[10];};inti; 定義在文件中的Person類型定義在文件中的int型變量i例6.4文件中定義的類型或量值的空間域定義在文件中的Pevoidmain(){

PersonZS={1,"張三"}; {

i=10; printf("i=%d\n",i);

} printf(“id=%dname=%s\n",ZS.id,ZS.name);}在main函數(shù)的外層模塊中聲明一個(gè)Person類型的變量ZS,并賦值在main函數(shù)的內(nèi)層模塊中引用整型變量i,并賦值i=10id=1name=張三Pressanykeytocontinuevoidmain()在main函數(shù)的外層模塊中聲明一個(gè)Pe一個(gè)編譯出錯(cuò)的示例程序:

程序中,將Person類型的定義寫在文件的后端,而文件前端的main函數(shù)模塊內(nèi),引用了后面才定義的Person類型。程序編譯出錯(cuò)。

一個(gè)編譯出錯(cuò)的示例程序:#include<stdio.h>inti;voidmain(){ PersonZS={1,"張三"};

{ i=10; printf("i=%d",i); } printf("%d%s\n",ZS.id,ZS.name);}structPerson{ intid; charname[10];};在main函數(shù)的外層模塊中聲明一個(gè)定義在文件后面的Person類型的變量ZS,并賦值。編譯出錯(cuò)定義在文件后面的Person類型#include<stdio.h>在main函數(shù)的外層模塊中用extern聲明定義在后的變量的情況。例6.6變量的先聲明,再應(yīng)用,而后定義#include<stdio.h>#include<string.h>structPerson{ intid; charname[10];};定義在文件前面的Person類型用extern聲明定義在后的變量的情況。定義在文件前面的Pe voidmain(){ externinti; i=10; externPersonZS; ZS.id=1; strcpy(ZS.name,"張三"); printf("i=%d\n",i); printf(“id=%dname=%s\n",ZS.id,ZS.name);}PersonZS;inti; 定義在文件后面的變量i,ZS聲明在文件后面定義的變量i聲明在文件后面定義的變量ZSi=10id=1name=張三Pressanykeytocontinue voidmain()定義在文件后面的變量i,ZS聲明在文#include<stdio.h>#include<string.h>structPerson{ intid; charname[10];};

voidmain(){ PersonZS={1,"張三"}; inti=10; printf("i=%d\n",i); printf("%d%s\n",ZS.id,ZS.name);

externintj; j=200; printf(“j=%d\n",j); intj;}

出錯(cuò)原因:”定義在后,重新聲明,然后引用”的規(guī)則模塊外(文件內(nèi))的全局變量在模塊內(nèi)引用的規(guī)則,不能應(yīng)用于模塊內(nèi)聲明的局部變量。注意:”定義在后,重新聲明,然后引用”的規(guī)則不適合類型,只適合變量。#include<stdio.h>出錯(cuò)原因:”定義在后,重新6.2.4工程域工程中可以有多個(gè)文件每個(gè)文件中可以有多個(gè)全局的類型、全局的量值和全局的函數(shù)模塊函數(shù)模塊內(nèi)可以有多個(gè)局部的類型和局部的量值。局部的類型和量值的空間域限制在它所在的模塊,不會(huì)影響到同一個(gè)工程中的其它文件。能夠在一個(gè)工程中的多個(gè)文件之間相互影響的是一個(gè)文件內(nèi)的全局類型、全局量值和全局函數(shù)模塊。6.2.4工程域例6.7工程內(nèi)全局類型和量值空間域(包含3個(gè)文件)(1)在VC++中創(chuàng)建Win32ConsoleApplication工程MyMFile(系統(tǒng)會(huì)自動(dòng)添加文件擴(kuò)展名.dsw)(2)創(chuàng)建C++SourceFile文件MyMFile0(系統(tǒng)會(huì)自動(dòng)添加文件擴(kuò)展名.cpp),文件內(nèi)容如下:intMyMax(intx,inty){ returnx>y?x:y;}求最大值函數(shù)例6.7工程內(nèi)全局類型和量值空間域(包含3個(gè)文件)求最大值(3)新建C/C++HeaderFile文件MyMFile(系統(tǒng)會(huì)自動(dòng)添加文件擴(kuò)展名.h),文件內(nèi)容如下:#include<stdio.h>#include<string.h>structPerson{ intid; charname[10];};intMyMax(int,int);inti=100;定義在本工程中各個(gè)文件內(nèi)的函數(shù)(MyFile0.cpp)的聲明對(duì)系統(tǒng)頭文件的包含本工程要使用的類型定義本工程中其它文件要使用的全局變量的定義。(3)新建C/C++HeaderFile文件MyMFil(4)新建C++SourceFile文件MyMFile1,文件內(nèi)容如下:#include"MyMFile.h"voidmain(){ PersonZS; ZS.id=i; strcpy(ZS.name,"張三");

printf("i=%d\n",i); printf(“id=%dname=%s",ZS.id,ZS.name); intmax;

max=MyMax(2,20); printf("max=%d",max); putchar('\n');}i=100id=100name=張三max=20Pressanykeytocontinue寫成:#include<MyMFile.h>出錯(cuò),用戶自定義的頭文件只能使用雙引號(hào)(4)新建C++SourceFile文件MyMFile1可能會(huì)有這樣的情況:某些全局類型、全局量值和函數(shù)只使用在某幾個(gè)特定文件中。這時(shí),要單獨(dú)新建特定的頭文件,只在這幾個(gè)文件中,包含該頭文件,在其它文件中不要包含該頭文件。就是說,一個(gè)工程中,可以根據(jù)全局內(nèi)容的使用范圍,創(chuàng)建多個(gè)不同的頭文件。某些全局類型、全局量值和函數(shù)嚴(yán)格限定只能使用在某一個(gè)特定文件中。這時(shí),將它們定義在這個(gè)文件中,并且在全局量值和函數(shù)的定義前使用關(guān)鍵字static。這時(shí),同工程的其它文件無法使用。可能會(huì)有這樣的情況:如果MyMFile0.cpp文件的內(nèi)容是如下形式:static

intMyMax(intx,inty){ returnx>y?x:y;}這時(shí),程序就會(huì)出錯(cuò)。原因是MyMax函數(shù)用static關(guān)鍵字,被限定在本文件MyMFile0.cpp中的其它函數(shù)調(diào)用,同工程的其它文件中的函數(shù)無法使用該函數(shù),導(dǎo)致MyMFile1.cpp中的main函數(shù)調(diào)用出錯(cuò)。

如果MyMFile0.cpp文件的內(nèi)容是如下形式:6.3名詞性的類型和量值在各邏輯結(jié)構(gòu)上的時(shí)間域通常:類型和量值的時(shí)間域和空間域是一致的。特殊情況下:用關(guān)鍵字static對(duì)定義的變量和函數(shù)做限定時(shí),空間域和時(shí)間域不同,時(shí)間域會(huì)大于空間域。6.3名詞性的類型和量值在各邏輯結(jié)構(gòu)上的時(shí)間域通常:類型和量6.3.1模塊內(nèi)static模塊內(nèi)用static定義的變量,其空間域仍然限定在該模塊,但其時(shí)間域是整個(gè)工程,即在工程存活期內(nèi),該變量都占據(jù)內(nèi)存,一直保持著原來的量值,但是在模塊外由于超出空間域而無法訪問,在模塊內(nèi)由于空間域和時(shí)間域重合,可以被訪問。這種變量叫“靜態(tài)變量”。與其相對(duì),缺省定義的變量,叫做“動(dòng)態(tài)變量”,如通常的inta;詳細(xì)的可以寫為autointa;。動(dòng)態(tài)量值在其被定義的模塊外同時(shí)喪失空間域和時(shí)間域,即其占用的內(nèi)存被釋放,它的值當(dāng)然就不存在了,也就無法訪問了6.3.1模塊內(nèi)static例6.8計(jì)算1-5的階乘#include<stdio.h>intfac(int);

voidmain(){ inti; for(i=1;i<=5;i++) printf("%d!=%d\n",i,fac(i));}循環(huán)調(diào)用階乘函數(shù)階乘函數(shù)的聲明例6.8計(jì)算1-5的階乘循環(huán)調(diào)用階乘函數(shù)階乘函數(shù)的聲明intfac(intn)

{

staticintf=1;

f=f*n; return(f);}定義f為靜態(tài)變量1!=12!=23!=64!=245!=120Pressanykeytocontinueintfac(intn) 定義f為靜態(tài)變量1!=1main()fac(1)fac(1)staticintf=1returnff=f*n=1fac(2)f=1returnff=f*n=2fac(2)fac(3)f=2returnff=f*n=6fac(3)fac(4)fac(4)f=6returnff=f*n=24fac(5)fac(5)f=24returnff=f*n=120main()fac(1)fac(1)staticintf#include<stdio.h>intfac(int);

voidmain(){ inti; for(i=1;i<=5;i++) printf("%d!=%d\n",i,fac(i));}intfac(intn)

{

intf=1;

f=f*n; return(f);}1!=12!=23!=34!=45!=5Pressanykeytocontinue#include<stdio.h>intfac(intnmain()fac(1)fac(1)intf=1returnff=f*n=1fac(2)intf=1returnff=f*n=2fac(2)fac(3)intf=1returnff=f*n=3fac(3)fac(4)fac(4)intf=1returnff=f*n=4fac(5)fac(5)intf=1returnff=f*n=5main()fac(1)fac(1)intf=1retur6.3.2文件內(nèi)的static

文件內(nèi)只有三種成分:1.類型的定

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論