c#和c ++中反向循环的奇怪行为

时间:2014-04-17 07:08:25

标签: c# c++ loops for-loop

我刚刚编写了一个简单的反向循环:

for (unsigned int i = 50; i >= 0; i--)
    printf("i = %d\n", i);

但是它并没有像预期的那样停在0,而是下降到负值,为什么呢? 请参阅此ideone示例:http://ideone.com/kkixx8

(我在c#和c ++中测试过)

6 个答案:

答案 0 :(得分:13)

您将int声明为unsigned。它总是> = 0.您看到负值的唯一原因是您的printf调用将其解释为signed(%d)而不是unsigned(%ud)。

答案 1 :(得分:3)

虽然您没有要求解决方案,但以下是解决问题的两种常用方法:

// 1. The goes-to operator
for (unsigned int i = 51; i --> 0; )
    printf("i = %d\n", i);

// 2. Waiting for overflow
for (unsigned int i = 50; i <= 50; i--)
    printf("i = %d\n", i);

答案 2 :(得分:2)

unsigned int永远不会变为负数。

答案 3 :(得分:2)

在C#中这段代码

for (uint i = 50; i >= 0; i--)
    Console.WriteLine(i);

产生以下输出:

50
...
7
6
5
4
3
2
1
0
4294967295
4294967294
4294967293
...

您正在使用unsigned int。它永远不会是&lt;它只是环绕。由于格式化输出的方式(将其解释为带符号的int),您看到负值。

答案 4 :(得分:2)

i小于零时的循环中断。但是i是无符号的,它永远不会小于零。

答案 5 :(得分:0)

在你的for循环中

for(unsigned int i = 50; i&gt; = 0; i--)     printf(“i =%d \ n”,i);

i的值减1,当你的值i==0然后循环减量尝试赋值时 i--表示i=-1

等号右边的-1被设置为有符号整数(大小可能是32位),并且将具有十六进制值0xFFFFFFF4。编译器生成代码以将此有符号整数移动到无符号整数i,该整数也是32位实体。编译器假设您只在等号右侧有一个正值,因此它只是将所有32位移动到ii现在具有值0xFFFFFFF4,如果被解释为正数,则为4294967284。但%d的printf格式表示32位将被解释为有符号整数,因此得到-1。如果您使用了%u,它将打印为4294967284。