---------------------- 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教育訓練、期待與您交流! ----------------------