Как можно отрефакторить эти циклы?

Вопрос о рефакторинге циклов в языке C может быть несколько общим, поскольку существует много различных способов оптимизации циклов в этом языке программирования. Однако я представлю несколько распространенных техник и подходов, которые могут быть полезны при рефакторинге циклов в C.

1. Замена цикла for на while или do-while.
Иногда бывает удобно заменить цикл for на while или do-while, особенно если нам не требуется конкретное условие итерации или нам нужно дополнительно проверять условие после каждого выполнения блока кода цикла.

Например, вместо:

   for (int i = 0; i < n; i++) {
       // код цикла
   }

можно написать следующее:

   int i = 0;
   while (i < n) {
       // код цикла

       i++;
   }

или

   int i = 0;
   do {
       // код цикла

       i++;
   } while (i < n);

2. Использование более эффективного условия остановки цикла.
Вместо того, чтобы использовать итерационную переменную (i, j и т.д.) для проверки условия цикла, иногда можно использовать индексацию элементами массива или указателями для проверки условия.

Например, вместо:

   for (int i = 0; i < n; i++) {
       // код цикла
   }

если мы используем индексацию элементами массива, можно изменить цикл следующим образом:

   int i = 0;
   while (arr[i] != '') {
       // код цикла

       i++;
   }

или, если у нас есть указатель на массив, можно изменить цикл следующим образом:

   char *ptr = arr;
   while (*ptr != '') {
       // код цикла

       ptr++;
   }

3. Избегание повторного вычисления длины цикла.
Если значение, используемое в условии цикла, не изменяется внутри цикла, лучше сохранить его значение в отдельной переменной перед входом в цикл. Так мы избежим повторных вычислений длины цикла на каждой итерации.

Например, вместо:

   for (int i = 0; i < strlen(str); i++) {
       // код цикла
   }

вычисление strlen(str) на каждой итерации, мы можем сохранить длину строки в отдельной переменной перед входом в цикл:

   int len = strlen(str);
   for (int i = 0; i < len; i++) {
       // код цикла
   }

Это лишь некоторые из возможных подходов и техник рефакторинга циклов в языке C. В зависимости от конкретного примера кода и его контекста, может оказаться необходимым использовать различные другие оптимизации, такие как вынос условия цикла, предварительное инкрементирование и др. Все эти приемы нам помогают сделать код эффективнее, улучшить его читабельность и поддерживаемость.