скорее всего оптимизация памяти - инкременты высчитываются (т.к. имеют наибольший приоритет), но вместо промежуточных значений используется значение переменной (т.к. оно по их мнению совпадает с ++i)
Re: Классичиский пример ошибки при использовании 'макроecho_jrMay 19 2007, 14:01:54 UTC
да, это Си-препроцессор ...
хмм ... мудрённый пример
1. основная ошибка в использовании i++ как аргумента, т.к. инкремент неявно (!) выполняется дважды 2. получается 100, и это отнюдь не эффект макроподстановки, просто получается, что:
(i++ * i++) = 100 это "особенность" из того же разряда что и "++i + ++i", видимо постфиксный "++" выполняется только ПОСЛЕ вычисления выражения, что тоже интересно. Спасибо, это хороший момент.
3. в макроопределении ошибка, должно быть:
#define square(x) ((x)*(x))
(чтобы принудительно вычислить выражение "x" предварительно)
Comments 22
Reply
Reply
i = (5+1) + (5+1+1) = 6+7 = 13
Reply
++i + ++i => i + i => 7 + 7 => 14
Reply
Reply
Reply
Reply
Reply
(The comment has been removed)
macro ?
Reply
(The comment has been removed)
хмм ... мудрённый пример
1. основная ошибка в использовании i++ как аргумента, т.к. инкремент неявно (!) выполняется дважды
2. получается 100, и это отнюдь не эффект макроподстановки, просто получается, что:
(i++ * i++) = 100
это "особенность" из того же разряда что и "++i + ++i", видимо постфиксный "++" выполняется только ПОСЛЕ вычисления выражения, что тоже интересно. Спасибо, это хороший момент.
3. в макроопределении ошибка, должно быть:
#define square(x) ((x)*(x))
(чтобы принудительно вычислить выражение "x" предварительно)
Reply
(The comment has been removed)
Reply
(The comment has been removed)
Reply
Leave a comment