子程序中定義的局部變量和參數(shù)獨(dú)立于主程序。也就是說,當(dāng)我們在主程序和子程序中同時(shí)定義相同名稱的變量時(shí),其實(shí)它們之間也是不同的。只有當(dāng)我們在調(diào)用子程序時(shí)使用主程序中同名的變量對參數(shù)進(jìn)行賦值時(shí),主程序和子程序的同名變量才會(huì)具有相同的值。
如下面的示例 1 所示,編譯執(zhí)行的結(jié)果并非是期待的 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í)行結(jié)果
>>> 2.80259693E-45 0.00000000
當(dāng)我們修改為帶初始化變量的子程序時(shí),如示例 2 所示,編譯執(zhí)行的結(jié)果和期待的一樣。
!!! 示例 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í)行結(jié)果
>>> 10.0000000 30.0000000
這兩個(gè)例子的對比再一次證明了子程序中定義的變量所具有的局部性,必須通過參數(shù)傳遞的方式才能與主程序同名變量保持一樣的初始化值。同樣地,這種局部性也會(huì)讓主程序的變量值不會(huì)因?yàn)樽映绦虻耐兞恐蛋l(fā)生改變而改變。
有人可能會(huì)有疑問,如果子程序中的參數(shù)使用的變量名與主程序的變量名不一致,調(diào)用能不能成功呢?當(dāng)然是能夠成功的。如下所示,將示例 2 中子程序原來的參數(shù) x 和 y 換成 a 和 b,依然可以輸出正確結(jié)果。
subroutine subr2(a, b)
implicit none
real a, b
print *, a, b
end subroutine subr2
!!! 執(zhí)行結(jié)果
>>> 10.0000000 30.0000000
更多建議: