2016-11-29 2 views
2

У меня есть очень тривиальная часть кода, которая в основном нуждается в обратном отсчете от определенного числа и использует этот счет как индекс для массива.в то время как большее отрицательное число не работает

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]; 
} 

Я чувствую, что я делаю что-то неправильное, но я не могу найти его.

+1

делает 'BigArray.size()' возможно, возвращает 'unsigned'? Тогда 'bigSize' будет' unsigned' тоже, и он никогда не будет равен нулю (независимо от того, как часто вы его уменьшаете) – user463035818

+0

Пожалуйста, отредактируйте свой вопрос, чтобы предоставить [mcve]. –

+1

В цикле 'while' вы никогда не изменяете' bigSize', как бы состояние стало ложным? –

ответ

2
while(bigSize > -1) { 
    auto thing = arr[bigSize ]; 
    bigSize--; 
} 

Это никогда не остановится. bigSize - unsigned, что означает, что он не может содержать отрицательные значения. Момент bigSize равен 0, и вы пытаетесь уменьшить его, становится std::numeric_limits<type>::max(). (underflow, not negative) Таким образом, он будет продолжать цикл.

Либо измените свое состояние, либо сделайте bigSize явно int.

+0

Это правильно. Мне пришлось отбросить размер до начала цикла. Спасибо за вход! Я пришел с фона C#, так что это было странно. – TheGeekZn

+0

Незнакомые целые типы не переполняются, они обертываются (точнее, представляют это число, выбирая представление его класса эквивалентности в Z mod 2^NumBits, который лежит в [0,2^NumBits-1]) , –

+0

@Baummitaugen Правильно, не нашел правильной формулировки, не стесняйтесь редактировать. –

0

std :: Контейнер .size() всегда возвращает беззнаковое число. Беззнаковое число всегда будет больше отрицательного числа, даже если вы недопустимы.

Смежные вопросы