W tej chwili uczę się o egzamin na JavaScript. Mam również małą wiedzę na temat C i Perla, więc dobrze znam notację przedrostkową i postfiksową we wszystkich trzech językach.Dlaczego notacja Postfiks JavaScript różni się od C i Perla?
zrobiłem egzaminu online praktyka dla niej i jeden błąd zrobiłem było w ocenie następujący kod:
var x = 10;
x += x--;
Teraz, pomyślałem, że to ocenić na 19, ponieważ byłoby to 10 + 10, a następnie odjąć 1 do 9. Ale moja opinia była taka, że była błędna i rzeczywiście wynosi 20. Myślałem, że to brzmi trochę podejrzanie, przetestowałem to w dokumencie HTML, i wyszło z 20 ponownie. Następnie wypróbowałem ekwiwalenty w C i Perlu i oba zostały ocenione na 19
Czy ktoś może mi wyjaśnić, dlaczego JavaScript ocenia odpowiedź jako 20, gdy inne języki oceniają ją na 19? Odpowiedź dostałem od testu nie był zbyt dla mnie jasne:
Przyrost ++ i ubytek - operatorzy mogą być umieszczone przed albo po argumencie. Jeśli operator przyrostu lub dekrementacji zostanie umieszczony przed operandem, operacja nastąpi natychmiast. Jeśli operand inkrementacji lub dekrementacji jest umieszczony za operandem, zmiana wartości argumentu nie jest widoczna, dopóki następnym razem operator nie uzyska dostępu do argumentu w programie. Tak więc, wyrażenie x + = X-- odpowiada x = x + 10, który ma wartość 20.
Ach, jak ja nienawidzę tego rodzaju głupich pytań "gotcha"! Operatory przyrostowe i dekrementujące Postfix nie powinny nigdy występować w wyrażeniu zawierającym inne odniesienie do zmiennej, która jest (w | de) cremented. –
w C, to jest niezdefiniowane zachowanie; jakikolwiek kod zawierający ten fragment jest z natury złamany – Christoph
Czy '+ =' nie wprowadza punktu sekwencyjnego? –