Я не уверен, что такое правила на PHP, но в C++ порядок отдельных подвыражений строго не определен или, как технический термин, «неуказан» - другими словами, компилятору разрешено вычислять b = a
до или после него a + b
. До тех пор, пока он не вычитает a + b
и b = a
. Использование «неуказанного» поведения позволяет компилятору создавать более эффективный код в некоторых случаях или просто создавать компилятор для некоторых архитектур.
Это также означает, что если у вас есть выражение, которое «пересчитывает» значение внутри самого выражения, а также использует его в другом месте выражения, вы получаете неопределенное поведение (короткое короткое замыкание). UB означает именно это, поведение не определено - почти все может случиться, в том числе то, что вы видите, и многие другие альтернативы (например, компилятору также разрешено производить 42, даже если логика говорит, что ответ не будет 42 в этом случае [это неправильный вопрос для этого!]).
Я хотел бы также предположить, что если вы хотите поменять местами два значения, в PHP:
$t = $a;
$a = $b;
$b = $t;
и в C++:
#include <algorithm>
std::swap(a, b);
или если вы настаиваете на написании самостоятельно:
int t = a;
a = b;
b = t;
Попытка быть умной и выполнять ее «без временной переменной» почти наверняка сделает ее медленнее, чем e использование временного - конечно же, на языке компиляции, таком как C++, - в интерпретируемом языке, таком как PHP, создание новой переменной может добавить немного дополнительных накладных расходов, но вряд ли это будет настолько большим, по сравнению с дополнительными усилиями в требуемой логике ,
http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors-i-i-i-i-i-etc - ваш код на C++ имеет неопределенное поведение. – Mat
Вы уверены? Я копирую/вставляю код в свой компилятор (g ++), и я получаю «20 10», а не «10 10». – leonm
@leonm Что неудивительно, если поведение не определено. – JJJ