有没有理由写 .eqv。 。真的。?

Is there ever a reason to write .eqv. .true.?

在逻辑上,在*ahem* 适当设计的 编程语言中,将布尔值与 true 进行比较总是多余的,即 a == True 应该简单地替换为 a。 (同样,a == False by not a)。

包括 C 在内的许多语言都没有合适的布尔类型,因此 可以 与 true 进行比较(例如 2 == true 产生 0,作为布尔值表示false,而2本身可以表示true)。

这是否也是 Fortran 中的一个问题,或者我是否可以始终将 a .eqv. .true. 替换为 a

(我在一些遗留代码中发现了这一点,我严重怀疑这只是作者没有真正考虑过的众多事情之一......但我很好奇是否真的隐藏了一些特殊情况我应该注意一下。)

不,没有理由这么写。 a .eqv. .true.a 相同。只是不要使用用于不同数据类型的 ==

关于在遗留代码中发现的东西,不要忘记许多(如果不是大多数的话)Fortran 用户不是专业程序员,并且从未接受过正确编程技术的全面培训。通常,他们只是被教导了语言规则。

这真的是一个普遍存在的问题吗?

既然你问了“曾经一个原因”我可以想象在development/debugging期间使用它作为占位符:

 c if(a.eqv.b) .. 
   if(a.eqv..true.)

类似地,我可以看到是否有人修改了最初将 a 作为整数的代码并更改为逻辑你可能最终将 a.eq.1 切换为 a.eqv..true. 我可以想象如果你有很多复杂的逻辑表达式,这可能是一种 safe/easy 方法。

更隐晦地说,您可能会使用它来强制在事件 a 未声明为逻辑时出现编译错误。 (这需要在一些不需要逻辑的用法中使用,例如,作为子例程参数、写入语句等)

对于 a 你确实是一个逻辑类型,如前所述,aa.eqv..true. 是等价的。

的启发,其中 a.eqv..true. 是代码开发的自然结果,我将给出一个反常的答案。这使用运算符 .eqv. 强制执行某种形式的测试,因此该部分并非无用。

module tdef
  implicit none

  type t
    integer i
  end type

  interface operator (.eqv.)
    module procedure teqv
  end interface

 contains

  logical function teqv(a,b)
    type(t), intent(in) :: a
    logical, intent(in) :: b

    teqv = (a%i.eq.1).eqv.b
  end function teqv 

end module

use tdef
implicit none
print*, t(1), t(2), t(1).eqv..TRUE., t(2).eqv..TRUE.
end

这里有一个教训,也有一个愚蠢之处:人们会做一些奇怪的事情。在将 a.eqv..true. 替换为 a 之前,请务必仔细检查。