以下C++逻辑运算符转换为Fortran 90(.f90(会是什么?如果 (vx
存在或vy
存在(。这里vx
和vy
是速度的组成部分
if(vx || vy){
vT=sqrt(vx*vx + vy*vy);
}
我试过以下
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).
谁能指导我到这里?
C++版本隐式地将vx
和vy
与零进行比较。
在 Fortran 中,您必须显式执行此操作1:
if (vx /= 0 .or. vy /= 0) then
由于if
语句看起来像是性能优化,因此可能值得质疑它是否完全需要,或者是否可以替换为对vT
的无条件赋值(如果vx
和vy
都为零,则会将vT
设置为零(。
1我希望我做对了;很多年没有用Fortran编程了。
在本例中,它无关紧要,但通常应该注意的是,Fortran逻辑运算不会短路。因此,例如,以下C++代码
if (a == 0 || 10 / a == 1)
{
...
}
不等同于
if (a == 0 .or. 10 / a == 1) then
...
end if
在福特兰。编译器可能决定先评估第二个术语,然后再...哎呀。它应该使用两个嵌套if
s 编写。