程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C/C++要點全掌握(一)

C/C++要點全掌握(一)

編輯:C++入門知識

 

  最近參加了幾個公司到學校的招聘會,筆試時大多要求使用C/C++語言,而且有些筆試考到了語言的細節部分。說來汗顏,C/C++只在大一學習時使用了一年,之後一直在學習高級語言的組件開發,到現在C/C++語言的有些細節,部分已經忘記。在此將C/C++的基礎要點重拾一遍,以便往後忘記之時查閱。

 

1、局部變量存儲於堆棧上,堆棧是一個動態可變的存儲區,所以局部變量是在聲明它們的塊入口處創建,出口處銷毀。

 

2、全局變量存儲在一個編譯器設定的固定存儲區中。他們在程序運行的整個時間內占據空間。

 

3、聲明與定義的區別:聲明說明變量的名稱及類型;定義會導致給變量分配內存。同一變量可以有許多聲明,但僅有一個定義。

 

4、大多數情況下,變量聲明也是定義。通過在extern限定符關鍵字可以聲明變量而沒有定義它,但要記住在程序的後面其他部分定義該變量。

 

fun1() 

  extern int a;//聲明a為全局變量,其將在後面定義 

  ... 

... 

int a;//定義全局變量 

 

注:如果將”int a;”定義語句放在函數fun1前,則在fun1中就不必再聲明a為全局變量,因為編譯器已經知道a為一個已經定義了的全局變量了。語句“extern int a;”只是聲明一個變量而沒有定義它,如果在聲明時給該變量賦初值,即語句”extern int a=1;”,那麼該聲明就變成了一個定義全局變量語句。顯然,在fun1內不能使用該語句,否則編譯器會給出一個“不能對帶有塊范圍的外部變量進行初始化”的錯誤提示。

 

5、靜態變量是永久變量,在兩次調用之間它們的值是不變的(其實這點全局變量也滿足了!)。靜態變量分為靜態局部變量和靜態全局變量兩種。使用static修飾變量時,編譯器像全局變量一樣為之創建永久的存儲區,但區別是靜態局部變量只在其所在塊內可知,而靜態全局變量則只在其所在文件可知。這樣,static就使變量僅為需要它們的函數(部分)所知,一定程度上“隱藏”了靜態變量,使其相對與其他部分是“透明”的。

注:在C++應當使用命名空間從而更好的達到上述目的。

 

6、函數和全局變量有外部鏈接,當指定extern時(大多數情況是不必指定的,因為函數默認就是extern的,而在非塊內定義變量默認是extern變量),他們對組成程序的所有文件都是可用的;靜態全局變量有內部鏈接,當指定static時,他們對所在文件內是可知的;局部變量沒有鏈接。

注:其實靜態全局變量還可當作全局變量,只是其可知范圍被縮小了,只在本文件可知;靜態局部變量也可當作局部變量,只是其生命周期被延長了,不像局部變量一樣在塊出口銷毀,而其可知范圍未變。

舉一例說明下靜態局部變量的使用優點:

 

//返回增加後的引用計數,count在其他部分不可訪問 

int AddRef() 

{    

 //靜態局部變量,只在本函數內可知,只在第一次調用分配內存 

 //靜態變量如果未賦初值將被置為類型默認值    

 static int count=0; //該語句可看作只在第一次調用執行,以後調用僅起聲明作用    

 count++;    

 return count; 

 

//counter在本文件其他部分可被訪問 

static int counter=0;//靜態全局變量,在本文件內可知 

 

int func1() 

{    

  ...   

  return AddRef();//返回調用func1次數 

 

7、寄存器變量(用register修飾)要求編譯器把一個變量的值保存在CPU寄存器而不是內存中,使對寄存器變量的操作比普通內存變量快。使用寄存器變量應注意以下幾點:只能用register修飾局部變量和形式參數;在C中不能通過&運算符取寄存器變量地址;在C++取寄存器變量地址可能阻止它被優化。

 

8、C和C++中都沒有指定表達式中子表達式的求值順序,如果有以下語句:

 

X=f1()+f2(); 

而f1()和f2()的執行結果又依賴於同一個共享變量且會修改該變量,那麼應該根據邏輯人為指定他們的執行順序。

 


摘自 tht的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved