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