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

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

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

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

17

Решение

Поскольку утверждение i ++ заканчивается на ; в вашем примере не имеет значения, используете ли вы пре- или постинкремент.

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

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.
41

Другие решения

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

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

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

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

36

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

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

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

19

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

a=++i;

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

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

a=i++;

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

6
#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 просто показывает, что постинкремент после предыдущего заявление, снова выводя x, который теперь имеет значение 7.

4

i ++ использует значение i, а затем увеличивает его, но ++ i увеличивает значение i перед его использованием.

2

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

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, который не всегда работает, и является эквивалентом предварительного увеличения). Много неприятностей будет сохранено, если вы используете правильный шаг.

0

не имеет значения, используете ли вы предварительное или последующее увеличение в независимом выражении, за исключением предварительного увеличения, эффект немедленно

//an example will make it more clear:int n=1;
printf("%d",n);
printf("%d",++n);// try changing it to n++(you'll get to know what's going on)

n++;
printf("%d",n);

выход:
123

0
По вопросам рекламы [email protected]