程式設計基礎:全域性變數和區域性變數
外觀
全域性變數 - 在程式開始時宣告,其全域性作用域意味著它可以在程式中的任何過程或子程式中使用
很少建議使用全域性變數,因為它們容易導致錯誤,浪費記憶體,並且在跟蹤程式碼時難以理解。如果您宣告一個全域性變數,它將在程式執行時繼續使用記憶體,即使您不再需要/使用它。
區域性變數 - 在子程式或程式設計塊中宣告,其區域性作用域意味著它們只能在宣告它們的子程式或程式塊中使用
區域性變數在有限的範圍內初始化,這意味著它們在呼叫函式或子程式時宣告,並且函式結束後,變數佔用的記憶體將被釋放。這與全域性變數形成對比,全域性變數不會釋放記憶體。
看看這個例子
Module Glocals
Dim number1 as integer = 123
Sub Main()
console.writeline(number1)
printLocalNumber()
printGlobalNumber()
End Sub
Sub printLocalNumber
Dim number1 as integer = 234
console.writeline(number1)
End Sub
Sub printGlobalNumber
console.writeline(number1)
End Sub
End Module
輸出會是什麼?
為什麼是這樣? 好像我們有兩個版本的變數 number1。
- 第一個版本在第 2 行宣告,它不在任何子例程中宣告,因此該變數具有全域性作用域
- 第二個版本在 printLocalNumber 子例程中宣告。由於它是在子例程中宣告的,因此它只能在該子例程中使用。在第 12 行,當我們使用:
console.writeline(number1)時,它會打印出區域性變數
因此,檢視 main 子例程中的程式碼,我們有 3 種不同的方法可以打印出變數 number1。
- 第 5 行。
console.writeline(number1):這使用 number1 的全域性值,因為它在一個沒有其他區域性宣告的子例程中 - 第 6 行。
printLocalNumber():這呼叫了子例程printLocalNumber(),其中包含一個區域性變數 number1,該變數在第 11 行中宣告,因此它使用在第 11 行宣告的 number1 值。 - 第 7 行。
printGlobalNumber():這呼叫了子例程printGlobalNumber(),該子例程沒有 number1 的區域性變數,因此它使用 number1 的全域性值

經驗法則:如果您想快速區分全域性變數和區域性變數,請使用這些快速規則。但要注意,他們可能會試圖欺騙你!
- 如果一個變數在函式或過程中宣告,它就是一個區域性變數
- 如果一個變數在迭代或選擇語句中宣告,它就是一個區域性變數
- 如果宣告從左側邊界縮排,它可能滿足上述其中一個條件,並且是區域性的
- 如果它不滿足上述任何條件,並且在程式碼的主體中宣告,它就是一個全域性變數
|
標題 全域性變數和區域性變數有什麼區別?
答案 全域性變數可以從程式的所有部分訪問,而區域性變數只能在程式設計結構(如迴圈、函式或過程)內訪問
為什麼使用區域性變數而不是全域性變數是個好主意?
答案 區域性變數在您完成使用後會釋放記憶體,全域性變數始終儲存在記憶體中,無論您是否需要它們
在什麼情況下您可能想要使用全域性變數?
答案 當您想要宣告一個需要被程式碼所有部分訪問的變數時
列出以下程式碼的全域性變數和區域性變數。輸入 Module calcAge
Sub Main()
dim age as integer
console.writeline("age?")
age = console.readline()
printMonths(age)
printDays(age)
End Sub
Dim months as integer
Sub printDays(a)
Dim d as integer
d = a * 365
console.writeline(d)
End Sub
Sub printMonths(a)
months = a * 12
console.writeline(months)
End Sub
End Module
對於上面的程式碼,如何使程式碼更高效,以及為什麼它會更高效?
答案 將
months變數放在printMonths(a)子例程中,使其成為區域性變數。如果您將其保留為全域性變數,即使您不需要它,它也會佔用記憶體。列出以下程式碼中的全域性變數和區域性變數,列出輸出 Module greetings
Dim q as integer = 6
Sub sayGoodbye()
for y = 1 to q
console.write("bye,")
loop
End Sub
Sub sayHello()
dim q as integer = 4
if q =< 4 then
console.write("hi,")
else
console.write("hello,")
endif
End Sub
Sub Main()
console.writeline(q)
sayHello()
sayGoodbye()
console.writeline(q)
End Sub
End Module
|
