C:"if((a+=b) > c)" 是如何工作的?

C: How does "if((a+=b) > c)" work?

我正在尝试将其他作者的一些 C 代码重写为 Igor Pro(类似于 C 的符号)。 代码可用 here.

关于 uminumax 行的更新顺序,我不知道如何处理行 if ((umin+=input[k+1]-vmin)<minlambda)else if ((umax+=input[k+1]-vmax)>lambda),以及评估为 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

umin 和 umax 是否仅在其 if 语句的计算结果为真时才更新?还是级联? IF(umin) -> false,umin 已更新,ELSEIF(umax) -> true,umax 已更新,但 IF(umin) -> true,umin 已更新,umax 未更新?还是其他一些变体?

Another question 大致相同的代码。

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

你可以这样看:

((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

进行比较

umin 将在您每次输入时更新。
umax 将由 (umax+=input[k+1]-vmax) > lambda 更新当且仅当 (umin+=input[k+1]-vmin) < minlambda 为 false 因为它在 else if

a+=b > c 相当于 if(b>c)a+=1; else a+=0;

(a+=b)>c 作为 (a+=b),a>c 工作,returns a>c 添加 ba.

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 进行比较。

同样,您可以理解这是如何工作的(当然,如果 if 中的条件是 false)-

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

这里也会更新umax然后和lambda比较。

这个:

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 和额外的缩进,这会稍微不那么漂亮(但可能更容易理解).