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



我写了一个程序来检查一个数字是否为素数。

这是代码:

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

最新更新