Programowanie Komputerów Łukasz Kuszner pokój 209, WETI http://www.kaims.pl/ kuszner/ kuszner@eti.pg.gda.pl Wykład 30 godzin, Laboratoria 30 godzin 2012/ Strona 1 z 17
1. Typy i zmienne Jak wiemy, komputer operuje na danych binarnych. Można myśleć, że dane w pamięci komputera to ciągi liczb złożone z 0 i 1. Sposób interpretacji przechowywanych danych zależy od ich typu. Wspomniano już o typie całkowitoliczbowym int. Typ char odnosi się do danych znakowych. Do przechowywania danych służą zmienne. Każda zmienna reprezentuje pewien obszar pamięci W Języku C# kompilator gwarantuje, że wartość przechowywana w danej zmiennej jest zgodna z danym typem (ang. C# is a type-safe language). Strona 2 z 17
Interpretacja i rozmiar Kolejną różnicą między typami danych jest ich rozmiar. Typ char ma dwa bajty, czyli 16 bitów, a typ int ma 4 bajty (32 bity) to gwarantuje standard, Strona 3 z 17
Typy całkowite Alias C# Typ.NET bity zakres sbyte System.SByte 8 128 do 127 byte System.Byte 8 0 do 255 short System.Int16 16 32768 do 32767 ushort System.UInt16 16 0 do 65535 char System.Char 16 znak unicode, 0 do 65535 int System.Int32 32 2 31 do 2 31 1 uint System.UInt32 32 0 do 2 32 1 long System.Int64 64 2 63 do 2 63 1 ulong System.UInt64 64 0 do 2 64 1 Strona 4 z 17
Typy zmiennoprzecinkowe Alias C# Typ.NET bity float System.Single 32 double System.Double 64 decimal System.Decimal 128 Strona 5 z 17
Inne typy predefiniowane Alias C# Typ.NET bity bool System.Boolean 32 object System.Object 32/64 string System.String 16 * długość Strona 6 z 17
2. W języku C# rozróżniamy kilka kategorii zmiennych: statyczne, wystąpienia (ang. instance variables), elementy tablic, parametry przekazywane przez wartość, parametry przekazywane przez referencje, parametery wyjściowe, zmienne lokalne. Powyższe rozróżnienie jest ważne ze względu na wartości początkowe zmiennych. Niektóre rodzaje zmiennych mają przypisane wartości domyślne - a innym trzeba zawsze te wartości nadać. Strona 7 z 17
Przykład 1. using System ; public class Test public static void Main ( ) int a ; // zmienna lokalna to taka, która // została zdefiniowana wewnątrz metody Console. WriteLine ( a ) ; // zmienne lokalne nie mają przypisanej // wartości domyślnej Kompilator odpowie: prog.cs(9,23): error CS0165: Use of unassigned local variable a Compilation failed: 1 error(s), 0 warnings Strona 8 z 17
Przykład 2. Definicja zmiennej lokalnej i przypisanie jej wartości początkowej: using System ; public class Test public static void Main ( ) int a = 3 ; Console. WriteLine ( a ) ; // teraz wszystko j e s t w porządku Strona 9 z 17
Przykład 3. Definicja zmiennej statycznej nie wymaga podania wartości początkowej: using System ; public class Test static int a ; public static void Main ( ) Console. WriteLine ( a ) ; Teraz również program zadziała, zostanie wypisana wartość : 0 Strona 10 z 17
3. (ang. assignment) Operator = nazywamy operatorem podstawienia. Operator ten jest dwuargumentowy. Po jego prawej stronie musi się znaleźć wyrażenie, którego wartość jest typu zgodnego z lewym argumentem. Z kolei lewy argument musi być tak zwaną l-wartością, czyli czymś pod co można podstawić wartość. Strona 11 z 17
4. Dotychczas poznaliśmy jeden operator =. Jest to dwuargumentowy operator przypisania. Wyrażenie a=b oznacza, że lewemu operandowi a przypisuje się wartość b. Inne operatory to np.: + dodawanie, - odejmowanie, * mnożenie, > porównanie: lewy większy od prawego, < porównanie: lewy mniejszy od prawego, == porównanie: lewy równy prawemu. Strona 12 z 17
5. Łączność może być lewostronna lub prawostronna. Przykład 4. Podstawienie jest prawostronnie łączne: using System ; public class Test public static void Main ( ) int a ; int b ; a = b = 3 ; Console. WriteLine ( a ) ; Console. WriteLine (b ) ; Zostanie wypisane: 3 3 Typy i zmienne Strona 13 z 17
Przykład 5. Dodawanie jest lewostronnie łączne: using System ; public class Test public static void Main ( ) int a = 3 ; int b = 2 ; string s = Hej ; Console. WriteLine ( s + a + b ) ; Console. WriteLine ( s + ( a + b ) ) ; Zostanie wypisane: Hej 23 Hej 5 Strona 14 z 17
6. Operator + ma różne działanie w zależności od tego, czu użyjemy go do operandów typu liczbowego, czy typu string i raz wykonuje zwykłe dodawanie, a raz sklejanie napisów. W sytuacji, gdy jeden operand jest typu liczbowego, a drugi jest typu string, wtedy następuje niejawna konwersja (ang. implicit conversion) liczby na napis. Konwersję można też wymusić, wtedy mamy do czynienia z konwersją jawną (ang. explicit conversion). Przykład 6. using System ; public class Test public static void Main ( ) int a = 3 ; int b = 2 ; Console. WriteLine ( a/b ) ; // 1 Console. WriteLine ( ( double) a/b ) ; // 1.5 Typy i zmienne Strona 15 z 17
7. Każda instrukcja musi być zakończona średnikiem, np: int x = 0 ; Console. WriteLine ( x ) ; Nawiasy klamrowe służą do grupowania instrukcji w instrukcję złożoną, czyli blok, np.: int x = 0 ; Console. WriteLine ( x ) ; Strona 16 z 17
Strona 17 z 17