ENDDO 中的语句标签与 DO 标签不匹配

Statement label in ENDDO not matching DO label

我写了一个程序来检查一个数是否是质数。

代码如下:

program prime
integer n,i
print *, 'enter a number'
read *,n
do 10,i=2,n-1
    if(mod(n,i).eq.0.0) then
        print*, 'it is not prime'
        read*
        stop
    end if
continue
if(n.eq.i)print *, 'it is prime'
read *
stop
end do
end program

但是,出现了问题。我收到一个错误:

Error: Statement label in ENDDO doesn't match DO label

本身的错误可以理解,最后的do没有和do循环连接。但是,我无法连接它,因为程序不允许我这样做。这是为什么?

同声明

do 10,i=2,n-1

您正在引入一个标记的 DO 结构。带标签的 DO 构造需要适当的终止语句,以及匹配的标签。在当前的 Fortran 中,匹配的标记 DO 构造以

终止
10 end do

10 continue

带标签的 DO 结构在当前 Fortran 中已过时,因此问题的整个 DO 结构可以改写为

do i=2,n-1
   ...
end do

问题中的缩进非常混乱。 continue 语句可能旨在作为循环的终止,但这不是因为它没有标记为 10continue 只是一个普通的、什么都不做的语句,它仅通过其标签具有作为循环终止的意义。相反,编译器看到循环由 end do 终止,而不管缩进,然后抱怨因为它缺少适当的标签。

循环的逻辑与缩进一致:continue语句应该是循环的结束。共有三种选择

  1. 为语句添加标签10
  2. continue 更改为 10 end do
  3. 从 DO 语句中删除 10 并将 continue 更改为 end do

对于每个选项,还删除第二个 end do

最后,

if(n.eq.i) ...

在循环之后,该条件是多余的:如果达到 i 将始终具有值 n

program prime
integer n,i    
print*, 'enter a number'
read*,n
do i=2,n-1
    if (mod(n,i)==0.0) then
        print*, 'it is not prime'
        read*
        stop
    end if
end do
if (n==i) then
    print*, 'it is prime'
    read*
endif
end program prime