有没有理由写 .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
你确实是一个逻辑类型,如前所述,a
和 a.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
之前,请务必仔细检查。
在逻辑上,在*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
你确实是一个逻辑类型,如前所述,a
和 a.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
之前,请务必仔细检查。