<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                【57.1 變量前加入static后發生的“化學反應”。】 有兩類變量,一類是全局變量,一類是局部變量。定義時,在任何一類變量前面加入static關鍵詞,變量原有的特性都會發生某些變化,因此,static像化學的催化劑,具有神奇的功能。加static關鍵詞的書寫格式如下: static unsigned char a; //這是在全局變量前加的static關鍵詞 void HanShu(void) { static unsigned char i; //這是在局部變量前加的static關鍵詞 } 【57.2 在全局變量前加static。】 static讀作“靜態”,全局變量前加static,稱為靜態全局變量。靜態全局變量和普通全局變量的功能大體相同,僅在有效范圍(作用域)方面有差異。假設整個工程有多個文件組成,普通全局變量的有效范圍能覆蓋全部文件,在任何一個文件里,以及跨文件與文件之間,在傳遞信息的層面上都暢通無阻。而靜態全局變量只能在當前定義的那個文件里起作用,活動范圍完全被限定在一個文件,彷佛被加了緊箍咒,由不得你任性,在傳遞信息的層面上僅僅局限于定義變量時所在的那一個文件。這部分的內容有個大致印象就可以,暫時不用深入研究,等以后學到“多文件編程”時再關注,因為我當前的程序例子只有一個源文件,還沒涉及“多文件編程”。 【57.3 在局部變量前加static。】 這是本節重點。我常把局部變量比喻賓館的客房,客人入住時被分配在哪間客房是隨機臨時安排的,第二天退房時賓館會把客房收回繼續分配給下一位其他的客人,是臨時公共區。而加入static后的局部變量,發生了哪些變化?加入static后的局部變量,稱為靜態局部變量。靜態局部變量就像賓館的VIP客戶,VIP客戶財大氣粗,把賓館分配的客房永遠包了下來,永遠不許再給其它客人入住。總結了靜態局部變量的兩個重要特性: 第一個,靜態局部變量不會在函數調用時被初始化,它只在單片機剛上電時被初始化了一次,因為它的內存模型不是分配在“棧”,而是跟全局變量一樣放在“全局數據區”,擁有自己唯一的地址。因此,靜態局部變量的數值跟全局變量一樣,具有“記憶”功能,你每次調用某個函數,函數內部的靜態局部變量的數值是維持最后一次被更改的數值,不會被“清零”的。但是跟全局變量又有差別,全局變量的有效范圍(作用域)是整個工程,而靜態局部變量畢竟是“局部”,在傳遞信息的層面僅局限于當前函數內。而普通局部變量,眾所周知,每次被函數調用時,都會被重新初始化,會被“清零”的,沒有“記憶”功能的。 第二個,每次函數調用時,靜態局部變量比普通局部變量少開銷一條潛在的“初始化語句”,原因是普通局部變量每次被函數調用時都要重新初始化,而靜態局部變量不用進行這個操作。也就是說,靜態局部變量比普通局部變量的效率高一點,雖然這個“點”的時間開銷微不足道,但是寫程序時不能忽略這個“點”。靜態局部變量用到好處之時,能體現一個工程師的功力。 【57.4 靜態局部變量的應用場合。】 靜態局部變量適用在那些“頻繁調用”的函數,比如main函數主循環while(1)里直接調用的所有函數,還有以后講到的定時器中斷函數,等等。因為靜態局部變量每次被調用都不會被重新初始化,用在這類函數時就省去了每次初始化語句的時間。還有一類用途,就是那些規定不能被函數初始化的場合,比如在很多用switch搭建程序框架的函數里,這類switch程序框架俗稱為狀態機思路。 【57.5 能用全局變量替代靜態局部變量嗎?】 能用全局變量替代靜態局部變量嗎?能。哪怕在整個程序里全部用全局變量都可以。全局變量是一把牛刀,什么場合都用牛刀雖然也能解決問題,但是顯得魯莽沒有條理。盡量把全局變量,普通局部變量,靜態局部變量各自優勢充分發揮出來才是編程之道。能用局部變量的盡量用局部變量,這樣可以減少全局變量的使用。當局部變量幫分擔一部分工作時,最后全局變量只起到一個作用,那就是在各函數之間傳遞信息。局部變量與全局變量的分工定位明確了,程序代碼閱讀起來就沒有那么凌亂,思路也清晰很多。 【57.6 例程練習和分析。】 現在編寫一個程序來熟悉static的性能。 /\*---C語言學習區域的開始。-----------------------------------------------\*/ //函數的聲明。 unsigned char HanShu(void); unsigned char HanShu\_static(void); //變量的定義。 unsigned char a; //用來接收函數返回的結果。 unsigned char b; unsigned char c; unsigned char d; unsigned char e; unsigned char f; //函數的定義。 unsigned char HanShu(void) { unsigned char i=0; //普通局部變量,每次函數調用都被初始化為0. i++; //i自加1 return i; } unsigned char HanShu\_static(void) { static unsigned char i=0; //靜態局部變量,只在上電是此初始化語句才起作用。 i++; //i自加1 return i; } void main() //主函數 { //下面函數內的i是普通局部變量,每次調用都會被重新初始化。 a=HanShu(); //函數內的i每次重新初始化為0,再自加1,所以a等于1。 b=HanShu(); //函數內的i每次重新初始化為0,再自加1,所以b等于1。 c=HanShu(); //函數內的i每次重新初始化為0,再自加1,所以c等于1。 //下面函數內的i是靜態局部變量,第一次上電后默認為0,就不會再被初始化, d=HanShu\_static(); //d由0自加1后等于1。 e=HanShu\_static(); //e由1自加1后等于2。 f=HanShu\_static(); //f由2自加1后等于3。 View(a); //把第1個數a發送到電腦端的串口助手軟件上觀察。 View(b); //把第2個數b發送到電腦端的串口助手軟件上觀察。 View(c); //把第3個數c發送到電腦端的串口助手軟件上觀察。 View(d); //把第4個數d發送到電腦端的串口助手軟件上觀察。 View(e); //把第5個數e發送到電腦端的串口助手軟件上觀察。 View(f); //把第6個數f發送到電腦端的串口助手軟件上觀察。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 在電腦串口助手軟件上觀察到的程序執行現象如下: 開始... 第1個數 十進制:1 十六進制:1 二進制:1 第2個數 十進制:1 十六進制:1 二進制:1 第3個數 十進制:1 十六進制:1 二進制:1 第4個數 十進制:1 十六進制:1 二進制:1 第5個數 十進制:2 十六進制:2 二進制:10 第6個數 十進制:3 十六進制:3 二進制:11 分析: 變量a為1。 變量b為1。 變量c為1。 變量d為1。 變量e為2。 變量f 為3。 【57.7 如何在單片機上練習本章節C語言程序?】 直接復制前面章節中第十一節的模板程序,練習代碼時只需要更改“C語言學習區域”的代碼就可以了,其它部分的代碼不要動。編譯后,把程序下載進帶串口的51學習板,通過電腦端的串口助手軟件就可以觀察到不同的變量數值,詳細方法請看第十一節內容。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看