代码之家  ›  专栏  ›  技术社区  ›  masher

C: “如果((a+=b)>C)”是如何工作的?

  •  2
  • masher  · 技术社区  · 10 年前

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

    我不知道如何处理这些台词 if ((umin+=input[k+1]-vmin)<minlambda) else if ((umax+=input[k+1]-vmax)>lambda) 关于他们更新的顺序 umin umax ,以及if/elseif语句求值为true或false如何影响更新。。

    明确地:

    第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)->真的,umi已更新,umax未更新?或者其他变体?

    Another question 关于相同的代码。

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

    4 回复  |  直到 8 年前
        1
  •  3
  •   Romano Zumbé Ajay Jain    8 年前
    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+=输入[k+1]-vmin) ,由于的优先级 - 高于 += . input[k+1]-vmin 然后将其结果添加到 umin 并存储在 .

    评估后,将其与 minlamda .

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

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

    这里也是 umax 将进行更新,然后将其与 lambda .

        2
  •  1
  •   Tom Tanner    10 年前

    这:

    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
  •  1
  •   MikeCAT    10 年前

    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 .

        4
  •  0
  •   li0n_za    10 年前

    你可以这样看:

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