Fortran 子程序變量的局部性

2023-12-29 14:55 更新

子程序中定義的局部變量和參數(shù)獨立于主程序。也就是說,當我們在主程序和子程序中同時定義相同名稱的變量時,其實它們之間也是不同的。只有當我們在調用子程序時使用主程序中同名的變量對參數(shù)進行賦值時,主程序和子程序的同名變量才會具有相同的值。

如下面的示例 1 所示,編譯執(zhí)行的結果并非是期待的 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

!!! 執(zhí)行結果
>>> 2.80259693E-45 0.00000000

當我們修改為帶初始化變量的子程序時,如示例 2 所示,編譯執(zhí)行的結果和期待的一樣。

!!! 示例 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

!!! 執(zhí)行結果
>>> 10.0000000 30.0000000

這兩個例子的對比再一次證明了子程序中定義的變量所具有的局部性,必須通過參數(shù)傳遞的方式才能與主程序同名變量保持一樣的初始化值。同樣地,這種局部性也會讓主程序的變量值不會因為子程序的同名變量值發(fā)生改變而改變。

有人可能會有疑問,如果子程序中的參數(shù)使用的變量名與主程序的變量名不一致,調用能不能成功呢?當然是能夠成功的。如下所示,將示例 2 中子程序原來的參數(shù) x 和 y 換成 a 和 b,依然可以輸出正確結果。

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

!!! 執(zhí)行結果
>>> 10.0000000 30.0000000
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號