Задачка с башорга

Фанат

oncle terrible
Команда форума
Задачка с башорга

В оригинале было
KoloDen
Привет, я общительный пацан, люблю поболтать, особенно с классными девченками. Но, чтобы поговорить со мной, ответьте на простую задачку анти-спам бота. Вот она:
int i = 5;
i = ++i + ++i;
Вопрос: Чему равно i?

Stefmania
14

KoloDen
Гы. Признайся, ты не девченка, а 40-летний одмин, да?
gcc выдает 14. Хотя непонятно - почему.
разве что, он не кладет в стек результат первого инкремента, а складывает, почему-то, результирующие i

в пыхе получается 13
PHP:
$i=5;
echo ++$i + ++$i;
и это уже можно понять.
вычислили ++$i, запомнили
вычислили ++$i ещё раз, и сложили с тем, что запомнили.

но вот совсем смешно:
PHP:
$i=5;
Function f($i) { return ++$i + ++$i; }
Echo f($i),"\n"; // 13

$i=5;
Function f1(&$i) { return ++$i + ++$i; }
Echo f1($i),"\n"; // 14
здесь я совсем не понимаю
 

algo

To the stars!
Стандарт языка С(++) не специфицирует, в каком порядке в данном случае должен происходить инкремент. В PHP, может, и специфицирует =), но даже если PHP следует за С в определении ++, то все ок.

Т.е, в данном случае оба результата правильны, и следует просто избегать такого кода.

Например, разные компиляторы С могут выдать 14 и 13.. Или gcc, запущенный с разными флагами, может выдать 14 или 13. В зависимости от -O будет разный ассемблерный код сгенерирован.

P.S вообще, набор такого стремного рода фич можно найти в faq по С буржуйском.
Помню, когда читал, как ребенок радовался =).

P.P.S Для заинтересовавшихся - можете найти вопрос и замечательную дискуссию по теме вот тут: http://programming.reddit.com/info/1po78/comments
 

Фанат

oncle terrible
Команда форума
algo
человек приводил результат для разных параметров:
И я думал, что 13. Пробовал с -O с -O2, без -O, с -g, все равно gcc упорно делает 14.
А вот тут подали только что интересную мысль.
что ++i возвращает ссылку на i
 

Румата

Новичок
Видел ссылку на тему на пхп.ру : http://php.ru/forum/viewtopic.php?p=48160#48160 (с этого сообщения и ниже)
 

algo

To the stars!
Пусть человек попробует с -O0. Фанат, это форум по PHP тут сишников грамотных почти нет =).

Я мессагу выше подредактировал - глянь там ссылу, куча объяснений по теме.
 

Фанат

oncle terrible
Команда форума
algo
про С сейчас посмотрю.
Но у нас и в пыхе своя задачка не хуже =)
 

phprus

Moderator
Команда форума
Фанат
gcc выдает 14. Хотя непонятно - почему.
разве что, он не кладет в стек результат первого инкремента, а складывает, почему-то, результирующие i
В ЖЖ эта тема обсуждалась и вот к чему там пришли:
++ возвращает ссылку на объект(переменную), а не ее значение и по этому вначале выполняются дважды оператор ++, потом происходит разыменование и потом сложение. Хотя стандарт не прописывает как должен вести себя компилятор в данном случае.

Вот ссылки:
http://community.livejournal.com/ru_cpp/224509.html
http://community.livejournal.com/ru_programming/750836.html

$i=5;
Function f($i) { return ++$i + ++$i; }
Echo f($i),"\n"; // 13
Тут $i передается по значению, да и похоже что в ++ в Php возвращает копию значения по этому вначале выполняется первый ++ результат попадает в стек, потом второй ++(результат попадает в стек) и эти значения складываются.

$i=5;
Function f1(&$i) { return ++$i + ++$i; }
Echo f1($i),"\n"; // 14
А вот тут похоже ++$i возвращает ссылку, по этому ответ 14.
 

Фанат

oncle terrible
Команда форума
phprus
со всем согласен, кроме этого
и поэтому вначале выполняются дважды оператор ++
я считаю, что сначала выполняются просто из-за приоритета операторов.
а вот что возвращают ссылку - уже влияет на конечный результат
 

phprus

Moderator
Команда форума
Фанат
я считаю, что сначала выполняются просто из-за приоритета операторов.
Мда. Бред, а не причинно-следственную связь написал. ++ выполняется раньше из-за того, что у него выше приоритет, А кроме этого ИМХО потому что перед тем как сложить 2 операнда их нужно вычислить. по этому (++i) выполняется до сложения оба раза.
 

HraKK

Мудак
Команда форума
phprus
верно

А для особо одаренных на том же bash.ru было в бездне написанно разьяснение. В С++, верно работет пред инкримет. то есть выше приоритет, поэтому вначале примавляет а потом другие мат. функции. А в пхп - фиг вам.
 

cDLEON

Онанист РНРСlub
HraKK
А ты попробуй в уме сначала сложить, а потом сплюсавать
Получается
(5+1)+((5+1)+1) = 13
 

dark-demon

d(^-^)b
cDLEON, не к пяти прибавляется единица и возвращается результат, а переменная i увеличивается на 1. два раза. до вычисления выражения.
 

Фанат

oncle terrible
Команда форума
меня больше всего смешат такие рассуждения. При том, что мы имеем ДВА РАЗНЫХ результата. опровергающщие ЛЮБЫЕ объяснения, в которых участвует только порядок выполнения операторов. =)
 

Skubent

Новичок
Что делает gcc ? (с оптимизацией не шаманил)
Кладет в регистр значение.
Делает два инкремента.
Складывает регистр сам с собой.

Что он делает не так ?
 
Сверху