这两个代码块应该是等价的吗? (在if中分配)

时间:2013-08-13 22:01:50

标签: dart

以下两个代码块是否相同?我的直觉是肯定的,但他们会产生不同的行为。

第一个代码块以我期望的方式工作,第二个代码块没有。我真的想要使用第二种风格,因为它使实际的代码(其中一些在这里被省略)更短更容易在眼睛上。

if (expanding) {
  radius += delta;
  if (radius > maxRadius)
    expanding = false;
} else {
  radius -= delta;
  if (radius < minRadius)
    expanding = true;
}

if (expanding && (radius += delta) > maxRadius) {
  expanding = false;
} else if ((radius -= delta) < minRadius) {
   expanding = true;
}

2 个答案:

答案 0 :(得分:1)

如果expandingtrueradius + delta <= maxRadius,则第一个版本会radius增加delta并完成;第二个版本按radius递增delta,然后第一个条件失败,然后radius递减delta,将其保留在启动位置。

所以:不,不应该期望两个块的行为方式相同。即使您将! expanding &&添加到else条件,我认为第一个版本很多更清晰。

答案 1 :(得分:0)

这样的事情怎么样:

radius += expanding ? delta : -delta;
if (expanding && radius > maxRadius)
   expanding = false;
if (!expanding && radius < minRadius)
   expanding = true;

这分离了递增半径和切换扩展的功能,但仍然简化了原始版本的代码。