跳转到内容

编程基础:全局变量和局部变量

来自维基教科书,开放世界中的开放书籍

试卷 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

华夏公益教科书