Унарная операция иногда самоубийственна. Испортите код C

Код на языке Си.

#include<stdio.h>
#define PRODUCT(x) ( x * x * x)
int main()
{
  int i =5,k;
  k = PRODUCT( ++i );
  printf("i is :%d ",k);
  return 0;
}

Мой вопрос: почему i: 392? По мне вывод должен быть 336. (потому что 6 * 7 * 8 = 336)

Я действительно запутался здесь??


person Level29Access    schedule 29.08.2013    source источник
comment
Поскольку ++i * ++i * ++i — это неопределенное поведение   -  person David Ranieri    schedule 29.08.2013
comment
ошибка определения макроса определения   -  person Grijesh Chauhan    schedule 29.08.2013
comment
@GrjeshChauhan Вы ошибаетесь .. Пожалуйста, посмотрите комментарий Dayal rai ниже, чтобы увидеть, как он будет предварительно обработан.   -  person Level29Access    schedule 29.08.2013
comment
@simonc Хорошо, я понял .. Спасибо за помощь, так что это дубликат.   -  person Level29Access    schedule 29.08.2013
comment
@Level29Access Мой ответ совершенно правильный, это не связано с вашим ответом. Да, ответ Даяла Рая правильный, вы можете проголосовать и принять ответ   -  person Grijesh Chauhan    schedule 29.08.2013
comment
@GrjeshChauhan Извините, я не зашел по ссылке .. +1 за исправление.   -  person Level29Access    schedule 29.08.2013


Ответы (1)


Предварительно обработанный код будет иметь

( ++i * ++i * ++i)

которые имеют отсутствие точки последовательности между двумя выполнениями одной и той же переменной, что приводит к Неопределенное поведение.

person Dayal rai    schedule 29.08.2013