В чем разница между предварительным приращением и пост-приростом в цикле (для/while)?

Мой интерес заключается в различии между циклами for и while. Я знаю, что значение post-increment используется, а затем увеличивается и операция возвращает постоянный предварительный приращение.

while (true) {
    //...
    i++;
    int j = i;
}

Здесь будет j содержать старый i или пост-приращенный i в конце цикла?

Ответ 1

Так как оператор я ++ заканчивается на ; в вашем примере, не имеет значения, используете ли вы pre- или post-increment.

Разница возникает, когда вы используете результат:

int j = i++; // i will contain i_old + 1, j will contain the i_old.

Vs:

int j = ++i; // i and j will both contain i_old + 1.

Ответ 2

Зависит от того, как вы их используете.

  • i++ делает копию, увеличивает я и возвращает копию (старое значение).
  • ++i увеличивает я и возвращает i.

В вашем примере это все о скорости. ++i будет быстрее, чем i++, поскольку он не делает копию.

Однако компилятор, вероятно, оптимизирует его, поскольку вы не сохраняете возвращаемое значение из оператора инкремента в вашем примере, но это возможно только для основных типов, таких как int.

Ответ 3

Основной ответ для понимания. Оператор инкремента работает следующим образом:

// ++i
function pre_increment(i) {
    i += 1;
    return i;
}
// i++
function post_increment(i) {
    copy = i;
    i += 1;
    return copy;
}

Хороший компилятор автоматически заменит i++ на ++i, когда обнаружит, что возвращаемое значение не будет использоваться.

Ответ 4

В Pre-Increment начальное значение сначала увеличивается, а затем используется внутри выражения.

a=++i;

В этом примере предположим, что значение переменной i равно 5, тогда значение переменной a будет равно 6, потому что значение i изменяется до использования в выражении.

В столбце Post-Increment сначала используется выражение, а затем увеличивается.

a=i++;

В этом примере предположим, что значение переменной i равно 5, тогда значение переменной a будет равно 5, потому что значение i будет увеличиваться только после присвоения значения от 5 до a.

Ответ 5

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argp)
{
    int x = 5;

    printf("x=%d\n", ++x);
    printf("x=%d\n", x++);
    printf("x=%d\n", x);

    return EXIT_SUCCESS;
}

Выход программы:

x=6
x=6
x=7

В первом выражении printf x передается в printf, поэтому выводится значение 6, во втором x передается printf (поэтому выводится 6), а затем увеличивается, а третий оператор printf показывает, что post increment следуя предыдущему утверждению, снова выведя x, который теперь имеет значение 7.

Ответ 6

Разница между пост-и предварительным приращением действительно, во многих случаях, тонкая. post incremenet, aka num++, сначала создает копию num, возвращает его, и после этого увеличивает его. С другой стороны, pre-increment, aka ++num, сначала оценивает, а затем возвращает значение. Большинство современных компиляторов, когда они видят это в цикле, обычно оптимизируются, в основном, когда используется приращение post, и возвращаемое начальное значение не используется. Наиболее существенное различие между двумя приращениями, где это действительно распространено для создания тонких ошибок, - это объявление переменных с добавочными значениями: Пример ниже:

int num = 5;
int num2 = ++num; //Here, first num is incremented, 
                  //then made 6, and that value is stored in num2;

Другой пример:

int num = 5;
int num2 = num++; //Here, num is first returned, (unfortunately?), and then 
                  //incremented. This is useful for some cases.

Последнее, что я хочу сказать, это БУДЬТЕ ОСТОРОЖНЫ С ИНКРЕМЕНТАМИ. При объявлении переменных убедитесь, что вы используете правильный приращение или просто пишете всю вещь (num2 = num + 1, которая не всегда работает, и является эквивалентом предварительного приращения). Много проблем будет сохранено, если вы используете правильный приращение.