编译器不会计算变量,除非我打印它""
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
编辑:我应该补充一点,打印语句影响的问题时常出现。当它出现时,它指出代码逻辑中的缺陷,然后对定义不明确的结果的情况变得敏感。
显然,根据我是否告诉程序打印变量 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
编辑:我应该补充一点,打印语句影响的问题时常出现。当它出现时,它指出代码逻辑中的缺陷,然后对定义不明确的结果的情况变得敏感。