for (unsigned u = 10; u >= 0; --u)
std::cout << u << std::endl;
我知道无符号不能小于0
我希望它从10到0打印,因为u >= 0
答案 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;
考虑u
为0
时会发生什么。在那次迭代中,我们将打印0
然后在for循环中执行表达式。该表达式--u
从1
中减去u
。结果-1将不适合无符号值。与任何其他超出范围的值一样,-1
将转换为无符号值。假设32
- 位整数,--u
的结果,u
是0
,是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
最终成为0
,u >= 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;