




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 C語言中,將變量的有效范圍稱為變量的語言中,將變量的有效范圍稱為變量的作用域。所有的變量都有自己的作用域,變作用域。所有的變量都有自己的作用域,變量定義的位置不同,其作用域也不同,作用量定義的位置不同,其作用域也不同,作用域是從空間角度對變量特性的一個描述。按域是從空間角度對變量特性的一個描述。按照變量的作用域,將語言中的變量分為內照變量的作用域,將語言中的變量分為內部變量和外部變量。部變量和外部變量。 1內部變量的概念和定義內部變量的概念和定義 在一個函數在一個函數(包括包括main()函數函數)內部或內部或復合句內部定義的變量稱為內部變量,自復合句內部定義的變量稱為內部變量,自然,函數的
2、形參屬于內部變量。內部變量然,函數的形參屬于內部變量。內部變量只在該函數范圍內或該復合句范圍內有效。只在該函數范圍內或該復合句范圍內有效。也就是說,內部變量的作用域局限于定義也就是說,內部變量的作用域局限于定義它的函數或復合句內部,在此函數之外或它的函數或復合句內部,在此函數之外或此復合句之外就不能使用這些變量了。所此復合句之外就不能使用這些變量了。所以,內部變量也稱局部變量。以,內部變量也稱局部變量。 前面我們使用的所有變量都屬于內部變量,前面我們使用的所有變量都屬于內部變量,例如,例如,95頁【例頁【例6.10】中,】中,void()函數中定義函數中定義的變量的變量i,其作用域局限于,其作
3、用域局限于void()函數內,在函數內,在main() 函數中無效;函數中無效;main()函數中定義的變量函數中定義的變量i也只在也只在main()函數內有效函數內有效. 再如:再如:96頁,頁,fun1()函數中定義的變量函數中定義的變量p1,p2,p3,其作用域局限于,其作用域局限于fun1()函數內,在函數內,在main() 函數中無效;函數中無效; fun2()函數中定義的變量函數中定義的變量p4,p5,p6,其作用域局限于,其作用域局限于fun2()函數內,在函數內,在main() 函數中無效;函數中無效; main()函數中定義的變函數中定義的變量量x,y,a,b也只在也只在ma
4、in()函數內有效函數內有效.說明:說明: 在復合句中也可定義變量,其作用域只在復合句中也可定義變量,其作用域只在復合句范圍內。例如:在復合句范圍內。例如:【例【例6.5】 輸入任意三個整數,按從小到大的順序輸入任意三個整數,按從小到大的順序輸出。輸出。main() int num1,num2,num3; printf(Please input three numbers:); scanf(%d,%d,%d,&num1,&num2,&num3);if (num1num2) int temp;temp=num1;num1=num2;num2=temp; if (num2n
5、um3) int temp;temp=num2;num2=num3;num3=temp; if (num1num2) int temp;temp=num1;num1=num2;num2=temp; printf(Three numbers after sorted: %d,%d,%dn,num1,num2,num3); 程序運行情況如下:程序運行情況如下:Please input three numbers:8,0,5 Three numbers after sorted:0,5,8本例中的本例中的temp變量的作用域局限于復合句變量的作用域局限于復合句內。內。 1外部變量的概念和定義外部變量
6、的概念和定義 在函數外部定義的變量稱為外部變量。在函數外部定義的變量稱為外部變量。外部變量不屬于任何一個函數,其作用域外部變量不屬于任何一個函數,其作用域是:從外部變量的定義位置開始,到本源是:從外部變量的定義位置開始,到本源文件結束為止。外部變量可被作用域內的文件結束為止。外部變量可被作用域內的所有函數直接引用,所以外部變量又稱全所有函數直接引用,所以外部變量又稱全局變量。例如局變量。例如97頁例題中頁例題中a,b存儲類別就存儲類別就是外部型是外部型說明:說明:(1)在同一源文件中,允許外部變量和內)在同一源文件中,允許外部變量和內部變量同名。同名時在內部變量的作用域內,部變量同名。同名時在
7、內部變量的作用域內,外部變量將被屏蔽而不起作用,如下例所示。外部變量將被屏蔽而不起作用,如下例所示?!纠纠?.6】 外部變量與內部變量同名舉例。外部變量與內部變量同名舉例。int a=3,b=5;int max(int a,int b) int c; c=ab?a:b; return c; main() int a=8; printf(max=%dn,max(a,b); 程序運行結果如下:程序運行結果如下: max=8 本例中,本例中,main()函數中定義的內部變量函數中定義的內部變量a與外與外部變量同名,部變量同名,max()函數中定義的形參函數中定義的形參a、b也與外也與外部變量同名。
8、因此,在部變量同名。因此,在main()函數中,外部變量函數中,外部變量a被屏蔽,調用被屏蔽,調用max()函數的實參函數的實參a是內部變量,值是內部變量,值為為8,實參,實參b是外部變量,值為是外部變量,值為5。在。在max()函數中,函數中,外部變量外部變量a、b均被屏蔽,形參均被屏蔽,形參a、b的值為實參所的值為實參所傳遞,分別為傳遞,分別為8和和5,所以輸出結果為,所以輸出結果為8。 從本例可以看出,外部變量與內部變量同名時容從本例可以看出,外部變量與內部變量同名時容易混淆其作用域,因此在程序設計中應盡量避免其易混淆其作用域,因此在程序設計中應盡量避免其同名。同名。(2)外部變量的作用
9、域是從定義點開始到本源文件)外部變量的作用域是從定義點開始到本源文件結束為止的。如果定義點之前的函數需要引用這些結束為止的。如果定義點之前的函數需要引用這些外部變量,則需要在函數內對被引用的外部變量進外部變量,則需要在函數內對被引用的外部變量進行聲明。行聲明。 外部變量聲明的一般形式為外部變量聲明的一般形式為 extern 類型名類型名 外部變量外部變量 ,外部變量,外部變量2; 可通過對外部變量的聲明將其作用域延伸到可通過對外部變量的聲明將其作用域延伸到定義它的位置之前的函數中。定義它的位置之前的函數中。 外部變量的定義和外部變量的聲明是兩外部變量的定義和外部變量的聲明是兩回事?;厥隆M獠孔?/p>
10、量的定義,必須在所有的函數外部變量的定義,必須在所有的函數之外,且只能定義一次。之外,且只能定義一次。而外部變量的聲明,而外部變量的聲明,出現在要使用該外部變量的函數內,而且可出現在要使用該外部變量的函數內,而且可以出現多次。外部變量在定義時分配內存單以出現多次。外部變量在定義時分配內存單元,并可以初始化;外部變量聲明時,不能元,并可以初始化;外部變量聲明時,不能再賦初值,只是表明在該函數內要使用這些再賦初值,只是表明在該函數內要使用這些外部變量。如外部變量。如97頁例題中頁例題中b,c是外部變量的定是外部變量的定義義,d,e是外部變量的說明。是外部變量的說明。 函數在本質上是全局的,因為一個
11、函數需要被其他函數調函數在本質上是全局的,因為一個函數需要被其他函數調用。那么,當一個源程序由多個源文件組成時,在一個源文件用。那么,當一個源程序由多個源文件組成時,在一個源文件中定義的函數,能否被其他源文件中的函數調用呢?語言根中定義的函數,能否被其他源文件中的函數調用呢?語言根據函數能否被其他源文件中的函數調用,將函數分為內部函數據函數能否被其他源文件中的函數調用,將函數分為內部函數和外部函數。和外部函數。 1內部函數的概念和定義內部函數的概念和定義 如果在一個源文件中定義的函數,只能如果在一個源文件中定義的函數,只能被本源文件中的函數調用,而不能被同一程被本源文件中的函數調用,而不能被同
12、一程序中其他源文件中的函數調用,則這種函數序中其他源文件中的函數調用,則這種函數稱為內部函數。內部函數的作用域局限于定稱為內部函數。內部函數的作用域局限于定義它的源文件內部。義它的源文件內部。 定義一個內部函數,只需在函數定義的定義一個內部函數,只需在函數定義的首部函數類型前再加一個首部函數類型前再加一個static關鍵字即關鍵字即可,如下所示:可,如下所示:static 類型名類型名 函數名函數名(參數定義表參數定義表 ) 函數體函數體 關鍵字關鍵字static譯成中文就是譯成中文就是“靜態的靜態的”,所,所以,內部函數又稱靜態函數。但此處,以,內部函數又稱靜態函數。但此處,static的含
13、義的含義不是指存儲方式,而是指函數的作用域僅局限于本不是指存儲方式,而是指函數的作用域僅局限于本源文件內。源文件內。 使用內部函數的好處是:不同的人編寫不同使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其的函數時,不用擔心自己定義的函數,是否會與其他源文件中的函數同名。他源文件中的函數同名。外部函數外部函數 1外部函數的概念外部函數的概念 如果在一個源文件中定義的函數,除可被本源文件中的其如果在一個源文件中定義的函數,除可被本源文件中的其他函數調用外,也可被其他源文件中的函數所調用,則這種他函數調用外,也可被其他源文件中的函數所調用,則這種函數稱為外部函數。外
14、部函數的作用域是整個源程序。函數稱為外部函數。外部函數的作用域是整個源程序。 2外部函數的定義外部函數的定義 在定義函數時,如果沒有加關鍵字在定義函數時,如果沒有加關鍵字static,或冠以關鍵字,或冠以關鍵字extern,表示此函數是外部函數,如下所示:,表示此函數是外部函數,如下所示: extern 類型名類型名 函數名函數名( 參數定義表參數定義表 ) 函數體函數體 與調用本源文件中的函數一樣,需要對被調用的外部函數與調用本源文件中的函數一樣,需要對被調用的外部函數進行如下聲明:進行如下聲明: extern 類型名類型名 函數名函數名( 參數類型表參數類型表 ),函數名,函數名2( 參參
15、數類型表數類型表2 ); 在在C語言中,每個變量都有兩個屬性:語言中,每個變量都有兩個屬性:數據類型和存儲類型。存儲類型是指變量在數據類型和存儲類型。存儲類型是指變量在內存中存儲的方式。各種變量的作用域不同,內存中存儲的方式。各種變量的作用域不同,就其本質來說是因為變量的存儲類型不同。就其本質來說是因為變量的存儲類型不同。變量的存儲類型分為靜態存儲和動態存儲兩變量的存儲類型分為靜態存儲和動態存儲兩大類。大類。 靜態存儲變量通常是在變量定義時就分靜態存儲變量通常是在變量定義時就分配存儲單元,并一直保持不釋放,直至整個配存儲單元,并一直保持不釋放,直至整個程序運行結束才釋放。前面介紹的外部變量程序
16、運行結束才釋放。前面介紹的外部變量即屬于此類存儲方式。即屬于此類存儲方式。 動態存儲變量是在程序執行過程中,使動態存儲變量是在程序執行過程中,使用它時才分配存儲單元,使用完畢立即釋放。用它時才分配存儲單元,使用完畢立即釋放。典型的例子是函數的形式參數,在函數定義典型的例子是函數的形式參數,在函數定義時并不給形參分配存儲單元,只是在函數被時并不給形參分配存儲單元,只是在函數被調用時,才予以分配,調用完畢立即釋放。調用時,才予以分配,調用完畢立即釋放。如果一個函數被多次調用,則反復地分配、如果一個函數被多次調用,則反復地分配、釋放形參變量的存儲單元。釋放形參變量的存儲單元。 由此可知,靜態存儲變量
17、是一直存在的,由此可知,靜態存儲變量是一直存在的,而動態存儲變量則時而存在、時而消失。這種而動態存儲變量則時而存在、時而消失。這種由于變量存儲方式的不同而產生的特性,稱為由于變量存儲方式的不同而產生的特性,稱為變量的生存期。生存期表示了變量存在的時間。變量的生存期。生存期表示了變量存在的時間。生存期和作用域分別從時間和空間這兩個不同生存期和作用域分別從時間和空間這兩個不同的角度描述了變量的特性。這兩者既有聯系,的角度描述了變量的特性。這兩者既有聯系,又有區別。又有區別。 一個變量究竟屬于哪一種存儲方式,并不一個變量究竟屬于哪一種存儲方式,并不能僅從其作用域來判斷,還應有明確的存儲類能僅從其作用
18、域來判斷,還應有明確的存儲類型定義。因此,變量定義的完整形式應為型定義。因此,變量定義的完整形式應為 存儲類型存儲類型 數據類型數據類型 變量名變量名,變量名,變量名2; 在在C語言中,對變量的存儲類型定義有以語言中,對變量的存儲類型定義有以下四種:自動變量下四種:自動變量(auto)、寄存器變量、寄存器變量(register)、外部變量外部變量(extern)和靜態內部變量和靜態內部變量(static)。自動。自動變量和寄存器變量屬于動態存儲方式,外部變變量和寄存器變量屬于動態存儲方式,外部變量和靜態內部變量屬于靜態存儲方式。對一個量和靜態內部變量屬于靜態存儲方式。對一個變量的定義,不僅應定
19、義其數據類型,還應定變量的定義,不僅應定義其數據類型,還應定義其存儲類型。義其存儲類型。static 數據類型數據類型 內部變量表;內部變量表; 存儲特點:存儲特點: (1) 靜態內部變量屬于靜態存儲,是在靜態內部變量屬于靜態存儲,是在編譯時為其分配存儲單元的,其生存期為編譯時為其分配存儲單元的,其生存期為整個程序執行期間。在程序執行過程中,整個程序執行期間。在程序執行過程中,即使所在函數被調用結束也不釋放,一直即使所在函數被調用結束也不釋放,一直存在。但其他函數不能引用它們。存在。但其他函數不能引用它們。 (2) 靜態內部變量是在編譯時賦初值的,靜態內部變量是在編譯時賦初值的,若定義而不初始
20、化,則自動賦以若定義而不初始化,則自動賦以0(整型和整型和實型實型)或或0(字符型字符型),也即系統會自動初始,也即系統會自動初始化為化為0值。每次調用靜態內部變量所在的函值。每次調用靜態內部變量所在的函數時,不再重新賦初值,只是保留上次調數時,不再重新賦初值,只是保留上次調用結束時的值,如用結束時的值,如99頁例題所示。頁例題所示。寄存器存儲寄存器存儲寄存器變量寄存器變量 一般情況下,變量的值都是存儲在內存一般情況下,變量的值都是存儲在內存中的。為提高執行效率,語言允許將內部變中的。為提高執行效率,語言允許將內部變量的值存放到寄存器中,這種變量稱為寄存器量的值存放到寄存器中,這種變量稱為寄存
21、器變量。定義格式如下:變量。定義格式如下: register 數據類型數據類型 變量表;變量表; 說明:說明: 只有內部變量和形參變量才能定義為寄存只有內部變量和形參變量才能定義為寄存器變量,外部變量則不行。器變量,外部變量則不行?!纠纠?.7】 輸出輸出14的階乘。的階乘。long factorial(int n) register long i,fact=1; /*定義寄存器變量定義寄存器變量*/ for (i=1;i=n;i+) fact*=i; return (fact); main() int num; for (num=1;num=4;num+) printf(%d!=%ldn,
22、num,factorial(num);程序運行結果如下:程序運行結果如下:1!=12!=23!=64!=246.3預處理程序預處理程序文件包含是文件包含是C語言預處理程序的一個重要功能。其命令行語言預處理程序的一個重要功能。其命令行的一般形式為的一般形式為 #include文件名文件名 或或 #include 以前已多次用此命令包含過以前已多次用此命令包含過Turbo C庫函數的頭文庫函數的頭文件。例如:件。例如: #includestdio.h 及及 #includemath.h 文件包含命令的功能是把指定的文件插入該命令行位置取文件包含命令的功能是把指定的文件插入該命令行位置取代該命令行,
23、代該命令行, 從而把指定的文件和當前的源程序文件連成一個從而把指定的文件和當前的源程序文件連成一個源文件。源文件。 在程序設計中,文件包含是很有用的。一個大的程序可在程序設計中,文件包含是很有用的。一個大的程序可以分為多個模塊,由多個程序員分別編程。有些公用的符號常以分為多個模塊,由多個程序員分別編程。有些公用的符號常量或宏定義等可單獨組成一個文件,在其他文件的開頭用包含量或宏定義等可單獨組成一個文件,在其他文件的開頭用包含命令包含該文件即可使用。利用此方式,可避免在每個文件開命令包含該文件即可使用。利用此方式,可避免在每個文件開頭都去定義那些公用量,從而節省時間,并減少出錯。頭都去定義那些公
24、用量,從而節省時間,并減少出錯。說明:說明: (1) 包含命令中的文件名可以用雙引號括起來,也可包含命令中的文件名可以用雙引號括起來,也可以用尖括號括起來。如以用尖括號括起來。如“#include”stdio.h“”或或“#include”。但是這兩種形式是有區別的:使用。但是這兩種形式是有區別的:使用尖括號表示在包含文件目錄中去查找尖括號表示在包含文件目錄中去查找(包含目錄是由用戶包含目錄是由用戶在設置環境時設置的在設置環境時設置的),而不在源文件目錄去查找;使用,而不在源文件目錄去查找;使用雙引號則表示首先在當前的源文件目錄中查找,若未找到雙引號則表示首先在當前的源文件目錄中查找,若未找到
25、才到包含目錄中去查找。才到包含目錄中去查找。 用戶編程時可根據自己文件所在用戶編程時可根據自己文件所在的目錄來選擇某一種命令形式。的目錄來選擇某一種命令形式。 (2) 一個一個include命令只能指定一個被包含文件,若有多命令只能指定一個被包含文件,若有多個文件要包含,則需用多個個文件要包含,則需用多個include命令。命令。 (3) 文件包含允許嵌套,即在一個被包含的文件中又可文件包含允許嵌套,即在一個被包含的文件中又可以包含另一個文件。以包含另一個文件。 在在C語言源程序中,允許用一個標識符來表示一個字符串,語言源程序中,允許用一個標識符來表示一個字符串,稱為稱為“宏宏”。被定義為。被
26、定義為“宏宏”的標識符稱為的標識符稱為“宏名宏名”。在編。在編譯預處理時,對程序中所有出現的譯預處理時,對程序中所有出現的“宏名宏名”,都用宏定義中,都用宏定義中的字符串去代換,這稱為的字符串去代換,這稱為“宏代換宏代換”或或“宏展開宏展開”。宏定義。宏定義是由源程序中的宏定義命令完成的。是由源程序中的宏定義命令完成的。 宏代換是由預處理程序宏代換是由預處理程序自動完成的。自動完成的。 宏提供了一種詞法符號替換機制,它們可帶也可不帶宏提供了一種詞法符號替換機制,它們可帶也可不帶類似函數參數的形式參數。類似函數參數的形式參數。#define 指令定義宏。指令定義宏。 不帶參數宏定義不帶參數宏定義
27、 無參宏的宏名后不帶參數。其定義的一般形式為無參宏的宏名后不帶參數。其定義的一般形式為 #define 標識符標識符 字符串字符串 其中的其中的“#”表示這是一條預處理命令。凡是以表示這是一條預處理命令。凡是以“#”開頭開頭的均為預處理命令。的均為預處理命令。define為宏定義命令。標識符為所定義的為宏定義命令。標識符為所定義的宏名。字符串可以是常數、表達式、格式串等。如:宏名。字符串可以是常數、表達式、格式串等。如: #define PI 3.14159 /*定義定義值值*/ #define R 4【例6.6】 利用無參宏定義形式定義各種類型符號常量并輸出。本例通過定義各種數值及字符串,完
28、成一個給定半徑情況下,圓面積的計算輸出。 /*程序功能:計算給定半徑下圓的面積,并按照給定提示輸出*/ #include stdio.h #define PI 3.14159 /*定義值*/ #define R 4 /*定義半徑值*/ #define INFO The area is: /*定義面積輸出提示*/ main( ) printf(%s %fn,INFO,PI*R*R); /*以給定提示字符串輸出面積值*/ 程序運行情況: The area is 50.265440說明說明: 1) 1) 根據一般根據一般C C語言程序中變量的命名規則,符號常量的定義一般習慣使用大語言程序中變量的命名
29、規則,符號常量的定義一般習慣使用大寫字母表示,這主要是因為通常在一般變量的定義中,常使用小寫字母的原寫字母表示,這主要是因為通常在一般變量的定義中,常使用小寫字母的原因。當然,符號常量也可以小寫字母命名因。當然,符號常量也可以小寫字母命名 2)宏定義是用宏名來表示一個字符串,在宏展開時又)宏定義是用宏名來表示一個字符串,在宏展開時又 以該字符串取代宏名,以該字符串取代宏名,屬于一種簡單的代換。屬于一種簡單的代換。 3)宏定義常用于程序中反復使用的表達式)宏定義常用于程序中反復使用的表達式 4) 宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結束。如要宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結束。如要終止其作用域,可使用終止其作用域,可使用# undef命令。例如:命令。例如: # defi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 風力發電場環評報告書
- 中國兒童果味香粉行業市場發展前景及發展趨勢與投資戰略研究報告(2024-2030)
- 2025年中國遠程智能柜員機市場前景預測及投資規劃研究報告
- 2025年中國畜牧機械制造行業市場深度分析及投資戰略研究報告
- 懷仁縣東作里水庫融資投資立項項目可行性研究報告(齊魯咨詢)
- 精細電路板行業深度研究分析報告(2024-2030版)
- 中國交叉帶式分揀系統行業市場前景預測及投資戰略研究報告
- 網站建設合同
- 版權代理合同
- 中國汽車應急燈總成行業市場發展前景及發展趨勢與投資戰略研究報告(2024-2030)
- 智能安防監控系統升級實施方案
- 考后心理健康教育課件
- 運輸行業保密知識培訓
- 南平市浦城縣石陂鎮社區工作者招聘考試基礎題匯總2023
- 《汽車發動機構造與維修》(配實訓工單) 教案 5-1冷卻系結構與循環線路(4學時)
- 員工反饋與投訴處理機制
- 《治療痤瘡藥》課件
- 《電力交易培訓》課件
- 住院精神疾病患者自殺風險護理(2023版團標)
- 研究污水處理中的微生物群落結構
- 中等職業學校教職員工績效考核實施方案
評論
0/150
提交評論