Козни оператора ++

camka

не самка
Козни оператора ++

Подскажите пожалуйста почему
PHP:
<?php
$i=1;
$i=$i++;
echo $i;// vyvodit 1 hotja dolzhen 2
?>
не выполняется оператор ++. Это expected behaviour или что?
 

.des.

Поставил пиво кому надо ;-)
Должен выводить 1. Так и выводит все правильно.

$i++ постфиксная операция.
сначала идет присвоение $i=$i а потом правой части операнда - имхо временая копия $i увеличивается на 1
а $i как было так и осталось 1.
Не надо извращаться над парсером.

тьфу ты право лево.. у меня еще с детства с этим плохо
 

Crazy

Developer
Прекрасно выполняется оператор ++. В точности по документации. Просто ты спутал его с оператором ++. :)

Ты хотел вот так:

PHP:
$i = ++$i;
Но это тоже глупость. Правильно:

PHP:
++$i
Или

PHP:
$i++
:D
 

.des.

Поставил пиво кому надо ;-)
Я почему то знал, что Crazy отреагирует на этот пост. :D
 

.des.

Поставил пиво кому надо ;-)
А вот и неправда.. я первым застолбил, а потом дописал :) Вот как.. так что никто не узнает, что ты был первым :)



Неужели я в этом признался? :D
 

camka

не самка
$i=1;
$i=$i++;// тут все верно. $i=1; но должен после этого еще выполниться и ++ оперетор. и увеличить $i еще на единицу. и echo должно выдать 2

по-моему вполне логично
 

Demiurg

Guest
этот код эквивалентен следующему:
$i=1;
$temp = $i+1;
$i=$i;
echo $i;

понятно ?
 

YRusinov

Филин Ух
Отнюдь, присваивание выполняется справа налево, поэтому порядок такой: вычисляется значение выражение $i++, оно оказывается равным 1, увеличивается $i и увеличенному значению $i присваивается значение в правой части, т.е. 1
 

young

Новичок
[offtopic on]

#include <stdio.h>
void main() {
int i = 1;
i = i++;
printf("%d", i);
}

Вывело 2
 

Demiurg

Guest
в с++ стандарт не указывает что должно быть выполнено первым присвоение или инкрементация, поэтому на разных компиляторах могут быть разные результаты.

[offtopic off]
 

young

Новичок
Автор оригинала: Demiurg
этот код эквивалентен следующему:
$i=1;
$temp = $i+1;
$i=$i;
echo $i;

понятно ?
Абсолютно непонятно?
А где происходит возвращение из $temp?!
Тоесть: $i++ равносильно:
$temp = $i + 1;
$i = $temp;

Тогда пример
$i=1;
$temp = $i+1;
$i = $temp;
$i=$i;
echo $i;

или

$i=1;
$temp = $i+1;
$i=$i;
$i = $temp;
echo $i;

и почему?!
 

Crazy

Developer
Автор оригинала: Demiurg
в с++ стандарт не указывает что должно быть выполнено первым присвоение или инкрементация[offtopic off]
Бывает еще более веселый код:

Код:
data[i++] = data[i++];
Найдено в реальной программе. Каковая, разумеется, резко меняла свое поведение при смене компилятора. :)
 

Demiurg

Guest
young, не надо искать абсолютно идеинтичный код. В с++ все это раскрывается через операторы. В php операторов нет, считай, что $i++ это :
function plus(&$i)
{
$temp = $i;
++$i;
return $temp;
}

и сначала выполняется инкрементация, потом присваивание.
 

young

Новичок
Так я все равно не понял почему будет 2.

Мои рассуждения.
$i = 1; Без вопросов.
$i = $i++ расписывается как
1) Присвоить $i = 1
2) Сделать инкримент

Причем не зависимо от того как он делается, он желается уже после присвоения!!!
 

si

Administrator
а с Zend Optimizer могут быть еще варианты. Вывод один - так писать не надо.
 
Сверху