(Untitled)

May 14, 2007 15:24

Из серии, как занять программиста:

i=5; i = ++i + ++i;

чему равно i ?

from bash.org.ru

Leave a comment

kender_loki May 14 2007, 07:37:35 UTC
13. Хоть убей, не пойму, почему 14 =_=

Reply

echo_jr May 14 2007, 07:41:56 UTC
скорее всего оптимизация памяти - инкременты высчитываются (т.к. имеют наибольший приоритет), но вместо промежуточных значений используется значение переменной (т.к. оно по их мнению совпадает с ++i)

Reply

kender_loki May 14 2007, 07:46:33 UTC
Как это пошагово получается? По логике,
i = (5+1) + (5+1+1) = 6+7 = 13

Reply

echo_jr May 14 2007, 07:50:53 UTC
нет ... просто получается так

++i + ++i => i + i => 7 + 7 => 14

Reply

echo_jr May 14 2007, 07:55:11 UTC
а пошагово:

(i = 5); ++i + ++i
(i = 6); i + ++i
(i = 7); i + i
(i = 14);

Reply

kender_loki May 14 2007, 07:58:18 UTC
О, наконец-то понял %)
Спасибо )

Reply

echo_jr May 14 2007, 08:01:09 UTC
есть что-то прохожее:

i=5; printf("%d, %d\n", i++, i++);

большинство компилеров напечатает "6, 5", а не ожидаемое "5, 6"

Reply

kender_loki May 14 2007, 08:15:20 UTC
Почему? *_*

Reply

echo_jr May 14 2007, 08:18:30 UTC
потому что аргументы вычисляются в том порядке, в котором уходят в стек

Reply

kender_loki May 14 2007, 08:19:09 UTC
Ух ты )

Reply

echo_jr May 14 2007, 08:26:23 UTC
или я что-то путаю ...

Reply

echo_jr May 14 2007, 08:16:59 UTC
только здесь дело в стандарте, в котором написано "порядок вычисления аргументов функции неопределен" (и они вычисляются как удобно)

Reply

echo_jr May 14 2007, 07:48:19 UTC
при вычислении выражения первыми вычисляются инкременты, т.к. они префиксные, вместо них тупо подставляется значение переменной (чтобы не тратить память на хранение промежуточных результатов)

Reply


Leave a comment

Up