i=5;
++i + ++i;
Чудеса программирования
[highlight=javascript]
var i=5;
alert(++i + ++i);
[/highlight]
вернет 13.
[highlight=php]
$i=5;
echo ++$i + ++$i;
[/highlight]
тоже 13, однако в Java и С:
Код:
будет 14?
PhP
Первое ++i
i = 6
Второе ++i
i = 7
Выражение
6 + 7 = 13
С
Первое ++i
i = 6
Второе ++i
i = 7
Выражение
i + i = 7 + 7 = 14
Я вообще не в курсе подробностей, но грамотные люди на етом форуме мне говорили что Ети приколы с ++ -- не регламентированы (я не проверял), а также говорили что лутше так не извращаться. и тут я полностю согласен.
в Perl 14.
Цитата: squirL
Java будет 13
Ги. А я поверил skywalker-у и не проверял. Но он ведь тоже наверно пробовал. Может от ВМ зависит ? Если да то ето уже хохма будет :)
ЗЫ. Подозреваю если взять несколько С-шных компилятора то тоже по разному получится.
т.е. сначала вычисляется первый ++i (i=6)
потом второй ++i (i=7)
потом i + i (7+7=14)
А++ имеет более низкий приоритет, чем А + Б (сначала +, потом ++)
Но это все относится к стандарту С и С++. РНР близок к С++ и по идее ответ должен быть такой же, но проверить негде
Я не знаю, как там в JS или PHP, но в С/С++ это назывется undefined behavior, это уже 1000 раз обсуждалось - основной вывод из всего этого - никогда так не нужно писать и ломать себе голову, почему это получилось так, а не иначе. Неопределённое поведение - результат вычислений может быть любым.
А где бы тогда прочитать, когда поведение неопределённое? А то этот сюрприз неожиданный. Мне казалось, что сначала должен выполниться ++i, потом другой ++i, а потом (почему i+i ???!!!) сложение этих увеличенных значений, и должно получиться 13. Но получается реально 14.
избита =) Стандарты здесь не причем.
Тема
Собственно такое поведение логично для больинства C подобных языков и потому так лучше не делать нигде во избежание неопределенностей.
На самом деле просто пятница... вечер :) ... настроение веселое.
Если серьезно говорить, то такими конструкциями в JS и PHP можно так код запутать, что потом проще будет все переписать с нуля, чем править.
Цитата: skywalker
однако в Java и С:
Код:
i=5;
++i + ++i;
++i + ++i;
будет 14?
А вотушнет на с и с++ разные компиляторы будут выдавать разные значения )