当i = -1时,为什么循环停止?
for (i = len; i--;)
完整代码在这里http://rosettacode.org/wiki/Longest_increasing_subsequence#C。
THX !!
答案 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
检查true
或false
,然后递减。
答案 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
以外的任何内容都是正确的。因此,必须在i
为0
时停止,而不是-1
。由于后递减运算符,您看到i
的值为-1
。