Wynik działania programu jest inny, niż wychodzi w obliczeniach

0

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(); 
1

Może napisz dlaczego uważasz, że powinno być 13?

1

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.

1
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();
	}
}

http://ideone.com/utXOkQ

0
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/

0

Zostanie, ale to nie ma żadnego wpływu na wynik, bo w kolejnych linijkach to nadpisujesz.

0

(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 ?

1
 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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1