国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

細說C++全局變量、局部變量和靜態局部變量

2020-05-23 14:28:40
字體:
來源:轉載
供稿:網友
我們已經在前面學習了變量,并且能夠熟練地使用它??墒?,僅僅靠這些知識,有些問題仍然無法得到解決。

標志符

首先要來介紹一下什么是標志符。在程序設計的過程中,經常要給變量、函數甚至是一些數據類型起名字(還包括以后的類名,對象名等)。我們把這些用戶根據一些規定,自己定義的各種名字統稱為標志符(Identifier)顯然,標志符不允許和任何保留字相同。

全局變量和局部變量

在函數這一章節中,我們說過函數體內聲明的變量僅在該函數體內有效,別的函數是無法使用的。并且在函數運行結束后,這些變量也將消失了。我們把這些在函數體內聲明的變量稱為局部變量(Local Variable)

然而,可能會遇到這樣的問題:我們想要創建一個變量作為數據緩沖區(Buffer),分別供數據生成、數據處理和數據輸出三個函數使用,三個函數都要能夠讀取或修改這個變量的值。顯然通過傳遞參數或返回值來解決這個問題是非常麻煩的。

那么,我們能否建立一個變量能夠讓這三個函數共同使用呢?在C++中,我們可以在函數體外聲明一個變量,它稱為全局變量(global variable)。所謂全局,是指對于所有函數都能夠使用。當然,在該變量聲明之前出現的函數是不知道該變量的存在的,于是也就無法使用它了。另外,如果我們聲明了一個全局變量之后沒有對它進行初始化操作,則編譯器會自動將它的值初始化為0

下面,我們就用全局變量來實現剛才提出的那個問題:(程序11.1.1)
#include "iostream.h"
#include "stdlib.h"//用于產生隨機數,不必理會
#include "time.h"//用于產生隨機數,不必理會
#include "iomanip.h"//用于設置域寬
void makenum();
void output();
void cal();
int main()
{
   srand(time(NULL));//用于產生隨機數,不必理會
   for (int i=0;i<4;i++)
   {
      makenum();//產生隨機數放入緩沖區
     cal();//對緩沖區的數進行處理
      output();//輸出緩沖區的數值
   }
   return 0;
}
int buffer;//定義全局變量,以下函數都能使用它
void makenum()
{
   cout <<"Running make number..." <<endl;
   buffer=rand();//把產生的隨機數放入緩沖區
}
void cal()
{
   cout <<"Running calculate..." <<endl;
   buffer=buffer%100;
}
void output()
{
   cout <<"Running output..." <<endl;
   cout <<setw(2) <<buffer <<endl;
}

運行結果:
Running make number...
Running calculate...
Running output...
48
Running make number...
Running calculate...
Running output...
47
Running make number...
Running calculate...
Running output...
24
Running make number...
Running calculate...
Running output...
90
以上為某次運行得到的隨機結果??梢姡褂萌肿兞渴沟枚鄠€函數之間可以共享一個數據,同時從理論上實現了函數之間的通訊。 

靜態局部變量

全局變量實現了函數之間共享數據,也使得變量不再會因為某個函數的結束而消亡。但是,新問題又出現了:一個密碼檢測函數根據調用(用戶輸錯密碼)的次數來限制他進入系統。如果把調用次數存放在一個局部變量里,顯然是不可行的。雖然全局變量可以記錄一個函數的運行次數,但是這個變量是被所有函數共享的,每個函數都能修改它,實在很危險。我們現在需要的是一個函數運行結束后不會消失的,并且其他函數無法訪問的變量。

C++中,我們可以在函數體內聲明一個靜態局部變量(Static Local Variable)。它在函數運行結束后不會消失,并且只有聲明它的函數中能夠使用它。聲明一個靜態局部變量的方法是在聲明局部變量前加上static,例如:
    static int a;
和全局變量類似,如果我們沒有對一個靜態局部變量做初始化,則編譯器會自動將它初始化為0。

下面,我們就用靜態局部變量來模擬一下這個密碼檢測函數的功能:(程序11.1.2)
#include "iostream.h"
#include "stdlib.h"
bool password();//密碼檢測函數
int main()
{
   do
   {
   }
   while (password()!=true);//反復檢測密碼直到密碼正確
   cout <<"歡迎您進入系統!" <<endl;
   return 0;
}
bool password()
{
   static numOfRun=0;//聲明靜態局部變量存放函數調用次數
   if (numOfRun<3)
   {
      int psw;
      cout <<"第" <<++numOfRun <<"次輸入密碼" <<endl;
      cin >>psw;
      if (psw==123456)
      {
         return true;
      } 
      else
      {
         cout <<"密碼錯誤!" <<endl;
         return false;
      }
   }
   else
   {
      cout <<"您已經輸錯密碼三次!異常退出!" <<endl;
      exit(0);//退出程序運行
   }
}
第一次運行結果:
第1次輸入密碼
111111
密碼錯誤!
第2次輸入密碼
222222
密碼錯誤!
第3次輸入密碼
0
密碼錯誤!
您已經輸錯密碼三次!異常退出!

第二次運行結果:
第1次輸入密碼
000000
密碼錯誤!
第2次輸入密碼
123456
歡迎您進入系統!

使用靜態局部變量可以讓函數產生的數據更長期更安全地存儲。如果一個函數運行和它以前的運行結果有關,那么一般我們就會使用靜態局部變量。  
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汽车| 康保县| 铜鼓县| 梁河县| 建湖县| 伊宁市| 舞阳县| 林周县| 龙游县| 宝丰县| 庆城县| 喀什市| 布尔津县| 古田县| 新昌县| 漾濞| 张北县| 班戈县| 滦南县| 叶城县| 砀山县| 公主岭市| 大宁县| 江油市| 宿州市| 涟源市| 航空| 满洲里市| 汉寿县| 上蔡县| 汉中市| 铁岭县| 龙南县| 卓资县| 石泉县| 三门峡市| 宽甸| 苍南县| 龙口市| 思茅市| 措美县|