2012-06-14 14 views
7

jeśli x = 3 i z jest nieprzypisane,
dlaczego z = x-- - --x ocenia na 2?jeśli x = 3 i z jest nieprzypisane, dlaczego z = x-- - - x ocenia na 2?

mój profesor wykłada na ten temat w tej chwili, a ja obecnie utknąłem z tym dylematem. Niestety, nikt nie może wyjaśnić, dlaczego tak się dzieje.

+1

Co to jest "x- - --x"? – dtsg

+0

x w zmniejszeniu po odjęciu minus x przed dekrementacją – arscariosus

+4

jest to 'C# 'lub jest to' JavaScript'? Wybierz odpowiedni tag, proszę. – Tigran

Odpowiedz

17

na x--, x = 3, a potem to 2. na --x, x = 1, ponieważ odejmowanie (od 2) odbywa się wcześniej.

Dlatego, 3 - 1 = 2.

+1

plz udoskonalić odpowiedź ... nadal nie dostałem – Talha

+0

Po prostu ciekawy: czy C# gwarantuje kolejność, w której wyrażenie jest oceniane? Skąd wiemy, że pierwsza dekrementacja ma miejsce? –

+0

@torrentialcoding Ponieważ tak, to "gwarantuje", że. Tak naprawdę to działa. Prefiks jest zdefiniowany jako wykonywany Przed rozpoczęciem pracy i Postfix jest zdefiniowany do wykonania Po zakończeniu operacji. – SimpleVar

8

Oto kolejność operacji, pokazano dla lepszego zrozumienia:

  • x - - --x Trzymaj wartość x (nazwijmy it tmpA). tmpA to 3.
  • x - - --x Zmniejsza x. To teraz 2.
  • x-- - - x Zmniejsza x. To teraz 1.
  • x-- - - x Trzymaj wartość x (pozwala wywołać to tmpB). tmpB to 1.
  • x-- - --x Wykonuje podstruktury od obliczonych wartości. 3 - 1 = 2.

The -- prefix oznacza ubytek będzie wykonane przed oceny ekspresji i postfix -- oznacza ubytek odbywa się po oceny ekspresji.

+1

@downvotwer Chcesz wyjaśnić? – SimpleVar

+0

@ Yorye: Zmodyfikowałem ostatni akapit na (myślę), aby było bardziej zrozumiałe. Twoja ostatnia edycja usuwa to. Jeśli to było zamierzone, nie martw się, ale jeśli nie, możesz spojrzeć na różnicę i przywrócić edycję. –

+0

W tym samym czasie edytowałem go, aby zakodować "--prefix" i "postfix -", co moim zdaniem jest całkiem zrozumiałe. Wcale nie próbowałem zepsuć twojej edycji - i NAPRAWDĘ podobał mi się twój pierwszy - nie wiedziałem, że możesz używać podstawowych znaczników HTML, które wyciągnęły mnie z tej śmiesznej sytuacji. Nie sądziłem, że struktura zdania ostatniej edycji była bardzo zrozumiała, ale będę szczęśliwy, jeśli ponownie zredagowałeś moją odpowiedź, aby otrzymać punkty za swoje ulepszenia :) – SimpleVar

5

Ok, jest dość prosta:

dodajmy wsporniki:

z = (x--) - (--x)

^^ to jak kompilator widzi swój kod po tokenizing.

kompilator ocenia równanie (z prawej strony), od strony lewej do prawej

Teraz,

x-- wynosi pop wartość x, a następnie zmniejszać się i Push do Pamięć wartości. Ok, zróbmy to:

Aktualna wartość X wynosi 3, zmniejszana jest 2 - tak, w równaniu dostaniemy 3, ale X będzie zawierać nową wartość 2.

--x jest równa zmniejszyć wartość X a następnie POP tę wartość do równania. Zróbmy to:

Bieżąca wartość X wynosi 2 (ponieważ poprzednia operacja ją zmniejszyła), a teraz chcemy ją jeszcze raz zmniejszyć. 2-1 = 1, rozumiem.

Teraz wróć do pełnego równania: z = (3) - (1) = 2.

Powiązane problemy