1

在许多情况下,大多数情况下,当您循环遍历数组并向元素分配值时,可以使用后自增运算符。这是否被认为是一种好习惯。

例如,在下面的复制代码中,哪一个更好。

int [] to_assign;
int [] to_include;
int [] from_assign;

// Version 1
int count = 0;
while(i<<some_value>){
  if(to_include[i]==1)
     to_assign[count++] = from_assign[i];
}

// Version 2
int count = 0;
while(i<<some_value>){
  if(to_include[i]==1)
  {     
      to_assign[count] = from_assign[i];
      count++;
  }
}
4

4 回答 4

3

这纯粹是风格问题。就个人而言,我会使用最合乎逻辑的任何一个。如果增量在逻辑上是操作的一部分,则使用后增量。如果不是,请使用单独的增量操作。

此外,当您单独使用增量运算符时,通常首选使用预增量。虽然对于像整数这样的简单类型来说并不重要,对于更复杂的类型来说,它在像 C++ 这样具有运算符重载的语言中效率更高,因为预增量不需要同时存在两个实例。Java 对性能没有影响,因为它没有运算符重载,但如果你想要一个一致的样式规则,它应该是前置增量而不是后置增量。

于 2013-01-05T08:46:42.550 回答
1

我认为第二种解决方案可能更容易阅读。即眼睛观察到正在进行分配,然后有一个增量。将它们放在同一行上会使一目了然地阅读起来稍微不那么容易。所以,我更喜欢解决方案二。

也就是说,这是一个偏好问题。我认为在这里无法谈论已确立的最佳或更好的做法。

在每一盎司的性能都很重要的日子里,第一个版本会是首选,因为编译器在第一个解决方案中发出稍微更优化的程序集的变化更大。

于 2013-01-05T08:56:59.407 回答
0

无论如何,任何好的编译器都会为您优化它。只要它们是人类可读的,一切都很好。

“++”是指针算术时代的遗留物——我们中有些人更喜欢用“+= 1”表示整数。但是编译器应该正确地管理这样的简单情况,无论如何。

于 2013-01-05T08:48:06.240 回答
0

现代编译器无论如何都会优化这种代码,因此最终如何以及在何处增加变量并不重要。

从风格的角度来看,第一个版本更小,并且更易于阅读。

从代码理解的角度来看,第二个版本对于初学者开发者来说更​​容易理解。

从性能的角度来看,忽略编译器优化,这甚至更快:

// Version 3
int count = -1;
while(i<<some_value>){
    if(to_include[i]==1)
    {
        to_assign[++count] = from_assign[i];
    }
}

它更快,因为理论上count++在增量之前创建值的临时副本,而++count增量并使用相同的变量。但同样,不再需要这种过早的优化,因为编译器可以检测到这种频繁的情况并优化生成的代码。

于 2013-01-05T08:51:41.673 回答