Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вопрос к программистам [8]
Форумы портала PHP.SU » Разное » Прочее » Вопрос к программистам

Страниц (9): « 1 2 3 4 5 6 7 [8] 9 »
 

106. teddy - 25 Сентября, 2013 - 19:59:13 - перейти к сообщению
EuGen пишет:
$x = 1;
$y = $x + $x++;
var_dump($y);

В данном случае я думаю сначала выполнится инкремент и значение справа будет равно 2 далее +1 от первого $x(он не увеличится т.к у него нет инкремента и будет равен 1) соответственно 3 получаем именно поэтому. Другой логики не вижу
EuGen пишет:

$x = 1;
@ $y = $x + $x++;
var_dump($y); // int(2)

Здесь я думаю @ сбивает приоритет инкремента поэтому и левая и правая часть выражения будут равны 1 соответственно результат будет равен 2

А насчет
EuGen пишет:
$x = 1;
$y = $x + $x + $x++;
var_dump($y);

тут наверное своя хитрость зарытая глубоко в мануале(думаю, что то связано с определенным количеством слогаемых или их значений)

Пока всё... тепло? холодно? Улыбка
107. EuGen - 25 Сентября, 2013 - 20:14:52 - перейти к сообщению
teddy
Все варианты, которые Вы назвали, уж были ранее предложены, но ни один из них не является даже близким к верному ответу.
108. SAD - 25 Сентября, 2013 - 20:42:36 - перейти к сообщению
я не усну, если сегодня не узнаю ответ
109. caballero - 25 Сентября, 2013 - 21:33:05 - перейти к сообщению
в первом случае складываются два числа в ячейку памяти первого
потом оно инкрементится
получаем 3

во втором случае ячейка памяти другая после первых двух операндов и инкрементится старая
ячейка после того как уже выполнено сложение

как то так

кстати с собакой не вижу разницы - то же самое 3
110. EuGen - 25 Сентября, 2013 - 21:38:18 - перейти к сообщению
caballero
Нет. Всё так же далеко от истины. С "@" разница есть.
111. caballero - 25 Сентября, 2013 - 21:38:28 - перейти к сообщению
теоретически должна быть возможность декомпильнуть байт код в асемблеорный код
оно бы сразу прояснилось

не знаю только как байт код выловить
(Добавление)
кстати по поводу ваших тем о расширении функционала

чем больше фич в языке тем сложнее его граматика
а как следствие больше вероятность ее неодноэначности.
особенно в скриптовых языках.
Это к тому что лучше не пихать то что реально не востребовано

думаю данный пример связан с косяками в описании граматики
(Добавление)

вот так дает 2, что интересно
а еще интереснее что дебагер PHPEditor когда выделяешь выражение показывает 4 как и положено
112. Medallion - 25 Сентября, 2013 - 21:47:27 - перейти к сообщению
EuGen пишет:
Поясните, почему в PHP следующие две программы дадут одинаковый результат (3) :
PHP:
скопировать код в буфер обмена
$x = 1;
$y = $x + $x++;
var_dump($y);

и
PHP:
скопировать код в буфер обмена
$x = 1;
$y = $x + $x + $x++;
var_dump($y);


Мало знаний PHP, но что-то подсказывает, что у интрепертатора Php в отношении инкремента, есть свой внутренний счетчик. Это объясняется тем, что если одну и ту же переменную добавить к ней же, инкремент ++ в данном примере не сработает, т.к. интрепертатор видит, что переменная инкрементировалась.
А @ подавляет видимость интрепертатора.

Строго не судите, это мое такое логическое мышление! Улыбка
113. EuGen - 25 Сентября, 2013 - 21:51:22 - перейти к сообщению
Medallion
PHP не устроен так, как Вы описали. Ответ на вопрос состоит совсем в другом.
114. Medallion - 25 Сентября, 2013 - 23:17:14 - перейти к сообщению
Почитал немного документации, и появилась мысля по поводу задачи.
В первом выражении:
$x = 1;
$y = $x + $x++;
var_dump($y);

Т.к. приоритет операторов определяется исходя из их ассоциативности, то в первую очередь выполнится инкремент $x++, а потом добавится единица, в этом случае на выходе 3.

Во-втором выражении:
$x = 1;
$y = $x + $x + $x++;
var_dump($y);

Больший приоритет будет иметь, выражение сложения, т.е. сначала выполнится
$x + $x + $x, а потом переменная $x увеличится на 1, т.к. постфиксный инкремент возвращает значение $x, затем увеличивает $x на единицу.
В этом случае на выходе тоже 3.

Значение @ в выражении, в подавлении ассоциативности (порядку их выполнения).
115. EuGen - 25 Сентября, 2013 - 23:31:58 - перейти к сообщению
Нет (далее, чтобы не превращать задачу в отгадывание, буду комментировать лишь верные мысли)
116. Medallion - 26 Сентября, 2013 - 01:11:03 - перейти к сообщению
Перегрузка постинкремента Растерялся
117. armancho7777777 - 26 Сентября, 2013 - 03:59:30 - перейти к сообщению
armancho7777777 пишет:
ответить попробую

Нет, не отвечу.
EuGen, если кто и мог ответить у нас на форуме на такой спецефичный вопрос, то только caballero.
Так что можно уже выкладывать ответ Подмигивание
118. ALEN - 26 Сентября, 2013 - 08:57:33 - перейти к сообщению
Если разобрать, то что было написано глазами PHP:


выглядит, как:


Если бы запись имела не Post-increment, а pre-increment - значение было бы равно int(4) в связи с большим приоритетом. А в данном случае Post-increment имеет меньший приоритет нежели выражение.

PHP:
скопировать код в буфер обмена
  1. $y=$x++;

аналогичен записи:
PHP:
скопировать код в буфер обмена
  1. $y=$x; $x=$x+1;
119. LIME - 26 Сентября, 2013 - 09:00:07 - перейти к сообщению
ALEN разве у постфиксного и префиксного инкремента/декремента не одинаковый приоритет?
(Добавление)
в таком случае $y=$x+$x; $x++
120. imya - 26 Сентября, 2013 - 09:04:08 - перейти к сообщению
Сижу и жду ответа... Улыбка

 

Powered by ExBB FM 1.0 RC1