我正在尝试将另一位作者的一些C代码重写为Igor Pro(与C类似的符号)。 该代码可用here。
我不知道如何处理if ((umin+=input[k+1]-vmin)<minlambda)
和else if ((umax+=input[k+1]-vmax)>lambda)
行有关更新umin
和umax
的顺序,以及评估为true或false的if / elseif语句如何影响更新..
具体做法是:
第99-107行有:
if ((umin+=input[k+1]-vmin)<minlambda) {
do output[k0++]=vmin; while (k0<=kminus);
vmax=(vmin=input[kplus=kminus=k=k0])+twolambda;
umin=lambda; umax=minlambda;
} else if ((umax+=input[k+1]-vmax)>lambda) {
do output[k0++]=vmax; while (k0<=kplus);
vmin=(vmax=input[kplus=kminus=k=k0])-twolambda;
umin=lambda; umax=minlambda;
} else { /*blah blah */ }
我已将此重构为:
if ((umin+=input[k+1]-vmin) < minlambda) //Todo
do
output[k0] = vmin
k0+=1
while(k0 <= kminus)
k=k0
kminus=k
kplus=kminus
vmin=input[kplus]
vmax = (vmin) + twolambda
umin = lambda
umax = minlambda
elseif ((umax+=input[k+1]-vmax) > lambda) //Todo
do
output[k0]=vmax
k0+=1
while(k0 <= kplus)
k=k0
kminus=k
kplus=kminus
vmax=input[kplus]
vmin = (vmax) - twolambda
umin = lambda
umax = minlambda
else //blah blah
如果他们的if语句评估为true,umin和umax是否只会更新?还是级联? IF(umin) - &gt; false,umin updated,ELSEIF(umax) - &gt;是的,umax已更新,但IF(umin) - &gt;是的,umin更新了,umax没有更新?还是其他一些变种?
Another question关于相同的代码。
编辑:固定标题。添加了igor标签
答案 0 :(得分:3)
if( a += b > c)
在第一个b>c
被评估为>
的优先级高于+=
。
然后将评估+=
。
现在,如果b>c
为真,那么a
将为a+=1
,如果为假,则会a+=0
进行评估。
现在这个(更新你的标题) -
if ((umin+=input[k+1]-vmin)<minlambda)
首先评估(umin+=input[k+1]-vmin)
。为什么?由于括号()
的优先级高于<
。
在(umin+=input[k+1]-vmin)
中,由于-
的优先级高于+=
。评估input[k+1]-vmin
,然后将其结果添加到umin
并存储在umin
中。
在此评估之后,将其与minlamda
进行比较。
同样,你可以理解这是如何工作的( ofcourse如果if
中的条件是false
) -
else if ((umax+=input[k+1]-vmax)>lambda)
此处umax
也会更新,然后会与lambda
进行比较。
答案 1 :(得分:1)
umin
umax
将(umax+=input[k+1]-vmax) > lambda
更新,当且仅当(umin+=input[k+1]-vmin) < minlambda
为假,因为它位于else if
a+=b > c
的作用为if(b>c)a+=1; else a+=0;
(a+=b)>c
用作(a+=b),a>c
,在a>c
添加b
后返回a
。
答案 2 :(得分:1)
此:
for (;;) {
....
if ((umin+=input[k+1]-vmin)<minlambda) {
do output[k0++]=vmin; while (k0<=kminus);
vmax=(vmin=input[kplus=kminus=k=k0])+twolambda;
umin=lambda; umax=minlambda;
} else if ((umax+=input[k+1]-vmax)>lambda) {
do output[k0++]=vmax; while (k0<=kplus);
vmin=(vmax=input[kplus=kminus=k=k0])-twolambda;
umin=lambda; umax=minlambda;
} else { /*blah blah */ }
}
(来自原始来源)或多或少等同于此
for (;;)
{
...
umin += input[k + 1] - vmin;
if (umin < minlambda)
{
...
continue;
}
umax += input[k + 1] - vmax;
if (umax > lambda)
{
....
continue;
}
/* blah blah */
}
你可以这样做,因为if块是循环的结尾,否则你需要一些else
和额外的缩进,这将是中等不太漂亮(但可能仍然更容易理解。)
答案 3 :(得分:0)
你可以这样看:
((umin+=input[k+1]-vmin)<minlambda)
基本上是
var umin += input[k+1] - vmin;
if (umin < minlambda) { }
else if ((umax += input[k+1] - vmax)> lambda) { }
umin
只是在if语句中计算,然后与minlambda