可以像这样声明for循环吗?

时间:2013-01-10 15:35:23

标签: c++

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

这与

相同吗?

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

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

另外请建议更简洁的方式宣布同样的事情?

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

不一样。在第一种情况下,i的值在第一次迭代中为4,在最后一次迭代中为0。在第二种情况下,i在第一次迭代中为5,在最后一次迭代中为1

修改

@ Y.Ecarri:

第一种情况:

  1. i设为5
  2. 比较i > 0,即5 > 0
  3. 减少ii现在是4
  4. 输入i值为4
  5. 的循环体
  6. 身体完成
  7. 第二种情况:

    1. i设为5
    2. 比较i > 0,即5 > 0
    3. 输入i值为5
    4. 的循环体
    5. 身体完成
    6. 减少ii现在是4

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

它们与其他人指出的顺序不同:

  1. for循环的第一部分(在第一个分号之前)仅在开始时评估一次。
  2. 在代码块之前评估第二部分,在第二部分中不会评估第二部分返回零值(false,空指针或0数字)。在此部分中解析为i--> 0,比较发生在递减之前,因为它是一个后递减运算符。因此,当我最初为1时它将是真的,但是接下来将是
  3. 然后我将减少到0
  4. 循环体。
  5. 如果没有异常终止(中断或返回),for循环的第3部分将在循环块结束时执行。
  6. 如果此处i是一个有符号的int,那么它可以达到-1,您可以用

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

    其意图看起来更为明显。如果你有一个unsigned int,例如size_t,您仍然可以通过切换顺序使其看起来更明显

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

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

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

    在上述两种情况中,我仍然感到不安的是,当你真的希望它在第一次迭代时以4开始时,你启动i=5。所以我甚至可以切换到...而...当然我必须在循环外初始化i

    size_t i = 5;
    do { // body
        --i; // clearly 4 now on first iteration
    } while( i != 0 );