3

for(int i(5) ; i-->0 ; ) { //use i as iterator here }

这是一样的吗

for(int i=5; i>0 ; i--)??

我试图在谷歌中找到类似的声明,但没有找到任何东西

还请建议更简洁的方法来声明相同的东西?

4

4 回答 4

8

不,这些不一样。在第一种情况下,i将在第一次执行循环体之前递减。

有关工作演示,请参阅http://ideone.com/AbHF3m 。

于 2013-01-10T15:37:12.240 回答
4

这是不一样的。在第一种情况下, 的值i4在第一次迭代和0最后一次迭代中。在第二种情况下,i5在第一次迭代和1最后一次迭代中。

编辑

对于@Y.Ecarri:

第一种情况:

  1. 设置i5
  2. 比较i > 0,即5 > 0
  3. 减量ii就是现在4
  4. i输入具有值的循环体4
  5. 车身饰面

第二种情况:

  1. 设置i5
  2. 比较i > 0,即5 > 0
  3. i输入具有值的循环体5
  4. 车身饰面
  5. 减量ii就是现在4
于 2013-01-10T15:37:54.147 回答
4

不,不一样。第一个版本比较减量前的值,每次迭代i 进行减量;第二个比较减量的值,并在每次迭代执行减量。

所以第一个迭代结束{4,3,2,1,0},而第二个迭代结束{5,4,3,2,1}

于 2013-01-10T15:38:33.523 回答
0

它们与其他人指出的不同,因为顺序是:

  1. for 循环的第一部分(在第一个分号之前)仅在开始时计算一次。
  2. 第二部分在代码块之前进行评估,根本不会评估第二部分返回零值(假、空指针或 0 数字)。在这个解析为 i-- > 0 的部分中,比较发生在减量之前,因为它是一个后减量运算符。因此,当我最初是 1 时,它会是真的,但接下来我会减少到 0 来表示接下来发生的事情
  3. 循环体。
  4. 如果没有异常终止(使用 break 或 return),则 for 循环的第 3 部分将在循环块的末尾执行。

如果i是一个有符号的 int,所以它可以达到 -1,你可以替换为

for( int i=4; i >= 0; --i ) { // body

它的意图看起来更明显。如果你有一个无符号整数,例如 size_t,你仍然可以通过切换顺序让它看起来更明显

for( size_t i = 5; 0 < i--; ) { // body

您也可以完全删除 0 和比较,然后执行

for( size_t i = 5; i--; ) { // body

在以上两个中,我仍然对您i=5在第一次迭代中真正希望它以 4 开始时开始这一事实感到不舒服。所以我什至可能会切换到 do...while.. 当然我必须i在循环之外进行初始化。

size_t i = 5;
do { // body
    --i; // clearly 4 now on first iteration
} while( i != 0 );
于 2013-01-10T16:02:14.333 回答