C++ 大于负数时不工作

C++ 大于负数时不工作,c++,for-loop,while-loop,C++,For Loop,While Loop,我有一段非常简单的代码,基本上需要从某个数字开始倒计时,并将该计数用作数组的索引 auto bigSize = BigArray.size() - 1; while(bigSize > -1) { auto thing = arr[bigSize ]; bigSize--; } 然而,代码似乎从未触及循环中的任何内容。我还尝试了for循环: auto bigSize = BigArray.size() - 1; for(int i = bigSize ; i >=

我有一段非常简单的代码,基本上需要从某个数字开始倒计时,并将该计数用作数组的索引

auto bigSize = BigArray.size() - 1;

while(bigSize > -1) {
   auto thing = arr[bigSize ];
   bigSize--;
}
然而,代码似乎从未触及循环中的任何内容。我还尝试了
for
循环:

auto bigSize = BigArray.size() - 1;

for(int i = bigSize ; i >= 0 && i < bigSize ; --i) {
   auto thing = arr[i];
}
auto-bigSize=BigArray.size()-1;
对于(int i=bigSize;i>=0&&i
我觉得我在做一些不正确的事情,但我似乎找不到它。

std::Container.size()总是返回一个未签名的数字。无符号数将始终大于负数,即使您下溢

while(bigSize > -1) {
   auto thing = arr[bigSize ];
   bigSize--;
}
这永远不会停止
bigSize
unsigned
,这意味着它不能包含负值。当
bigSize
为0时,您尝试将其递减,它变为
std::numeric\u limits::max()
。(下溢,不是负)所以它会继续循环


更改您的条件或将
bigSize
显式设置为
int

是否
BigArray.size()
可能返回一个
无符号的
?然后
bigSize
也将是
unsigned
,它将永远不会变为零(无论您减少它的频率如何),请您的问题提供一个。在
循环中,您从不修改
bigSize
,条件怎么会变成false?这是
auto
的问题之一——它隐藏了代码使用的类型,有时这才是真正重要的。顺便说一句,如果循环的条件正确,你甚至不会遇到问题:
(bigSize>0)
,你不想创建一个包含0个元素的数组,是吗?这是正确的。在循环工作之前,我必须将大小转换为整数。谢谢你的意见!我来自C#背景,所以这很奇怪。无符号整数类型不会下溢,而是环绕(或者,更准确地说,它们通过选择[0,2^NumBits-1]中Z mod 2^NumBits中其等价类的代表来表示给定的数字)。@Baummitaugen Correct,没有找到正确的措辞,请随意编辑。Hm,我不确定我能不能不违背你的意愿。我倾向于在这个话题上有点“马修”(对OP这样的观众来说可能过于马修);我很想重写一个句子,比如“它不能包含负值”,在无符号类型实现的模运算的眼中,这是更精确的,但同样,这将极大地改变你答案的精神。我会让你选择你的答案应该有多专业。