除非我打印它,否则编译器不会计算变量“”

时间:2018-12-23 12:29:25

标签: fortran fortran90

显然,根据我是否告诉程序是否打印变量i,我得到的结果与我是否打印它不相关。

 PROGRAM hello
IMPLICIT NONE
integer :: n,i, mini
logical :: leave = .false.
read*, n
print*, is_prime(n)   

!!---------------------------------------------------------------------

do i=n, n/2, -1
    print*, "I= ", i                !!if you comment out this line, the result will be different than if you were to keep it, try it out yourselves
    if(is_prime(i)) then
        mini = i
    end if
end do

print*, "the lowest prime number between your number and its half is: ", mini

!!----------------------------------------------------------

CONTAINS

logical function is_prime(n)
    integer::n,i

    do i=2,n
        if(mod(n,i) == 0 .and. (i/=1 .and. i/=n) ) then
            is_prime = .false.
        elseif(mod(n,i) /=0 .and. i == n-1 .and. is_prime .neqv. .false.) then
            is_prime = .true.
        end if
    end do
    return
end function
END PROGRAM

因此,如果您要注释掉我所指出的那行,那么“ mini”的结果将与您保留它的结果不同,正如我所说。 我在fortran还是个新手,所以我不知道我做错了什么,或者这是否与编译器有关,但是对我来说,看起来很奇怪,无论如何都要放置一个print *,line更改可变参数的值,这就是发生的情况。

例如,如果您自己尝试一下,则输入行时mini的输出例如,输入48,为29,这是正确的,它是介于48和ts之间的最小素数,但是当您踩入48,而著名的打印行被注释掉时,输出将是-2,而不是29。 你们当中有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:4)

@francescalus是正确的,is_prime的逻辑是错误的。

您可以通过检查程序的第一个结果(print *, is_prime(n))来判断。

下面是带有正确is_prime的版本。我首先将.true.分配给结果,并在测试为真时将其无效化为.false.

PROGRAM hello
  IMPLICIT NONE
  integer :: n,i, mini

  read*, n
  print*, is_prime(n)

!!---------------------------------------------------------------------

  do i=n, n/2, -1
     print*, "I= ", i
     if(is_prime(i)) then
        mini = i
     end if
  end do

  print*, "the lowest prime number between your number and its half is: ", mini

!!----------------------------------------------------------

CONTAINS

  logical function is_prime(n)
    integer, intent(in) :: n
    integer :: i

    is_prime = .true.
    do i=2,n
       if(mod(n,i) == 0 .and. (i/=1 .and. i/=n) ) then
          is_prime = .false.
       end if
    end do
  end function is_prime

END PROGRAM

编辑:我应该补充一点,即不时出现与打印语句有关的问题。当它出现时,它指出了代码逻辑中的一个缺陷,然后该缺陷变得对不确定结果的情况变得敏感。