<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] # 簡介 我們知道,全局變量和函數的作用域默認是整個程序,也就是所有的源文件,這給程序的模塊化開發帶來了很大方便,讓我們能夠在模塊 A 中調用模塊 B 中定義的變量和函數,而不用把所有的代碼都集中到一個模塊。 但這有時候也會引發命名沖突的問題,例如在 a.c 中定義了一個變量 n,在 b.c 中又定義了一次,鏈接時就會發生重復定義錯誤,原因很簡單,變量只能定義一次。 如果兩個文件都是我們自己編寫的或者其中一個是,遇到這樣的情況還比較好處理,修改變量的名字即可;如果兩個文件都是其他程序員編寫的,或者是第三方的庫,修改起來就頗費精力了。 實際開發中,我們通常將不需要被其他模塊調用的全局變量或函數用**static**關鍵字來修飾,static 能夠將全局變量和函數的作用域限制在當前文件中,在其他文件中無效。下面我們通過一個實例來演示。 module.c 源碼: ~~~ #include <stdio.h> static int n = 999; static void say(){ printf("Hello World!\n"); } ~~~ main.c 源碼: ~~~ #include <stdio.h> int n = 100; void say(){ printf("http://c.biancheng.net\n"); } int main(){ say(); printf("n = %d\n", n); return 0; } ~~~ 運行結果: ~~~ http://c.biancheng.net n = 100 ~~~ 我們在 module.c 中定義了變量 n 和函數 say(),它們都被 static 修飾,所以只在 module.c 中有效,在 main.c 中是不可見的。從輸出結果也可以看出,main.c 使用了自己的變量和函數,而沒有使用 module.c 中的。 使用 static 修飾的變量或函數的作用域僅限于當前模塊,對其他模塊隱藏,利用這一特性可以在不同的文件中定義同名的變量或函數,而不必擔心命名沖突。 # static 局部變量 static 除了可以修飾全局變量,還可以修飾局部變量,被 static 修飾的變量統稱為靜態變量(Static Variable)。 不管是全局變量還是局部變量,只要被 static 修飾,都會存儲在全局數據區(全局變量本來就存儲在全局數據區,即使不加 static)。 全局數據區的數據在程序啟動時就被初始化,一直到程序運行結束才會被操作系統回收內存;對于函數中的靜態局部變量,即使函數調用結束,內存也不會銷毀。 **注意:全局數據區的變量只能被初始化(定義)一次,以后只能改變它的值,不能再被初始化,即使有這樣的語句,也無效。** 請看下面的代碼: ~~~ #include <stdio.h> int func(){ // 也可以不賦初值 0,靜態數據區的變量默認初始化為 0 static int n = 0; n++; printf("Function is called %d times.\n", n); return n; } int main(){ int i, n = 0; for(i = 1; i<=5; i++){ func(); } printf("n = %d\n", n); return 0; } ~~~ 運行結果: ~~~ Function is called 1 times. Function is called 2 times. Function is called 3 times. Function is called 4 times. Function is called 5 times. n = 0 ~~~ 我們在 func() 中定義了一個靜態局部變量 n,它存儲在全局數據區,func() 函數執行結束不會被銷毀,下次調用繼續有效。全局數據區的變量只能初始化一次,第一次調用 func() 時已經對 n 進行了初始化,所以再次調用時就不會重復初始化了,也就是說`static int result = 0;`語句無效。 靜態局部變量雖然存儲在全局數據區,但是它的作用域僅限于函數內部,sum() 中的 n 在函數外無效,與 main() 中的 n 不沖突,除了變量名一樣,沒有任何關系。 總結起來,static 變量主要有兩個作用: **隱藏** 程序有多個模塊時,將全局變量或函數的作用范圍限制在當前模塊,對其他模塊隱藏。 **保持變量內容的持久化** 將局部變量存儲到全局數據區,使它不會隨著函數調用結束而被銷毀。
                  <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>

                              哎呀哎呀视频在线观看