2

我正在尝试将另一位作者的一些 C 代码重写为 Igor Pro(类似于 C 的符号)。代码可在此处获得。

我不知道如何处理这些行if ((umin+=input[k+1]-vmin)<minlambda)以及else if ((umax+=input[k+1]-vmax)>lambda)它们如何进行更新umin和的顺序umax,以及 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

umin 和 umax 是否只有在 if 语句评估为 true 时才会更新?还是级联?IF(umin) -> false,umin 更新,ELSEIF(umax) -> true,umax 更新,但 IF(umin) -> true,umin 更新,umax 未更新?还是其他变种?

关于相同代码的另一个问题。

编辑:固定标题。添加了igor标签

4

4 回答 4

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

同样,您可以理解这将如何工作(当然,如果条件iffalse)-

else if ((umax+=input[k+1]-vmax)>lambda) 

这里也umax将更新,然后与lambda.

于 2015-09-22T09:22:18.383 回答
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's 和额外的缩进,这会稍微不那么漂亮(但可能仍然更容易理解)。

于 2015-09-22T10:06:51.553 回答
1

umin每次进入那里都会更新。当且仅当为 false
umax时才会更新,因为它在(umax+=input[k+1]-vmax) > lambda(umin+=input[k+1]-vmin) < minlambdaelse if

a+=b > c作为if(b>c)a+=1; else a+=0;

(a+=b)>c用作(a+=b),a>ca>c添加b到后返回a

于 2015-09-22T09:14:42.700 回答
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

于 2015-09-22T09:13:57.353 回答