跳轉到內容

程式設計基礎:全域性變數和區域性變數

來自華夏公益教科書

試卷 1 - ⇑ 程式設計基礎 ⇑

← 子程式(函式和過程) 全域性變數和區域性變數 堆疊幀 →


全域性變數 - 在程式開始時宣告,其全域性作用域意味著它可以在程式中的任何過程或子程式中使用

很少建議使用全域性變數,因為它們容易導致錯誤,浪費記憶體,並且在跟蹤程式碼時難以理解。如果您宣告一個全域性變數,它將在程式執行時繼續使用記憶體,即使您不再需要/使用它。

區域性變數 - 在子程式或程式設計塊中宣告,其區域性作用域意味著它們只能在宣告它們的子程式或程式塊中使用


區域性變數在有限的範圍內初始化,這意味著它們在呼叫函式或子程式時宣告,並且函式結束後,變數佔用的記憶體將被釋放。這與全域性變數形成對比,全域性變數不會釋放記憶體。

看看這個例子

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

輸出會是什麼?

   程式碼輸出

123
234
123


為什麼是這樣? 好像我們有兩個版本的變數 number1。

  • 第一個版本在第 2 行宣告,它不在任何子例程中宣告,因此該變數具有全域性作用域
  • 第二個版本在 printLocalNumber 子例程中宣告。由於它是在子例程中宣告的,因此它只能在該子例程中使用。在第 12 行,當我們使用:console.writeline(number1)時,它會打印出區域性變數

因此,檢視 main 子例程中的程式碼,我們有 3 種不同的方法可以打印出變數 number1。

  1. 第 5 行。console.writeline(number1):這使用 number1 的全域性值,因為它在一個沒有其他區域性宣告的子例程中
  2. 第 6 行。printLocalNumber():這呼叫了子例程 printLocalNumber(),其中包含一個區域性變數 number1,該變數在第 11 行中宣告,因此它使用在第 11 行宣告的 number1 值。
  3. 第 7 行。printGlobalNumber():這呼叫了子例程 printGlobalNumber(),該子例程沒有 number1 的區域性變數,因此它使用 number1 的全域性值
我們可以視覺化不同變數的作用域

經驗法則:如果您想快速區分全域性變數和區域性變數,請使用這些快速規則。但要注意,他們可能會試圖欺騙你!

  • 如果一個變數在函式或過程中宣告,它就是一個區域性變數
  • 如果一個變數在迭代或選擇語句中宣告,它就是一個區域性變數
  • 如果宣告從左側邊界縮排,它可能滿足上述其中一個條件,並且是區域性的
  • 如果它不滿足上述任何條件,並且在程式碼的主體中宣告,它就是一個全域性變數
標題
全域性變數和區域性變數有什麼區別?

答案

全域性變數可以從程式的所有部分訪問,而區域性變數只能在程式設計結構(如迴圈、函式或過程)內訪問
為什麼使用區域性變數而不是全域性變數是個好主意?

答案

區域性變數在您完成使用後會釋放記憶體,全域性變數始終儲存在記憶體中,無論您是否需要它們
在什麼情況下您可能想要使用全域性變數?

答案

當您想要宣告一個需要被程式碼所有部分訪問的變數時


列出以下程式碼的全域性變數和區域性變數。輸入16的輸出是什麼?

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

答案

區域性變數:age, d

全域性變數:months

   程式碼輸出

age?
16
192
5840

對於上面的程式碼,如何使程式碼更高效,以及為什麼它會更高效?

答案

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

答案

區域性變數:y(在第 4 行),q(在第 9 行)

全域性變數:q(在第 2 行)

   程式碼輸出

6
hi,bye,bye,bye,bye,bye,bye
6

華夏公益教科書