Mi wychodzi x=y=13. Program mówi co innego x=y=7. Dlaczego ?
int x, y = 5;
x = ++y * 2;
x = y++;
x = y--;
Console.WriteLine(++y);
Console.WriteLine("x={0}\ny={1}", x, y);
Console.ReadKey();
Mi wychodzi x=y=13. Program mówi co innego x=y=7. Dlaczego ?
int x, y = 5;
x = ++y * 2;
x = y++;
x = y--;
Console.WriteLine(++y);
Console.WriteLine("x={0}\ny={1}", x, y);
Console.ReadKey();
Może napisz dlaczego uważasz, że powinno być 13?
Najpierw y = 5
.
W kolejnych dwóch linijkach inkrementujesz y
więc wynosi on 7.
W kolejnej pod x
podstawiasz y--
. Masz tu postinkrementacje, czyli po tej linijce x = 7
, a y = 6
.
I w następnej linijce masz y++
.
Czyli ostatecznie x=7
,y=7
.
using System;
public class Test
{
public static void Main()
{
int x, y = 5; // y = 5;
Console.WriteLine(y);
x = ++y * 2; // y = 6 (bo ++y zwieksza poprzednia wartosc o 1), x = 6 * 2 = 12
Console.WriteLine("{0}\t{1}", x, y);
x = y++; // y = 7, x = 6 (bo operator post zwraca 'stara' wartosc)
Console.WriteLine("{0}\t{1}", x, y);
x = y--; // y = 6, x = 7 (jw.)
Console.WriteLine("{0}\t{1}", x, y);
Console.WriteLine(++y); // y = 7, x = 7
Console.WriteLine("{0}\t{1}", x, y);
Console.ReadKey();
}
}
Sarrus napisał(a):
Może napisz dlaczego uważasz, że powinno być 13?
Ja to obliczam w ten sposób:
int x, y = 5; // y=5 x=nieznana
x = ++y * 2; // y=6 | x=6*2=12
x = y++; // x=6 | y=6 (w trakcie wykonania instrukcji y=6, a po będzie 7 czyli można zapisać y=7)
x = y--; // x=7 | y=7 (po wykonaniu instrukcji będzie 6)
Console.WriteLine(++y); // x=7 | y=7
Już rozumiem o co chodzi. Popełniłem błąd w obliczeniu matematycznym, założyłem że y też jest równy 12 jak x, a wynosi 6. W komentarzu napisałem już poprawnie.
źródło tego przykładu (zad 2.7 str 55) -> http://c-sharp.ue.katowice.pl/
Zostanie, ale to nie ma żadnego wpływu na wynik, bo w kolejnych linijkach to nadpisujesz.
(zad 2.9a str 56) -> http://c-sharp.ue.katowice.pl/
int x = 1, y = 4, z = 2;
bool wynik = (x++ > 1 && y++ == 4 && z-- > 0);
Console.WriteLine("wynik={0} x={1} y={2} z={3}", wynik, x, y, z);
Console.ReadKey();
Wiem że == ma pierwszeństwo nad && dlatego wynik będzie false. Dlaczego tylko x zmieniło swoją wartość a y i z bez zmian ?
bool wynik = (x++ > 1 && y++ == 4 && z-- > 0);
Operator &&
działa tak, że jeśli jeden z warunków jest fałszywy, to nie sprawdza dalej. Wynika to z tego, że aby wyrażenie było prawdziwe to każda jego część musi być prawdziwa, w przeciwnym wypadku(jeśli choć jedna jest fałszywa) dostajemy fałsz.
Tutaj sprawdzone zostaje tylko x++ > 1
,co jest fałszem, bo zastosowana jest post-inkrementacja. W tym momencie program omija dalsze części warunku i przeskakuje do wypisywania wyniku. Dlatego tylko x
się zmienia.