从C+转换或逻辑运算符+;Fortran语言 < >下面的C++逻辑操作符转换成FORTRAN 90(?F90)是什么?如果(vx存在或vy存在)。这里vx和vy是速度的组成部分 if(vx || vy){ vT=sqrt(vx*vx + vy*vy); }

从C+转换或逻辑运算符+;Fortran语言 < >下面的C++逻辑操作符转换成FORTRAN 90(?F90)是什么?如果(vx存在或vy存在)。这里vx和vy是速度的组成部分 if(vx || vy){ vT=sqrt(vx*vx + vy*vy); },c++,if-statement,fortran,logical-operators,or-operator,C++,If Statement,Fortran,Logical Operators,Or Operator,我试过跟随 if(vx .or. vy) then vT = sqrt(vx*vx + vy*vy) end if 但我得到了一个错误: operands of logical operator `.or.` at (1) are REAL(8)/REAL(8). 这里有人能引导我吗?< /P> < P> C++版本隐式地比较 Vx > VIE 0。 在Fortran中,您必须明确地这样做1: 由于if语句看起来像是一种性能优化,因此有必要质疑它是否完全需要,或者是否可以用对vT的无条件赋

我试过跟随

if(vx .or. vy) then
vT = sqrt(vx*vx + vy*vy)
end if
但我得到了一个错误:

operands of logical operator `.or.` at (1) are REAL(8)/REAL(8).

这里有人能引导我吗?< /P> < P> C++版本隐式地比较<代码> Vx<代码> > <代码> VIE<代码> 0。

在Fortran中,您必须明确地这样做1:

由于
if
语句看起来像是一种性能优化,因此有必要质疑它是否完全需要,或者是否可以用对
vT
的无条件赋值来代替(如果
vx
vy
都为零,则将
vT
设置为零)


我希望我做对了;多年没有用Fortran编程。

在目前的情况下,这是不相关的,但一般来说,应注意Fortran逻辑操作不会短路。因此,例如,下面的C++代码

if (a == 0 || 10 / a == 1)
{
   ...
}
不等于

if (a == 0 .or. 10 / a == 1) then
    ...
end if

用Fortran语言。编译器可能决定先计算第二项,然后。。。哎呀。应该使用两个嵌套的<代码>如果 S.

,根据代码的类型> Vx和 VI>代码>,C++表达式<代码> VX VY VIE<代码>等价于代码> Vx=!0 | | vy!=0。也许这种等价性会有所帮助?根据你回答中使用的案例判断,从我开始,你就已经用Fortran编程了,这在我看来是正确的。芭丝谢芭:我同意,这个案子看起来确实。。。错。:)我只是为了和这个问题保持一致,在大学里我用FORTRAN77,但幸运的是我的研究生课程中使用了C。想想看,在Fortran 90中,case要求以及每行键入6个空格的必要性都被放宽了。@Bathsheba:噢,空格,我完全忘记了空格!:)[我为我的博士学位做了一些Fortran,然后在一家不知名的金融机构做了短暂的工作,但谣传该机构有超过1000万行Fortran代码。]@bathersba这些空格在自由格式的文件中是不相关的,这些文件通常具有.f90扩展名(我从OP想要的问题中理解)。状态:处理器不必计算表达式的所有操作数,如果表达式的值可以通过其他方式确定,则不必完全计算每个操作数。他们使用的一个例子是
X>Y。L(Z)
他们说如果
X
大于
Y
就不需要计算函数引用
L(Z)
,所以是的,这似乎取决于处理器,或者我的结论是错误的?@kvantour,编译器决定如何在每种特定情况下计算逻辑表达式—计算顺序取决于编译器和表达式。这种自由为可能的代码优化提供了更多的空间。但还有一个额外有趣的事实:在示例(
X>Y.或.L(Z)
)中,如果
L
定义了它的参数
Z
,则在指定条件下对表达式的求值会导致
Z
变得未定义,无论
L(Z)与否
进行评估。所以这是需要考虑的。@kvantour,这似乎是对7.1.7/1的自然补充,虽然不是很琐碎。是的,我只是复制粘贴了它。但是我很困惑,如果你有一个像
L(Z)
这样的函数,它设置
Z=1.0
并返回
L=.true.
,它就不会设置
Z
1.0
。还是我误解了?
if (a == 0 .or. 10 / a == 1) then
    ...
end if