为什么会导致无限循环?

时间:2018-05-12 12:14:54

标签: c++

for (unsigned u = 10; u >= 0; --u)
        std::cout << u << std::endl;

我知道无符号不能小于0我希望它从10到0打印,因为u >= 0

4 个答案:

答案 0 :(得分:2)

// WRONG: u can never be less than 0; the condition will always succeed
for (unsigned u = 10; u >= 0; --u)
std::cout << u << std::endl;

考虑u0时会发生什么。在那次迭代中,我们将打印0然后在for循环中执行表达式。该表达式--u1中减去u。结果-1将不适合无符号值。与任何其他超出范围的值一样,-1将转换为无符号值。假设32 - 位整数,--u的结果,u0,是4294967295

编写此循环的一种方法是使用while而不是for。使用一段时间让我们在打印之前(而不是之后)减少值:

unsigned u = 11; // start the loop one past the first element we want to print
while (u > 0) {
--u; // decrement first, so that the last iteration will print 0
std::cout << u << std::endl;
}


此循环首先递减循环控制变量的值。在最后一次迭代中,u在进入循环时将为1。我们将减少该值,这意味着我们将在此迭代中打印0。当我们接下来在while条件下测试你时,它的值将是0并且循环将退出。因为我们从递减u开始,我们必须将u初始化为大于我们要打印的第一个值的值1。因此,我们将您初始化为11,以便打印的第一个值为10

答案 1 :(得分:0)

每次迭代都会减少u次。 u最终成为0u >= 0仍然保留true,因此另一次迭代再次展示u。无符号整数包围(因为无符号整数不能为负),你得到u == numeric_limits<unsigned>::max,冲洗并重复。

答案 2 :(得分:0)

如果从另一个角度考虑这一点,这一点就变得清晰了。

for循环的条件是u >= 0。当这是假的时,for循环将停止循环。

如你所知,

u不能小于0。当它在0时递减它将再次换行,因此u >= 0始终为真。

所以u >= 0永远不会错。

所以for循环是无限的。

如果要打印10到0,可以使用其他数据类型。

答案 3 :(得分:0)

在代码块中

for (unsigned u = 10; u >= 0; --u)
     std::cout << u << std::endl;

u是无符号整数,并尝试查找其范围0 to 4294967295。并且u>=0总是如此因此条件永远不会失败导致循环有限地运行。

     u = 10            ,  10 >=0     => true => prints 10
     ..
when u = 0             ,  0>=0       => true => prints 0
     u = 4294967295    ,  4294967295 >=0 true ( it will not -1 > 0 as there is no -1 in the range of unsigned int )

同时如果您将循环旋转10次,请将条件保持为u>0

for (unsigned u = 10; u > 0; --u)
     std::cout << u << std::endl;