Почему это арифметическое выражение дает этот результат?

#c

#c

Вопрос:

Может ли кто-нибудь объяснить мне вывод этого простого сегмента кода?

 int i=7;
int j=3*i--   2;
printf("%d %d",i,j)
  

Когда я компилирую, я получаю 6,23 .

Как получается 23? Я думал, что это будет 3 * 7 = 21, уменьшится до 20, а добавленное 2 равно 22, а не 23?

Ответ №1:

 int i = 7; /* i is 7 */
int j = (3 * (i--)) /* means 3 * 7 */   2; /* 3 * 7   2 = 23 */
/* i is now 6, because it was decreased by the postfix -- operator */
printf("%d %d", i /* 6 */, j /* 23 */);
  

Ответ №2:

i-- имеет побочный эффект уменьшения i на 1 (установка его на 6), но выражение возвращает предыдущее значение i . --i уменьшит i и даст новый результат.

Ответ №3:

-- привязывается к i , а не к 3*i . (Вы не могли бы иметь (3*i)-- в любом случае as 3*i не является значением lvalue, которое -- требуется.) Значение i-- является исходным значением i до его уменьшения.

Ответ №4:

Список унарных операторов в C: http://en.wikipedia.org/wiki/Unary_operation#C_family_of_languages

-- является унарным оператором и привязывается к i , так что это i-- не (3 * i)-- так .

Поскольку оно является пост-декрементным, используется значение i ДО декрементирования, поэтому ваше уравнение просто:

3 * 7 2 , и i будет равно 6.