for ( size_t i = N ; i <= N ; i-- ) { .... }
Это будет сделано, потому что size_t является беззнаковым int.Целые числа без знака - 32 бита.Когда переменная i имеет значение 0, вы хотите, чтобы ваш цикл выполнил условие.Если вы выполняете i--, компьютер выполняет
00000000000000000000000000000000
-00000000000000000000000000000001
, что приводит к явному переполнению, давая значение 111111111 ... 1.Для целого числа дополнения со знаком два это значение явно отрицательное.Однако тип i - это целое число без знака, поэтому компьютер будет интерпретировать 111111 ... 1 как очень большое положительное значение.
Таким образом, у вас есть несколько вариантов:
1) Выполните, как указано выше, и завершите цикл при переполнении.
2) Сделайте цикл циклом от i = 0 доi <= N, но используйте (Ni) вместо i везде в вашем цикле.Например, myArray [i] станет myArray [Ni] (отключается на единицу в зависимости от того, что на самом деле представляет значение N). </p>
3) Сделайте условие вашего цикла for эксплуатировать приоритет унарного -- оператор.Как написал другой пользователь,
for ( size_t i = N + 1 ; i-- > 0 ; ) { ... }
Это установит для i значение N + 1, проверьте, выполняется ли условие N + 1> 0.Это так, но у i-- есть побочный эффект, поэтому значение i уменьшается до i = N. Продолжайте, пока не доберетесь до i = 1. Условие будет проверено, 1> 0 верно, побочный эффект имеет место, тогда я = 0, и это исполнение.