全局變量與局部變量重名


 

  1. 函數內部定義的局部變量與全局變量重名時,函數在使用該變量的時候會以局部變量覆蓋全局變量。也就是只有局部變量會起效果。在此定義域中賦值等操作時都不會使用到全局變量。
  2. 在main函數或其他函數里定義了局部變量,同時同名的全局變量同時也存在,當調用一個使用了該變量的函數(該變量在此函數中無定義)時,函數會使用全局變量。而不是main或其他函數中定義的同名變量。例如
    1. #include <stdio.h>
      #include <stdlib.h>
      
      int n=5;
      void fun(int m)
      {
          int n=1;
          if(m<10)
          {
              fun(m+1);
              printf("%d ",n++);
          }
      
      }
      void print() { printf("%d\n",n); }

      /*void printm()
      {
        printf("%d\n",m)
      }*/
      int main() { int n; scanf("%d",&n); printf("%d\n",n); print(); fun(n);
       // int m=10;
      // printm(); return 0; }

      輸入3時, 運行結果為: 3  5 ,1 1 1 1 1 1 1 。(以上注釋掉的部分為測試使用)

  3. 當第一次輸出的時候,只是調用輸出了在main()函數里邊定義的n,所以當輸入3時,只有main里邊定義的n被改變成為3,然后下一句輸出n就直接輸出的是上邊剛剛賦值了的3。
  4. 調用print函數時輸出的結果為5,雖然print函數里只有一句printf(),看似與上邊的輸出語句並無其他區別,但此時print函數只能得到全局變量n,雖然在main函數里有對print()函數的調用,但是print()函數與main函數還是屬於兩個作用域,main中定義的局部變量n並不能影響print()函數中對n的使用,所以print函數使用的還是全局變量n。
  5. 在遞歸函數fun()中,每次都對聲明局部變量n=1,然后每次函數發生遞歸的時候printf()函數中都會對n進行++操作,然而輸出的全是1,這是由於當函數發生遞歸的時候調用自己,但是每次調用printf()函數時候,都使用的是自己的局部變量n=1,並不會受上一層n的影響也不會影響到上一層的n,更不會受全局變量n=5的影響。
  6. 我們假設當無全局變量,只有函數自己定義的局部變量的時候,函數調用printm()函數輸出m,看能不能輸出main中定義的m的值,結果連編譯都過不了,因為對於printm()函數來說,這個m到底是個啥東西啊,查找周圍並沒有對m的定義,(然而並不查找到人家main函數里邊去)。所以對於函數來說首先是自己定義的局部變量,其次是大家共有的全局變量。即使是遞歸,各自層的變量之間也不會相互影響。

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM