天天看點

黑馬程式員_C語言中變量作用域問題

---------------------- ASP.Net+Unity開發、.Net教育訓練、期待與您交流! ----------------------

示例代碼一:

#include <stdio.h>
int main()
{
	    int score = 100;
    
    {
        int score = 200;
        
        {
            score = 50;
        }
        
        printf("score=%d\n", score);
    }
    
    printf("score=%d\n", score);
    
    
    return 0;
}
           

輸出結果:score=50

          score=100

變量的作用域:從定義變量的那一行代碼開始,一直到所在的代碼塊結束。代碼塊結束時,代碼塊内所定義的變量(存儲空間)将被回收,是以第二個printf函數的輸出結果為:score=100,而不是score=200。在代碼塊{ score = 50; }中,由于該代碼塊中沒有定義score變量,是以在進行指派操作時,會到該代碼塊外面(上一層代碼塊中)找score變量,并進行指派操作。是以,此時上一層代碼塊中的score變量的值已經變為50,而不是原來的200了。又由于就近原則,第一個printf函數通路score變量時,就在其所在的代碼塊中找score變量。而此時該代碼塊中score的值為50,是以第一個printf函數的輸出結果為:score=50。若把代碼塊{ score = 50; }改為:{ int score = 50; },此時不會修改上一層代碼塊中score的值,因為該代碼塊内定義了自己的score變量,是以指派操作隻會對該代碼塊内的score起作用,該代碼塊結束時,其中的score變量會被回收,此時,第一個printf函數的輸出結果将會變為:score=200。

示例代碼二:

#include <stdio.h>
int main()
{
  	if (10 > 6)
  {
  	int a = 5; 
  } 
  printf ("%d\n", a);  
  return 0;
}
           

此時編譯器會報錯,因為變量a的作用域隻限于其所在的代碼塊内部,該代碼塊結束時,變量a将會被回收。是以printf函數通路不到變量a,編譯報錯。

示例代碼三:

#include <stdio.h>
int main()
{
  if (10 > 6)
  	int a = 5;
  return 0;
}
           

此時編譯器也會報錯,因為此時變量a的作用域不明确,編譯器不知道變量a的作用域,會直接報錯,應将if後面的代碼用大括号包住。(如果在if語句後面定義新的變量,必須用大括号。)

示例代碼四:

#include <stdio.h>
int main()
{
	char c = '+';
    int a = 10;
    int b = 20;
    switch (c) {
        case '+':
			int sum = a + b;
            printf("和是%d\n", sum);
            break;  
        case '-':
			int minus = a - b;
            printf("差是%d\n", minus);
            break;
	}
	return 0;
}
           

這段代碼編譯時同樣會報錯,犯的錯誤與示例代碼三一樣,都是變量作用域不明确,代碼中變量sum與變量minus的作用域不明确,應将case後面的代碼用大括号包住。(如果要在case後面定義新的變量,必須用大括号{}包住。)

---------------------- ASP.Net+Unity開發、.Net教育訓練、期待與您交流! ----------------------