C:"if((a+=b) > c)" 是如何工作的?
C: How does "if((a+=b) > c)" work?
我正在尝试将其他作者的一些 C 代码重写为 Igor Pro(类似于 C 的符号)。
代码可用 here.
关于 umin
和 umax
行的更新顺序,我不知道如何处理行 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
添加 b
到 a
.
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
和额外的缩进,这会稍微不那么漂亮(但可能更容易理解).
我正在尝试将其他作者的一些 C 代码重写为 Igor Pro(类似于 C 的符号)。 代码可用 here.
关于 umin
和 umax
行的更新顺序,我不知道如何处理行 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
添加 b
到 a
.
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
和额外的缩进,这会稍微不那么漂亮(但可能更容易理解).