Меня интересует разница между for
а также while
петли. Я знаю, что значение после увеличения используется, а затем увеличивается, и операция возвращает постоянное предварительное увеличение.
while (true) {
//...
i++;
int j = i;
}
Здесь будет j
содержать старый i
или после увеличения i
в конце цикла?
Поскольку утверждение 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.
Зависит от того, как вы их используете.
i++
делает копию, увеличивает i и возвращает копию (старое значение).++i
увеличивает i и возвращает i.В вашем примере это все о скорости. ++i
будет быстрее чем i++
так как это не делает копию.
Однако компилятор, вероятно, оптимизирует его, поскольку вы не сохраняете возвращенное значение из оператора приращения в вашем примере, но это возможно только для фундаментальных типов, таких как int
,
Основной ответ для понимания.
Оператор приращения работает так:
// ++i
function pre_increment(i) {
i += 1;
return i;
}
// i++
function post_increment(i) {
copy = i;
i += 1;
return copy;
}
Хороший компилятор автоматически заменит i++
с ++i
когда он обнаружит, что возвращаемое значение не будет использоваться.
В Pre-Increment начальное значение сначала увеличивается, а затем используется внутри выражения.
a=++i;
В этом примере предположим, что значение переменной i
5 тогда значение переменной a
будет 6, потому что значение i
изменяется перед использованием его в выражении.
В постинкрементном значении сначала используется выражение, а затем увеличивается.
a=i++;
В этом примере предположим, что значение переменной i
5 тогда значение переменной a
будет 5, потому что, значение i
увеличивается только после присвоения значения 5 a
,
#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.
i ++ использует значение i, а затем увеличивает его, но ++ i увеличивает значение i перед его использованием.
Разница между пост- и пре-приращением действительно, во многих случаях, незначительна. пост инкремент, ака 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
, который не всегда работает, и является эквивалентом предварительного увеличения). Много неприятностей будет сохранено, если вы используете правильный шаг.
не имеет значения, используете ли вы предварительное или последующее увеличение в независимом выражении, за исключением предварительного увеличения, эффект немедленно
//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