C:" if((a + = b)> c)"工作?

时间:2015-09-22 09:10:17

标签: c refactoring igor

我正在尝试将另一位作者的一些C代码重写为Igor Pro(与C类似的符号)。 该代码可用here

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

4 个答案:

答案 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

进行比较