2010-09-15 13 views
10

Jestem nowicjuszem w Javie i mam tło C. Przechodzę przez książkę Khalida Moughala. Na stronie 126 daje przykład jakKoncepcja punktu sekwencyjnego w java

int i = 10; 

    int k = ++i + --i; // ((++i) + (--i)). 

To wyraźnie narusza koncepcję sekwencji jako punkt C, który mówi, że nie można zmienić wartość zmiennej więcej niż raz w tym samym punkcie sekwencji. Moje pytanie brzmi, czy ta sama reguła punktu kolejności dotyczy java czy nie? Możliwe, że wziął ten przykład tylko po to, aby wyjaśnić pojęcie przedrostka unarnego operatora i jego działania ubocznego, ale taki przykład, który wyraźnie narusza bardzo podstawową regułę języka, nie jest oczekiwany w książce tak znanej jak Khalid Moughal.

Więc proszę potwierdzić to.

Mam nadzieję, że ludzie weźmiecie to we właściwym duchu.

Dzięki,

Mawia

+2

C ma dużo bagażu z faktu, że istniały dziesiątki kompilatorów i milionów istniejących programów, zanim standard został napisany, więc musieli wykonać standard w taki sposób, aby nie przerwać programów zależnych od sposób, w jaki dany kompilator optymalizuje rzeczy. Również optymalizacja była dość prymitywna, co tłumaczy słowo kluczowe "register", które pozwala programistom wykonywać mikrooptymalizacje, które każdy przyzwoity kompilator może zrobić lepiej. –

Odpowiedz

8

Moje pytanie brzmi, czy ta sama zasada ma zastosowanie punkt sekwencja w Javie czy nie?

Nie, w Java nie ma punktów sekwencyjnych. Kolejność oceny (etc) jest dobrze zdefiniowana w Javie.

Przeczytaj również odpowiedź this.

+8

Mimo że zamówienie jest dobrze zdefiniowane, należy zauważyć, że każdy, kto nauczałby pisać kod taki jak ten, powinien odwołać swoją licencję na miejscu ... – EFraim

+0

@EFraim: True! :) –

+0

Drugi link już nie działa. –

0

Nie, nie ma koncepcji punktów sekwencyjnych w języku Java i kolejność jest w pełni zdefiniowana. Ogólnie rzecz biorąc, wyrażenia są oceniane od lewej do prawej. Dla formalnej definicji można przeczytać JLS, sekcja 15.7 o kolejności oceny. Zobacz link this.

Powiązane problemy