在解决hackerrank上的this问题时,我注意到for循环中发生了一件奇怪的事情。首先,让我展示一个示例代码:
#include <bits/stdc++.h>
using namespace std;
#define modVal 1000000007;
int main() {
for(long long int i=2;i>=0;--i){
cout<<"here: "<<i<<endl;
}
}
输入:123
输出:此处:2 在这里:1 这里:0 164
现在,当我在for循环中将long long int
更改为unsigned long long int
以初始化变量i
时。变量i
用18446744073709551615
初始化。为什么会这样?
答案 0 :(得分:6)
当变量为无符号时,i >= 0
始终为true。因此,循环永远不会结束。当我达到0时,下一个-使i
为0xFFFFFFFFFFFFFFFF(十进制18446744073709551615)。
答案 1 :(得分:3)
由于无符号类型不能为负,因此尝试将它们设置为负值将使它们回绕,而是使用std::numeric_limits<T>::max() - abs(value) + 1
,其中T
是类型,而value
是值低于0
。
在循环中,一旦i
达到0
,条件i >= 0
仍会满足,因此它将递减为-1
,但是对于如上所述的无符号类型是不可能的因此循环永远不会退出。
答案 2 :(得分:3)
顾名思义,无符号数字不采用带符号的值。因此,当我= -1时,它实际上是0xFFFFFFFFFFFFFFFF(十进制18446744073709551615)。
您可以在修改后的程序中看到自己。
#include <bits/stdc++.h>
using namespace std;
#define modVal 1000000007;
int main() {
for(unsigned long long int i=2;i>=0;--i){
cout<<"here: "<<i<<endl;
if(i > 3)
return 0;
}
}