編譯器和局部變數區別
㈠ C語言中有哪些存儲類型
四種變數存儲類型。說明符如下:
auto static extern register
一、auto
auto稱為自動變數。
局部變數是指在函數內部說明的變數(有時也稱為自動變數)。用關鍵字auto進
行說明, 當auto省略時, 所有的非全程變數都被認為是局部變數, 所以auto實際上
從來不用。
二、static
static稱為靜態變數。根據變數的類型可以分為靜態局部變數和靜態全程變數。
1. 靜態局部變數
它與局部變數的區別在於: 在函數退出時, 這個變數始終存在, 但不能被其它
函數使用, 當再次進入該函數時, 將保存上次的結果。其它與局部變數一樣。
2. 靜態全程變數
Turbo C將大型程序分成若干獨立模塊文件分別編譯, 然後將所有模塊
的目標文件連接在一起, 從而提高編譯速度, 同時也便於軟體的管理和維護。靜態
全程變數就是指只在定義它的源文件中可見而在其它源文件中不可見的變數。它與
全程變數的區別是: 全程變數可以再說明為外部變數(extern), 被其它源文件使用,
而靜態全程變數卻不能再被說明為外部的, 即只能被所在的源文件使用。
三、extern
extern稱為外部變數。為了使變數除了在定義它的源文件中可以使用外, 還要
被其它文件使用。因此, 必須將全程變數通知每一個程序模塊文件, 此時可用
extern來說明。
四、register
register稱為寄存器變數。
㈡ 操作系統和編譯器是怎麼識別全局變數和局部
操作系統,只管調度進程,線程編譯器根據編程語言的定義,確定變數的作用於,存儲類型,生命周期!
定義在函數外部的變數,只有文件靜態變數,和外部變數
外部變數,是實實在在的全局變數,不論作用域還是生命周期。
靜態變數是局部作用域的,生命周期為,程序的生命周期的變數。
自動變數和函數參數,是局部作用域的生命周期為函數結束的局部變數。
寄存器變數,用register定義,是局部變數;
函數內部的靜態變數,語句組內部的靜態變數,局部作用域的,生命周期為,程序的生命周期的變數。
靜態變數,編譯器,可以通過static關鍵字知道。
自動變數,1)函數內部定義的非靜態變數,非寄存器變數是自動變數。
2)函數參數,只能是自動變數,不過也可能定義在寄存器中。
這和調用約定有關,因此不可以用register定義。
C語言沒有全局變數這種數據類型。
只有4種存儲類型,和變數的作用域與生命周期的概念。
C++同樣沒有全局變數這種數據類型。
有另外的兩種作用域
1)namespace作用域。
2)類(類型)作用域。
C只有全局,文件,函數以及函數內部的語句組,4種逐漸縮小的作用域。
其中內層,對外部作用域,具有完全的遮蔽作用。
C++可以通過作用域限定符,區分不同作用域(類,名空間)的名字。
類作用域,可以通過訪問許可權,限制外部的訪問權。
函數作用域(語句組作用域)是封閉的作用域,外部不可以使用函數內部定義的名字。
也不會和外部有命名沖突,只會遮蔽外部的名字。
類作用於,和名空間由於訪問方式不同,命名沖突和遮蔽有些特殊。
函數和全局域,基本不會和類作用域有命名沖突,除非類方法內部。
命名空間,可以避免命名沖突。
類繼承體系中,則有遮蔽現象。
還有訪問許可權問題。
實際上,全局變數,有兩個概念可以判定
1)作用域(空間)===>由定義和聲明位置,和定義和聲明使用的關鍵字決定。
2)生命周期(時間)===>外部和靜態變數,的生命周期是全局的,從初始化到程序結束。
函數參數,和函數局部非靜態變數,是局部變數
函數參數的傳遞,是跨函數的(實參,變成形參);
函數內部定義的,局部變數,只有定義處可見,作用域是函數甚至語句組局部,
其中靜態變數,生命周期是全局的,非靜態是函數甚至語句組的。
全局變數,不是C,C++的概念。
而是,使用編程語言的程序員的概念。
所以,全局變數和C,C++的存儲類型,作用域,生命周期等,不是一一對應的概念。
所以,可以有不同的理解。
所以這個概念是很模糊的,不清晰的。
比如局部靜態變數,類的靜態變數,是否全局變數,就不是可以清晰的說明的。
㈢ 編譯器怎麼知道是全局變數還是局部變數
這個要細說,能說的很詳細,我說一下,比較好理解的你就懂了!
我說之前先打個比方:小區人家,幾十戶,每家每戶都有燈光自己用就是局部的
月亮..全局的.都能用懂了?
按照目前的面向對象來說如Java,C++,C#,Ruby中,由於變數都是封裝在類裡面的,對別的類不可見,所以已經幾乎完全拋棄了全局變數的概念。然而,可以通過把一個類定義為public static,把類成員變數也定義為public static,使該變數在內存中佔用固定、唯一的一塊空間,來實現全局變數的功能。
說通俗點,你如果想理解,就假如在一個類中,看你定義的變數,位置!類中,方法外面,就屬於全局,每個方法都能拿去用..方法裡面定義的,就屬於局部的,只能他自己用.懂了?
和你一樣初學者,不足之處還請指點!
㈣ 程序的局部變數 全局變數 動態申請數據分別存儲在什麼地方
程序的局部變數全局變數動態申請數據分別存儲在棧里。
普通局部變數在堆棧空間上分配,當局部變數的函數被多次調用時,局部變數每次在堆棧上的位置都不相同。還可以在堆上動態分配局部變數(malloc),但是要記住在耗盡堆空間後釋放zd。
內存分配上的棧空間時要注意內存的,不能分配太多的內存。如果堆棧中的空間小於請求的空間大小,則系統將顯示堆棧溢出並給出相應的異常信息。但堆不同,堆可分配空間很大。

(4)編譯器和局部變數區別擴展閱讀:
注意事項:
對局部變數進行分類
1.位置:編譯器將靜態局部變數放在全局存儲區域中。數據,因此盡管它是本地的,但它存在於程序的整個生命周期中(它在定義時產生,並隨著程序的結束而結束)。
2.訪問許可權:靜態局部變數只能由其作用域內的變數或函數訪問。也就是說,盡管它將存在於程序的整個生命周期中,但是其他函數和源文件不能訪問它,因為它是靜態的。
3.值:如果用戶沒有初始化靜態局部變數,編譯器會自動將其賦值為0,每次調用靜態局部變數時都會使用最後一次調用後的值。
㈤ 全局變數和局部變數有什麼區別是怎麼實現的操作系統和編譯器是怎麼知道的
定義在函數之外的是全局變數,函數內的是局部變數。例如#include
<...>int
a=10,b=15;int
get(void){return
a+b;}void
main(){int
c,d;c=a;d=b;}a,b就是全局變數,可以在任何函數中調用它。c,d是局部變數,只能在main中使用它。
