Fortran 子程序变量的局部性

2023-12-29 14:55 更新

子程序中定义的局部变量和参数独立于主程序。也就是说,当我们在主程序和子程序中同时定义相同名称的变量时,其实它们之间也是不同的。只有当我们在调用子程序时使用主程序中同名的变量对参数进行赋值时,主程序和子程序的同名变量才会具有相同的值。

如下面的示例 1 所示,编译执行的结果并非是期待的 10.0 和 30.0。

!!! 示例 1
program stest1
implicit none
real x, y
x = 10.0
y = 30.0
call subr1
end program stest1

subroutine subr1
implicit none
real x, y
print *, x, y
end subroutine subr1

!!! 执行结果
>>> 2.80259693E-45 0.00000000

当我们修改为带初始化变量的子程序时,如示例 2 所示,编译执行的结果和期待的一样。

!!! 示例 2
program stest2
implicit none
real x, y
x = 10.0
y = 30.0
call subr2(x, y)
end program stest2

subroutine subr2(x, y)
implicit none
real x, y
print *, x, y
end subroutine subr2

!!! 执行结果
>>> 10.0000000 30.0000000

这两个例子的对比再一次证明了子程序中定义的变量所具有的局部性,必须通过参数传递的方式才能与主程序同名变量保持一样的初始化值。同样地,这种局部性也会让主程序的变量值不会因为子程序的同名变量值发生改变而改变。

有人可能会有疑问,如果子程序中的参数使用的变量名与主程序的变量名不一致,调用能不能成功呢?当然是能够成功的。如下所示,将示例 2 中子程序原来的参数 x 和 y 换成 a 和 b,依然可以输出正确结果。

subroutine subr2(a, b)
implicit none
real a, b
print *, a, b
end subroutine subr2

!!! 执行结果
>>> 10.0000000 30.0000000
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号