Единственная разница - это порядок операций между приращением переменной и значением, которое возвращает оператор.
Этот код и его вывод объясняют разницу:
#include<stdio.h>
int main(int argc, char* argv[])
{
unsigned int i=0, a;
a = i++;
printf("i before: %d; value returned by i++: %d, i after: %d\n", i, a, i);
i=0;
a = ++i;
printf("i before: %d; value returned by ++i: %d, i after: %d\n", i, a, i);
}
Вывод:
i before: 1; value returned by i++: 0, i after: 1
i before: 1; value returned by ++i: 1, i after: 1
Таким образом, в основном ++i
возвращает значение после его увеличения, в то время как ++i
возвращает значение до его увеличения. В конце в обоих случаях значение i
будет увеличено.
Другой пример:
#include<stdio.h>
int main ()
int i=0;
int a = i++*2;
printf("i=0, i++*2=%d\n", a);
i=0;
a = ++i * 2;
printf("i=0, ++i*2=%d\n", a);
i=0;
a = (++i) * 2;
printf("i=0, (++i)*2=%d\n", a);
i=0;
a = (++i) * 2;
printf("i=0, (++i)*2=%d\n", a);
return 0;
}
Выход:
i=0, i++*2=0
i=0, ++i*2=2
i=0, (++i)*2=2
i=0, (++i)*2=2
Много раз нет никакой разницы
Различия очевидны, когда возвращаемое значение присваивается другой переменной или когда приращение выполняется в сцеплении с другими операциями, где применяется приоритет операций (i++*2
отличается от ++i*2
, но (i++)*2
и (++i)*2
возвращает одно и то же значение) во многих случаях они взаимозаменяемы. Классическим примером является синтаксис цикла for:
for(int i=0; i<10; i++)
имеет тот же эффект, что и
for(int i=0; i<10; ++i)
Правило запоминания
Чтобы не путать два оператора, я принял это правило:
Свяжите позицию оператора ++
относительно переменной i
с порядком операции ++
относительно присвоения
Сказал другими словами:
++
до i
означает, что увеличение должно быть выполнено до назначения ;
++
после i
означает, что приращение должно выполняться после назначение: