C语言的for循环,for(i = len; i--;)

时间:2014-03-26 18:03:09

标签: c loops for-loop

当i = -1时,为什么循环停止?

for (i = len; i--;)

完整代码在这里http://rosettacode.org/wiki/Longest_increasing_subsequence#C

THX !!

6 个答案:

答案 0 :(得分:8)

i--的值为0时,循环停止。由于i--会在递减之前返回值,因此当i--0时,i-1

答案 1 :(得分:2)

虽然约阿希姆·伊萨克森的评论是一个简明的解释,但我没有看到一个值得回答的答案。

循环在计算值0或false时停止。

i--让你失望。那个"后递减",即操作者返回i的当前值(在这种情况下,对于要评估的循环),并且此后立即递减当前值。后递减的伪代码如下:

int retval = i;
i = i - 1;
return retval;

(基于Eric Lippert的评论,从技术上讲,编译器可以将后递减作为i = i - 1; return i + 1;。重点是运算符发出的值不再是i的值。 )

(与precrement相反,在伪代码中只是):

i = i - 1;
return i;

因此,当循环正在评估i时,它会看到0因此退出,但在评估之后,运算符立即将i递减为-1。

所以,回答你的问题:

当i = -1时,循环不会停止。它在i = 0时停止,但随后我减少到-1。

答案 2 :(得分:1)

当表达式i--变为0时,您的循环停止,因为C中的任何非零值都被视为true而零被视为false
在每次迭代时,i检查truefalse,然后递减。

答案 3 :(得分:0)

 for (i = len; i--;)

这里我 - 是退出条件。当i--为false时为0,循环将退出 因为i--是后递减i值用于条件检查。所以当

i=0;

循环退出之后i=i-1作为后减量的一部分执行,所以

i=-1; 

当循环退出时,因为在它之后使用了第一个i's值,它就会递减

答案 4 :(得分:0)

FOR循环由3部分组成:

for([初始化]; [退出条件]; [循环更新])

[初始化]用于在第一次迭代之前为循环索引赋值

[退出条件]是在每次迭代之前计算的布尔表达式。如果确实如此,则执行另一次迭代,否则FOR循环结束

[循环更新]是用于在每次迭代时更新循环索引的指令

经典的FOR语句如下所示:

FOR(I = len; I> END_VALUE; I - )

代码中可能缺少的是退出条件,因此循环更新部分被解释为退出条件,因此被视为布尔表达式。当整数变为0时,其解释的布尔值对应于FALSE并且循环结束。任何非零值都会被解释为TRUE布尔值,并允许执行另一次迭代。

答案 5 :(得分:-1)

当需要布尔值时,0与false相同。 0以外的任何内容都是正确的。因此,必须在i0时停止,而不是-1。由于后递减运算符,您看到i的值为-1