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