Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чудеса программирования

352
14 марта 2008 года
skywalker
694 / / 10.02.2006
Почему:
[highlight=javascript]
var i=5;
alert(++i + ++i);
[/highlight]
вернет 13.
[highlight=php]
$i=5;
echo ++$i + ++$i;
[/highlight]
тоже 13, однако в Java и С:
 
Код:
i=5;
++i + ++i;

будет 14?
276
14 марта 2008 года
Rebbit
1.1K / / 01.08.2005
Потому что в Джаве и С ++і ето lvalue и еще наверно потому что лутше выражения щитают.

PhP
Первое ++i
i = 6
Второе ++i
i = 7
Выражение
6 + 7 = 13


С
Первое ++i
i = 6
Второе ++i
i = 7
Выражение
i + i = 7 + 7 = 14

Я вообще не в курсе подробностей, но грамотные люди на етом форуме мне говорили что Ети приколы с ++ -- не регламентированы (я не проверял), а также говорили что лутше так не извращаться. и тут я полностю согласен.
2
14 марта 2008 года
squirL
5.6K / / 13.08.2003
в Java будет 13. только что проверили с коллегами.
в Perl 14.
276
14 марта 2008 года
Rebbit
1.1K / / 01.08.2005
Цитата: squirL
Java будет 13


Ги. А я поверил skywalker-у и не проверял. Но он ведь тоже наверно пробовал. Может от ВМ зависит ? Если да то ето уже хохма будет :)

ЗЫ. Подозреваю если взять несколько С-шных компилятора то тоже по разному получится.

1.6K
14 марта 2008 года
Tdr
154 / / 13.11.2003
Вобще, ++А имеет более высокий приоритет, чем А + Б
т.е. сначала вычисляется первый ++i (i=6)
потом второй ++i (i=7)
потом i + i (7+7=14)

А++ имеет более низкий приоритет, чем А + Б (сначала +, потом ++)

Но это все относится к стандарту С и С++. РНР близок к С++ и по идее ответ должен быть такой же, но проверить негде
1.8K
14 марта 2008 года
igor_nf
256 / / 13.12.2006
Я не знаю, как там в JS или PHP, но в С/С++ это назывется undefined behavior, это уже 1000 раз обсуждалось - основной вывод из всего этого - никогда так не нужно писать и ломать себе голову, почему это получилось так, а не иначе. Неопределённое поведение - результат вычислений может быть любым.
5.3K
14 марта 2008 года
Somebody
185 / / 24.12.2006
А где бы тогда прочитать, когда поведение неопределённое? А то этот сюрприз неожиданный. Мне казалось, что сначала должен выполниться ++i, потом другой ++i, а потом (почему i+i ???!!!) сложение этих увеличенных значений, и должно получиться 13. Но получается реально 14.
361
14 марта 2008 года
Odissey_
661 / / 19.09.2006
Тема избита =) Стандарты здесь не причем.
240
14 марта 2008 года
aks
2.5K / / 14.07.2006
Somebody, про неопределенное поведение поитать можно в стандарте языка. В С++ в частности изминение более чем один раз значения переменно в пределах одной точки следования - это как раз undefined behavior. Точки следования разделяются отдельными выражениями, точкой вызова функции и возвратом из функции и операторами: ',' '?' и быстрыми логическими операторами ||, &&. Тоесть по сути это такое конечное состояние в котором гарантируется, что все значения вычисленны и положенны в нужные переменные.

Собственно такое поведение логично для больинства C подобных языков и потому так лучше не делать нигде во избежание неопределенностей.
352
14 марта 2008 года
skywalker
694 / / 10.02.2006
Цитата: Odissey_
Тема избита =) Стандарты здесь не причем.


На самом деле просто пятница... вечер :) ... настроение веселое.

Если серьезно говорить, то такими конструкциями в JS и PHP можно так код запутать, что потом проще будет все переписать с нуля, чем править.

9.3K
15 марта 2008 года
iridum
175 / / 26.08.2007
Цитата: skywalker

однако в Java и С:
 
Код:
i=5;
++i + ++i;

будет 14?



А вотушнет на с и с++ разные компиляторы будут выдавать разные значения )

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог