Jaka jest różnica między oceną == i równa się w C#?== vs Równe w C#
Ex,
if(x==x++)//Always returns true
ale
if(x.Equals(x++))//Always returns false
Zmieniano:
int x=0;
int y=0;
if(x.Equals(y++))// Returns True
Jaka jest różnica między oceną == i równa się w C#?== vs Równe w C#
Ex,
if(x==x++)//Always returns true
ale
if(x.Equals(x++))//Always returns false
Zmieniano:
int x=0;
int y=0;
if(x.Equals(y++))// Returns True
Zgodnie ze specyfikacją jest to oczekiwane zachowanie.
Zachowanie pierwszy reguluje sekcji 7.3 specyfikacji:
operandów w wyrażeniu są obliczane od lewej do prawej. Na przykład w
F(i) + G(i++) * H(i)
, wywoływana jest metoda F przy użyciu starej wartości i, a następnie metoda G jest wywoływana ze starą wartością i, w końcu metoda H jest wywoływana z nową wartością i. Jest to oddzielne i niezwiązane z pierwszeństwem operatora.
Zatem w x==x++
najpierw lewy argument jest oceniany (0
), a następnie po prawej stronie jest oceniana (0
, x
staje 1
), a następnie porównanie odbywa się: 0 == 0
jest prawdą.
Zachowanie drugiego reguluje sekcji 7.5.5:
- jeśli M jest członkiem funkcja przykład uznane w wartości typu:
- E jest oceniany. Jeśli ta ocena powoduje wyjątek, nie są wykonywane żadne dalsze kroki.
- Jeśli E nie jest klasyfikowane jako zmienna, tworzona jest tymczasowa zmienna lokalna typu E, a wartość E jest przypisana do tej zmiennej. E jest następnie przeklasyfikowane jako odniesienie do tej tymczasowej zmiennej lokalnej. Zmienna tymczasowa jest dostępna w M, ale nie w żaden inny sposób. Tak więc tylko wtedy, gdy E jest zmienną rzeczywistą, osoba dzwoniąca może obserwować zmiany, które M robi w tym celu.
- Lista argumentów jest oceniana zgodnie z opisem w punkcie 7.5.1.
- M jest wywoływany. Zmienna, do której odnosi się E, staje się zmienną, do której się odwołuje.
Zauważ, że typy wartości są przekazywane przez referencję własnych metod.
Zatem w x.Equals(x++)
, pierwszy cel jest oceniana (E x
zmienna), to argumenty są oceniane (0
, x
się 1
), a następnie porównanie odbywa: x.Equals(0)
fałszywe.
EDYCJA: Chciałem również dodać do komentarza opublikowanego przez dtb komentarz, który został wysłany, gdy pytanie zostało zamknięte. Myślę, że mówił to samo, ale z ograniczeniem długości komentarzy nie był w stanie wyrazić go w pełni.
Kolejność oceny. ++ ocenia pierwszy (drugi przykład). Ale w pierwszym przykładzie == wykonuje się najpierw.
Nie zgadzam się wypróbować tego, patrz edytowana część –
Wow! Nie mogę uwierzyć własnym oczom ... Wrócę do ciebie – Aliostad
Sure Anytime .... ale wynik pozostanie taki sam, nawet jeśli przyjdziesz po roku ... :) –
@ Moderatorzy: Przeczytajcie pełne pytanie przed zamknięciem jakiegokolwiek pytania. Jeśli masz prawo zamknąć każde pytanie, użyj ich we właściwym miejscu. –
@ Jørn Schou-Rode, Arcturus, Oded, Pandiya Chendur, GregS: Ponieważ wszyscy głosowaliście, aby zamknąć to pytanie. Podaj mi poprawną odpowiedź na powyższe pytanie lub ponownie otwórz pytanie. –