W podręczniku PHP, operator precedence section, jest to przykład:
// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5
rozumiem zachowanie jest niezdefiniowane powodu następującego powodu:
Od x + y = y + x
tłumacz może bezpłatnie oceniać x
i y
w dowolnej kolejności, aby zoptymalizować prędkość i/lub pamięć. Zawarłem to po spojrzeniu na C code example in this article.
Moje pytanie brzmi, że wyjście z powyższego kodu PHP powinny być 4
bez względu na sposób ekspresji i sub-wyrażenia są oceniane:
- OP1 = ++ $ a => $ a = 2 op1 = 2; op2 = $ a ++ => op2 = 2, $ a = 3; 2 + 2 = 4
- op1 = $ a ++ => op1 = 1, $ a = 2; op2 = ++ $ a => op2 = 3, $ a = 3; 1 + 3 = 4
Skąd się bierze 5? Czy powinienem dowiedzieć się więcej o tym, jak działają operatorzy?
Edit:
I zostały patrząc na Incrementing/Decrementing Operators sekcji, ale wciąż nie może zrozumieć, dlaczego 5.
++ $ a: preinkrementuj - Przyrosty $ ao jeden, następnie zwraca $ a.
$ a ++: Post-increment - zwraca $ a, następnie zwiększa się o jeden.
Czy naprawdę wydrukowano 5 podczas uruchamiania tego kodu? – Ranty
Nie. Zawsze miałem 4 wersje PHP. Jest to słowo _may_, oznacza to, że mogę uruchomić ten kod milion razy, uzyskując reesult 4, ale nie ma _gwarancji_. –
@ H2CO3: Jestem bardziej zainteresowany poznaniem _dlaczego 5_. –