DO 는 루프문이다.  구문은 다음과 같다.

DO [ index_variable = index_start, index_end [,index_increment ]]
   ...

END DO

카운팅 루프를 위한 [ ]  부분은 옵션이다. [ ] 부분을 생략할 경우, DO ~ END DO 는 기본적으로 무한루프이다.
이경우, 반드시 루프 탈출을 위한 문장이 루프내부에서 실행되어야 한다.

탈출을 위해서 EXIT 를 사용할 수 있다.
IF 로 탈출조건을 제시하며 탈출하면 원하는 바를 수행하는데 용이하다.
즉, 루프내부에 다음과 같은 줄을 추가하는 것이다.

IF ( exit condition ) EXIT

물론, 탈출을 위한 IF , EXIT 가 위와 같이 한줄 IF 여야할 필요는 없다.
다음과 같이 블럭 IF 로 들어가도 된다.

IF ( exit condition )
  ...
  EXIT
END IF

또한, 루프바디 내부에 탈출을 시도하는 부분이 여러개여도 무방하다.




카운팅 루프를 위한 부분을 살펴보면, 첫번째 항은 루프변수의 시작값, 두번재항은 종료값, 세번째 값은 증가치이다.

루프변수는 정수타입이어야 한다. ( 이전버전에서는 실수타입도 사용가능했으나 95 에서는 제거되었다. )

index_start, index_end [,index_increment ]  부분은 상수일수도 있고, 변수일수도 있고, 수식일수도 있다.
다만, 루프시작전에 그 값들을 평가한다.

실행순서는 다음과 같다.
일단 루프시작시 카운팅제어 부분에 대한 평가가 실행된다.

루프변수의 시작값을 배정하는 부분이 우선 실행되고, 종료값과 비교하여 바디를 실행하거나 건너뛴다.
바디가 실행되면, 바디실행후, 증분만큼 증가 ( 값이 음수이면 감소) 시키고, 다시 비교하여 바디를 실행하거나 넘어간다.
바디를 실행시 위의 과정이 반복된다.

즉, 다음과 같은 구조일때,

DO expr 1 , expr 2 , expr 3
... body
END DO

1 -> 2 -> body -> 3 -> 2 -> body -> 3 -> 2 -> body -> 3 -> 2 -> ...    와 같은 순서이다.



루프변수와 종료값의 비교에 의한 바디 실행조건은, 증분값이 양수이냐 음수이냐에 따라 다르다.
양수인경우, 루프변수는 증가하고, 따라서 상식적으로 루프변수가 종료변수 이하일때 바디가 실행된다.
음수인경우, 루프변수는 감소하고, 따라서 루프변수가 종료변수 이상일때 바디가 실행된다.

증가분 부분이 생략되는 경우, 1로 간주한다.



루프변수도 역시 변수인 관계로, 루프 내부에서 조작 및 참조가 가능하다.
단, 루프변수를 루프내부에서 조작시, 루프 전체를 변화시키므로 주의가 요구된다.

루프종료시 루프변수의 값은 신뢰할 수 없다.
많은 컴퓨터/컴파일러 들이 루프종료후에도 루프변수값을 보존하지만, 포트란의 표준은 이에대해 보장하지 않는다.
따라서, 루프종료후의 코드가 루프변수를 참조한다면, 이식성에 문제가 생길수있으므로 주의를 요한다.



EXIT 가 루프자체를 완전히 탈출시킨다면,  CYCLE 은 컨트롤을 expr 3 으로 이동시킨다.

DO expr 1 , expr 2 , expr 3
... body
END DO

결과적으로 루프1회를  ( 하던데까진 하고, CYCLE 만난부분 부터..) 건너뛰는 기능을 한다.

EXIT 와 CYCLE 은 C의   break , continue 와  같다고 할 수 있다.



루프문에도 네이밍이 가능하다. 이는 앞의 IF 나 SELECT CASE 에서 처럼 네스티드 구조일때 상당한 효용을 제공한다.

name : DO
     ...
     ...  CYCLE [name]
     ...  EXIT  [name]
...
END DO name

DO 에 네이밍했으면 END DO 도 매치되는 네이밍을 요구한다.
CYCLE 과 EXIT 에 대해서는 네이밍은 옵션이지만 네이밍 할경우, 대응되는 루프의 네임과 매치되어야 한다.