编译器不会计算变量,除非我打印它""

Compiler won't calculate variable unless I print it""

显然,根据我是否告诉程序打印变量 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 会以任何方式出现真的很奇怪改变变量的值,这似乎就是发生的事情。

比如你自己试试,打印行in时mini的输出,比如,输入48,就是29,没错,就是48到ts half之间的最小质数,但是当您输入 48 并且著名的打印行被注释掉时,输出将是 -2,而不是 29。 你们有人知道为什么会这样吗?

@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

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