Выражение a++
принимает значение текущего значения a
и в качестве побочного эффекта с шагомa
на 1. экспрессирующего ++a
вычисляет текущее значение a
+ 1, а в качестве стороны с шагом эффекта a
на 1.
Если бы вы написали
a = 1;
printf("%d\n", a++);
вы получите выход 1
, потому что вы просите за текущее значение от a
. Если бы вы написали
a = 1;
printf("%d\n", ++a);
вы получите выход 2
, потому что вы просите ценности a + 1
.
Теперь, что важно помнить (особенно с ++a
) является то, что побочный эффект фактически обновление a
не должно произойти сразу же после того, как выражение было оценено; это должно произойти только до следующей последовательности (которая в случае вызова функции после оценивается все аргументов).
Пер определение языка, объект (например, переменной a
), возможно, его значение изменяется при оценке выражения (a++
или ++a
) не более одного раза между точками последовательности, и предшествующее значение должно быть прочитано только для определения значения, которое необходимо сохранить.
Заявление
printf("%d %d\n", a, a++);
нарушает вторую часть этого ограничения, поэтому поведение этого утверждения является неопределенным. Ваш вывод может быть любой из 1 1
, 1 2
, в суффозии желтый и т.д.
http://stackoverflow.com/questions/24853/what-is-the-difference-between-i-and-i –
Какой компилятор ты используешь? С GCC v4.6.2 я получаю '2 1' для второй линии! [А также с GCC v4.3.4] (http://ideone.com/6dr0H) – Johnsyweb
Я удалил тег C++; это пахнет как C. Вы не должны сливать эти два. –