Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет sart ([info]sart)
@ 2007-05-11 21:52:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
[info]shiitman@lj убил
Очень хорошее по мотивам башорга.
i=5;
i= ++i + ++i;

Так чему же все-таки равно i?


По моему, тринадцати.

здесь


(Добавить комментарий)


[info]kouzdra
2007-05-11 22:01 (ссылка)
Это действительно на усмотрение компилятора. Но скорее всего 14:

inc i
inc i
add i, i

Является корректным кодом для этого выражения. И самым простым. Завершить вычисление первого операнда до начала вычисления второго компилятор не обязан. Хотя на некоторых архитектурах (или на достаточно старых и глупых трансляторах вполне вероятно будет 13)

(Ответить) (Ветвь дискуссии)


[info]sart
2007-05-11 22:06 (ссылка)
Действительно, тут такая же задачка, как два плюс два умножить на два.

Но по-человечески хочется, чтобы тринадцать :)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2007-05-11 22:17 (ссылка)
Мне бы тоже хотелось - я как-то раз три дня аналогичную ошибку искал. Понял в чем дело, только когда в машинный код посмотрел. Но мир несовершенен :(

(Ответить) (Уровень выше)


(Анонимно)
2007-05-11 22:59 (ссылка)
тогда после i = ++i + ++i + ++i;
i должно быть равно 24, а это не так.

проверьте, с gcc i в результате = 22 :)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2007-05-12 06:43 (ссылка)
Так приведенный выше код на случай сложения трех переменных не обобщается (точнее - становится зависим от того факта, что все они одинаковые). Потому и 22 - сначала считается (++i + ++ i) (14), а потом к нему добавляется ++i (8)

(Ответить) (Уровень выше)


[info]phantom
2007-05-11 22:43 (ссылка)
оператор педергивания
++x--;

(Ответить) (Ветвь дискуссии)


[info]sart
2007-05-11 23:27 (ссылка)
++(++(++(++(++(++(++(++x--)--)--)--)--)--)--)--)

кодеронанизм.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phantom
2007-05-15 13:23 (ссылка)
кстати ++х--; может быть полезен
(когда используется побочный эффект
переопределенных операторов инкремента)

(Ответить) (Уровень выше)


(Анонимно)
2007-05-12 04:46 (ссылка)
(let ((i 5)) (+ (incf i) (incf i)))
=> 13

Остальное я на хую вертел, а у нас все однозначно и рационально.

(Ответить)