(Untitled)

May 14, 2007 15:24

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

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

чему равно i ?

from bash.org.ru

Leave a comment

Comments 22

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


rus_dikobraz May 14 2007, 09:15:20 UTC
Гы, действительно, причём и на студии и на gcc, ну icc у меня под вистой не пашет, так что не проверял, и притф тоже выдаёт 6 и 5)

Reply


lingvistochka May 16 2007, 04:58:45 UTC
это легкое извращение над моим филологическим умом... напоминаю, я к тому же еще и блондинка...

Reply

echo_jr May 16 2007, 07:43:30 UTC
эмм ... вообще-то это расчитано на программистов, пишуших на Си :)

Reply

lingvistochka May 16 2007, 19:53:51 UTC
Жаль просто, что умного по этому поводу сказать не могу... ;-)

Reply


(The comment has been removed)

echo_jr May 19 2007, 12:58:45 UTC
это баг, если подумать ...

macro ?

Reply

(The comment has been removed)

Re: Классичиский пример ошибки при использовании 'макро echo_jr May 19 2007, 14:01:54 UTC
да, это Си-препроцессор ...

хмм ... мудрённый пример

1. основная ошибка в использовании i++ как аргумента, т.к. инкремент неявно (!) выполняется дважды
2. получается 100, и это отнюдь не эффект макроподстановки, просто получается, что:

(i++ * i++) = 100
это "особенность" из того же разряда что и "++i + ++i", видимо постфиксный "++" выполняется только ПОСЛЕ вычисления выражения, что тоже интересно. Спасибо, это хороший момент.

3. в макроопределении ошибка, должно быть:

#define square(x) ((x)*(x))

(чтобы принудительно вычислить выражение "x" предварительно)

Reply


(The comment has been removed)

echo_jr May 23 2007, 13:01:28 UTC
эмм ... в паскале разве есть инкрементный оператор ?

Reply

(The comment has been removed)

echo_jr May 23 2007, 13:29:01 UTC
типа говорил, что Delphi офигенно правильный ? :))

Reply


Leave a comment

Up