2015-01-13 2 views
6

Почему значения переменной в PHP не имеют последовательного поведения в следующем коде?Почему оператор pre/post increment ведет себя неправильно?

<?php 
$piece = 10; 
// output is 10 10 10 10 11 12 
echo $piece . $piece . $piece . $piece++ . $piece . ++$piece; 

$piece = 10; 
// output is 10 10 10 11 12 
echo $piece . $piece . $piece++ . $piece . ++$piece; 

$piece = 10; 
// output is 11 10 11 12 
echo $piece . $piece++ . $piece . ++$piece; 
?> 

Вопрос в том, почему первый результат в последнем примере равен 11? вместо 10, как он дает выше 2 примеров.

+0

Операторы приращения/сокращения: http://php.net/manual/en/language.operators.increment.php – solar411

+0

@ solar411 Вы можете ссылаться на нечто более конкретное? –

+0

Вот код для этого: http://codepad.org/gEoWxshO. Очень странное поведение - это похоже на то, что предварительный приращение во втором блоке выполняется снова в первой «$ штуке» в третьем блоке. Или, может быть, пост-приращение в третьем блоке отвечает, и в этом случае несогласованность между примерами не объясняется. – halfer

ответ

6

От http://php.net/manual/en/language.operators.precedence.php:

Старшинство и ассоциативность только определить, каким образом выражения сгруппированы, они не определяют порядок оценки. PHP (в общем случае) не указывает, в каком порядке оценивается выражение, а код, который предполагает определенный порядок оценки, следует избегать, поскольку поведение может изменяться между версиями PHP или в зависимости от окружающего кода.

<?php 
$a = 1; 
echo $a + $a++; // may print either 2 or 3 

$i = 1; 
$array[$i] = $i++; // may set either index 1 or 2 
?> 

Другими словами, вы не можете полагаться на ++ вступления в силу в определенный момент времени по отношению к остальной части выражения.

+0

Downvoter: следить за комментариями? –

+0

Похоже на то, что я ответил на вопрос ... –

+0

Не знал об этом ... очень странно. + 1 – JorgeeFG

Смежные вопросы