塊 DO 構造
do
構造是迴圈構造,其具有由迴圈控制控制的多個迭代
integer i
do i=1, 5
print *, i
end do
print *, i
在上面的形式中,迴圈變數 i
通過迴圈 5 次,依次取值 1 到 5。構造完成後,迴圈變數的值為 6,也就是說,迴圈變數在迴圈完成後再次遞增。
更一般地,do
環構造可以理解如下
integer i, first, last, step
do i=first, last, step
end do
迴圈以 i
開始,值為 first
,每次迭代遞增 step
直到 i
大於 last
(或者如果步長為負,則小於 last
)。
值得注意的是,自 Fortran 95 以來,迴圈變數和迴圈控制表示式必須是整數。
可以使用 cycle
語句提前結束迭代
do i=1, 5
if (i==4) cycle
end do
並且整個構造可以用 exit
語句停止執行
do i=1, 5
if (i==4) exit
end do
print *, i
do
結構可能被命名為:
do_name: do i=1, 5
end do do_name
這在巢狀的 do
構造時特別有用
do1: do i=1, 5
do j=1,6
if (j==3) cycle ! This cycles the j construct
if (j==4) cycle ! This cycles the j construct
if (i+j==7) cycle do1 ! This cycles the i construct
if (i*j==15) exit do1 ! This exits the i construct
end do
end do1
do
構造也可以具有不確定的迴圈控制,永遠或直到滿足給定條件
integer::i=0
do
i=i+1
if (i==5) exit
end do
要麼
integer::i=0
do while (i<6)
i=i+1
end do
這也允許通過 .true.
語句進行無限的 do
迴圈
print *,'forever'
do while(.true.)
print *,'and ever'
end do
do
構造也可能使迭代次序不確定
do concurrent (i=1:5)
end do
注意到迴圈控制的形式與 forall
控制元件中的相同。
對於可以在 do concurrent
構造的範圍內執行的語句存在各種限制,這些語句旨在確保構造的迭代之間不存在資料依賴性。程式設計師的這種明確指示可以使編譯器能夠進行更大的優化(包括並行化),否則可能難以確定。
通過在 do concurrent
中使用 block
構造,可以實現互動中的私有變數:
do concurrent (i=1:5, j=2:7)
block
real tempval ! This is independent across iterations
end block
end do
塊 do
構造的另一種形式使用標記的 continue
語句而不是 end do
:
do 100, i=1, 5
100 continue
甚至可以使用共享終止語句來巢狀此類構造
do 100, i=1,5
do 100, j=1,5
100 continue
為了清楚起見,通常應避免這兩種形式,尤其是第二種形式(過時的)。
最後,還有一個非阻塞的 do
結構。這也被認為是過時的並且在別處描述 ,以及作為塊 do
構建體重構的方法。