c#和c++;
我刚刚编程了一个简单的反向循环,如下所示:c#和c++;,c#,c++,loops,for-loop,C#,C++,Loops,For Loop,我刚刚编程了一个简单的反向循环,如下所示: for (unsigned int i = 50; i >= 0; i--) printf("i = %d\n", i); 但它并没有像预期的那样在0处停止,而是下降到负值,为什么? 请参阅此ideone示例: (我用c#和c++测试了它)您声明int为无符号。它将始终大于等于0。看到负值的唯一原因是printf调用将其解释为有符号(%d)而不是无符号(%ud)。无符号int永远不会变为负值。在C中,此代码 for (uint i =
for (unsigned int i = 50; i >= 0; i--)
printf("i = %d\n", i);
但它并没有像预期的那样在0处停止,而是下降到负值,为什么?请参阅此ideone示例:
(我用c#和c++测试了它)您声明int为无符号。它将始终大于等于0。看到负值的唯一原因是printf调用将其解释为有符号(%d)而不是无符号(%ud)。无符号int永远不会变为负值。在C中,此代码
for (uint i = 50; i >= 0; i--)
Console.WriteLine(i);
产生以下输出:
50
...
7
6
5
4
3
2
1
0
4294967295
4294967294
4294967293
...
您使用的是
无符号int
。它永远不可能小于0。它只是绕了一圈。由于格式化输出(将其解释为有符号整数)的方式,您看到的是负值。当i
小于零时,循环中断。但是i
是无符号的,并且它永远不会小于零。在for循环中
对于(无符号整数i=50;i>=0;i--)
printf(“i=%d\n”,i)
i
的值递减1,当i==0
时,循环递减尝试赋值
i--
表示i=-1
等号右侧的-1设置为有符号整数(大小可能为32位),并具有十六进制值0xFFFFF4。编译器生成代码,将此有符号整数移动到也是32位实体的无符号整数
i
。编译器假定您在等号的右边只有一个正值,所以它只是将所有32位移到i
中i
现在的值为0xFFFFF4,如果解释为正数,则为4294967284。但是%d的printf格式表示32位将被解释为有符号整数,因此得到-1。如果您使用了%u,它将打印为4294967284。虽然您没有要求解决方案,但以下是解决问题的两种常见方法:
// 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);
//1。电话转到接线员
对于(无符号整数i=51;i-->0;)
printf(“i=%d\n”,i);
// 2. 等待溢出
对于(无符号整数i=50;i但printf输出负数)value@MalteSchmitz这是因为您使用的%d表示整数,%u表示无符号整数。但printf输出的是负数value@MalteSchmitzNot in c#printf将i从无符号int转换为int,并显示与%d一起提供的有符号printf,它为什么打印有符号整数NICE SOUTION学生:)它们看起来有点像邪恶的黑客。为了可读性,我建议将I-->0
改为I-->0
。这有点像写a--b
,虽然有效,但意图并不明确((a--)(-b))
。@Caramiriela--b
实际上被解析为((a--)b
,毫无意义。