#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.