Из того, что я могу сказать, увеличение / уменьшение рассматривается как одна операция. Это имеет смысл, потому что в сборке вы можете выполнять увеличение или уменьшение с помощью одной строки кода сборки. Кроме того, большинство строк ассемблерного кода переводятся непосредственно в одну двоичную инструкцию. Таким образом, увеличение / уменьшение по сути является операцией с постоянным временем.
Следовательно, у нас есть n операций от приращения. Мы также запускаем тело l oop n раз, а тело l oop выполняет операцию с постоянным временем, поэтому у нас есть дополнительные c * n операции. Когда мы вводим l oop в первый раз, происходит дополнительная операция присваивания. Это приводит к другой операции. Наконец, после того, как l oop запустится в n-й раз, l oop проверяет состояние l oop еще раз. Это означает, что есть n + 1 сравнений, которые выполняет l oop.
Сложив их, мы имеем n + c * n + 1 + (n + 1) = 2 * n + c * n + 2, ответ, который вы видели.