Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#和c++;_C#_C++_Loops_For Loop - Fatal编程技术网

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))
。@Caramiriel
a--b
实际上被解析为
((a--)b
,毫无意义。