从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和
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