Fortran if 语句中的隐式转换整数 <--> 逻辑

Implicit conversion integer <--> logical in Fortran if statement

我有一些遗留的 Fortran 代码,我被要求分析并翻译成现代语言。我不知道过去使用哪个编译器来编译代码,所以现在,我正在尝试用 gfortran 编译它。该代码包含这样的语句导致 gfortran 抱怨:

  program test
  implicit none
  integer*4 :: var
  var=.true.

  if(var) then
        write(*,*) "Hi"
  endif

  end program test

用 gfortran 编译它会出现以下错误:

test.f:6:9:

       if(var) then
         1
Error: IF clause at (1) requires a scalar LOGICAL expression

(此外,它对在 var=.true. 中完成的转换发出警告)。

我不确定代码是哪个编译器编译的,但显然代码应该按原样编译。有没有办法告诉 gfortran 接受这个转换?

根据文档,虽然在 if 语句中没有进行隐式转换:https://gcc.gnu.org/onlinedocs/gfortran/Implicitly-convert-LOGICAL-and-INTEGER-values.html

这在 GFortran 中是不可能的。 manual 状态:

However, there is no implicit conversion of INTEGER values in if-statements, nor of LOGICAL or INTEGER values in I/O operations.

你只能在像你的

这样的赋值中执行隐式转换
  integer :: var
  var = .true.

但即使在那里你也必须非常小心。它不符合标准,值 var 会因编译器而异。 Intel 曾经使用 -1(所有位设置为 1),除非选择了 -standard-semantics,对于 .true.,但是 gfortran 使用 +1,就像在 C 语言中一样。新版本的 Intel Fortran 更改了默认值。另一个方向甚至更棘手,可能存在既不是 .true. 也不是 .false..

的值