塊 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 構建體重構的方法。