Föreläsning 7 Uttryck, Operatorer Och Kontrollflöden Nyckelord I Java abstract double int super boolean else interface switch break extends long synchronized byte final native this case finally new throw catch float package throws char for private transient class goto protected try const if public void continue implements return volatile default import short while do instanceof static Uttryck Beskriver en bearbetning eller jämförelse Har alltid ett resultat Resultatet har en typ och ett värde Beskrivs genom att en operator appliceras på en eller flera operander 5 + 2 // Operatorn + appliceras på operanderna 5 och 2 // Resultatet av uttrycket är av typen int och har värdet 7 1
Sammansatta Uttryck Ett uttryck kan sättas samman av flera uttryck x = 5 + 2 // Operatorn = appliceras på operanderna x och (uttrycket) 5+2 // Resultatet av uttrycket är av typen int och har värdet 7 Uttrycket har fortfarande ett resultat som kan användas vidare z = 3 + (x = 5 + 2) Prioritet Och Associativitet För att ett givet uttryck ska alltid ge ett bestämt resultat finns det regler hur ett uttryck ska evalueras Prioritering av operatorerna 5 * 6 5 // prioritet Tillämpning av associativitet 60 / 6 * 5 // vänsterassociativitet a = b = c = 42 // högerassociativitet Med parenteser kan evalueringsordningen bestämmas x = ((a + b) * (c / d)) - 42; Primitivatyper boolean char byte short int long float double boolsk typ 16-bitar Unicode 8-bitars heltal 16-bitars heltal 32-bitars heltal 64-bitars heltal 32-bitars flyttal 64-bitars flyttal Samtliga typer är definierade i detalj, vilket innebär att t.ex en int alltid är 32 bitar 2
Wrapper-klasser Hantera primitivatyper som objekt Finns för samtliga primitivatyper Används bl.a. till att konvertera en sträng till en primitiv typ String tal = "33"; int alder = Integer.parseInt(tal); double pi = Double.parseDouble("3.1415"); String s = Integer.toString(alder); boolean Har två möjliga värden eller (sant eller falskt) Booleska uttryck har ett resultat som också är eller Används i kontrollflödeskonstruktion eller som flaggor // Fält private boolean a; // Sätts till private boolean b = ; // Lokala variabler boolean isdone = ; boolean istrue = (2 + 2 == 4); && (and) Booleska operatorer Båda operanderna sanna = uttrycket sant Någon eller båda operanderna falska = uttrycket falskt op1 op2 op1 && op2 boolean op1 = ; boolean op2 = ; boolean and = op1 && op2; (or) Någon eller båda operanderna sanna = uttrycket sant Båda operanderna falska = uttrycket falskt op1 op2 op1 op2 boolean op1 = ; boolean op2 = ; boolean or = op1 op2; ^ (xor) Båda operanderna samma värden = uttrycket falskt Båda operanderna olika värden = uttrycket sant op1 op2 op1 ^ op2 boolean op1 = ; boolean op2 = ; boolean xor = op1 ^ op2;! (not) Är operanden sann = uttrycket falskt Är operanden falsk = uttrycket sant boolean op1 = ; boolean op2 = ; boolean not =!op1; op1 op2!op1 3
Prioritet Och Associativitet Prioritet 1 2 3 4 5 Operator ( )! && ^ Typ parenteser NOT AND XOR OR Alla booleska operatorer har vänsterassociativitet Numeriska Data(typer) Typ byte short int long float double Antal Bitar 8 16 32 64 32 64 Värdeområde -128 till 127-32.768 till 32.767-2.147.483.648 till 2.147.483.647-9.223.372.036.854.775.808 till 9.223.372.036.854.775.807-3.40292347 E+38 till 3.40292347 E+38-1.79769313486231570 E+308 till 1.79769313486231570 E+308 I Java är en typs storlek en del av javadefinitionen vilket gör den lika stor på alla olika plattformar Numeriska Data (precision) Brist på precision kan medföra avrundningsfel. En float har 8 värdesiffror En double har 17 värdesiffror float a = 12345.6789; float b = 0.123456789; avrundas till: a = 12345.679; b = 0.12345679; 4
Aritmetiska Operatorer Operatorer Operation addition subtraktion multiplikation division modulus Operator + - * / % Java m +2 m 2 m * 2 m / 2 m % 2 Algebra m + 2 m - 2 2m, m 2 m 2 m modulo 2 Prioritet Prioritet 1 2 3 Operator ( ) * / % Heltalsdivision resulterar i ett heltal 3 / 2 1 // Heltal 3.0 / 2.0 1.5 // Decimaltal 3 / 2.0 1.5 // Decimaltal 3.0 / 2 1.5 // Decimaltal + - Inkrementeringsoperatorer Används för att öka eller minska ett värde med 1 (++, --) Start Uttryck Operation Tolkning Resultat int j = 0, k = 0; j = ++k; prefix k = k + 1, j = k; j är nu 1 och k är 1 int j = 0, k = 0; j = k++; postfix j = k, k = k + 1 j är nu 0 och k är 1 int j = 1, k = 1; j = --k; prefix k = k 1, j = k j är nu 0 och k är 0 int j = 1, k = 1; j = k--; postfix j = k, k = k - 1 j är nu 1 och k är 0 Använd först k, öka det sedan Öka först k, använd det sedan Tilldelningsoperatorer Tilldelar ett värde till en variabel Kan kombineras med andra vanliga operatorer Operator = += -= *= /= %= Typ Vanlig tilldelning Addition, sen tilldelning Subtraktion, sen tilldelning Multiplikation, sen tilldelning Division, sen tilldelning Rest, sen tilldelning Exempel m = n; m += 3; m -= 3; m *= 3; m /= 3; m %= 3; Tolkning m = n; m = m + 3; m = m 3; m = m * 3; m = m / 3; m = m % 3; 5
Jämförelseoperatorer Används för att jämföra variabler och uttryck med varandra Resultatet är av typen boolean Används normalt i testuttryck för att styra flödet i ett program if (x >= 0) System.out.println( x är större än 0! ); if (x!= -1) System.out.println( x är skilt ifrån 1! ); Jämförelseoperatorer Används för att jämföra variabler och uttryck med varandra Resultatet är av typen boolean Operator Typ Exempel Resultat < mindre än 5 < 10 > större än 10 > 10 <= mindre än eller lika med 11 <= 10 >= större än eller lika med 10 >= 10 == lika med 5 == 5!= ej lika med 5!= 5 Prioritet Prioritet 1 2 3 4 5 6 Operator ( ) ++ -- * / % + - < > <= >= ==!= Typ paranteser ökning, minskning multiplikation, division, modulus addition, subtraktion mindre-, större än (eller lika med) är lika med, skiljt ifrån Använd paranteser för att tydliggöra 6
Villkorsoperatorn Består av tre operander som alla kan vara uttryck Syntax: op1? op2 : op3 Om op1 är sant blir hela uttrycket = op2, annars = op3 Vad gör nedanstående sats? x = (a < b? a : b) char Ett tecken i Java representeras av ett 16-bits positivt heltal Totalt 2 16 = 65536 tecken Java använder Unicode som teckenset char ch = 'a'; System.out.println('b'); // skriver ut b System.out.println(ch); // skriver ut a System.out.println((int)ch); // skriver ut 97 Typkonverteringar För att tilldela en variabel ett värde krävs att detta är av samma typ som variabeln, eller går att konvertera till detta. Implicit (automatisk) konvertering sker om ingen information riskerar att förloras. Från liten typ till större. Explicit konvertering tvingas fram genom en s.k cast. Från strörre typ till mindre 7
Implicit Typkonvertering int i = 13; // automatisk "cast" double d = i; // ok, double rymmer en int short s = i; // fel, short rymmer inte en int När två olika typer ingår i ett uttryck, så konverteras automatiskt den mindre typen till den större innan uttrycket beräknas int i = 3; double d = 2.0; double svar = i / d; // 3 / 2.0 3.0 / 2.0 1.5 Explicit Typkonvertering long j = 13; // påtvingad "cast" int i = (int)j; // long (64 bit) int (32 bit) double d = 3.1415; float f = (float)d; // Kan tappa precision!! int i2 = (int)d; // Tappar decimaldelen Ett flyttal som typas om till en int tappar sin decimaldel (3.14 blir 3) Ett större flyttal som typas om till ett mindre tappar i precision Ett större heltal som typas om till ett mindre kapar bort de högsta bitarna Föreläsning 7 Kontrollflöden 8
Bakgrund All aktivitet sker i metoder Metoder består av programsatser deklarationssatser exekveringssatser Programsatser utförs sekventiellt (i tur och ordning) Ordningen kan dock styras m.h.a kontrollflöden Block Grupperar ihop programsatser till en sammansatt sats Kan användas överallt där en sats är tillåten Ramas in med klamrar... if (wife.ishappy() == ) bag.pack(ball, shoes, beer); friend.call("bowling?"); if (friend.answer().equals("yes")) wife.leavemessage("working late"); Åtkomst (scope) Inom en klass begränsas variablers åtkomst av blocken public void minmetod() int x = 99; int a = 3; if (x < 100) int b = x++; // ok, x nås härifrån int c = a; // ok, a nås härifrån System.out.println(b); // ERROR b nås ej! System.out.println(x); // ok, x nås härifrån 9
Flödeskontroller Typ Villkor Iteration Avbrott Konstruktioner if-else switch while do-while for break continue return if if (condition) block tal > 0 Skriv ut Positivt på skärmen Sätt tal till 1 Fortsätt här // någon kod if (tal > 0) System.out.println("Positivt"); tal = 1; // någon kod if-else if (condition) block1 else block2 tal > 0 Skriv ut Positivt Skriv ut Negativt på skärmen på skärmen Sätt tal till 1 Sätt tal till -1 Fortsätt här // någon kod if (tal > 0) System.out.println("Positivt"); tal = 1; else System.out.println("Negativt"); tal = -1; // någon kod 10
if-else if if (condition1) block1 else if (condition2) block2 else block3 tal > 0 Skriv ut Positivt på skärmen Sätt tal till 1 tal < 0 Skriv ut Negativt på skärmen Sätt tal till -1 tal == 0 Skriv ut Noll på skärmen Sätt tal till 0 Skriv ut Fel!! Fortsätt här if-else-if if (tal > 0) System.out.println("Positivt"); tal = 1; else if (tal < 0) System.out.println("Negativt"); tal = -1; else if (tal == 0) System.out.println("Noll"); tal = 0; else System.out.println("Fel!!"); switch Multipla val fast endast heltal (+ char) kan användas int val = Integer.parseInt(s); switch(val) case 1: System.out.println("Du skrev en 1:a"); break; case 2: System.out.println("Du skrev en 2:a"); break; case 3: System.out.println("Du skrev en 3:a"); break; case 4: case 5: System.out.println("Du skrev en 4:a eller 5:a"); break; default: System.out.println("Ogiltigt värde!"); 11
for for (initiering; test; förändring) block i = 0 i < 10 Skriv ut i for (int i = 0; i < 10; i++) System.out.println("rad" + i); i++ while n = läs in tal while (condition) block n > 0 Skriv ut n dela n med 2 Skriv ut n int n = Integer.parseInt(s); while (n > 0) System.out.println("n = " +n); n /= 2; // n = n / 2; System.out.println(n); do-while do block while (condition) int tal = 0; print "Ange ett tal" tal = inläsning mellan 1 och 5 int tal = 0; do System.out.print( "Ange ett tal mellan 1 och 5: "); String s = input.readline(); tal = Integer.parseInt(s); while (!(tal >= 1 && tal <= 5)); 12
break avslutar en loop tidigare i = 0 i < 10 i == 5 Skriv ut i i++ break for (int i = 0; i < 10; i++) if (i == 5) break; System.out.print(i + " "); 0 1 2 3 4 continue hoppar över resten av loopen i = 0 i <=10 i == 5 print i i++ continue for (int i = 0; i < 10; i++) if (i == 5) continue; System.out.print(i + " "); 0 1 2 3 4 6 7 8 9 return Avslutar exekveringen av en metod Har metoden en returtyp måste ett kompatibelt värde skickas med Är returtypen void behövs inget returvärde anges Används normalt sist i en metod public boolean isnegative(int number) if (number < 0) return ; else return ; 13
Klassen Math Kan utföra mer avancerade matematiska beräkningar (än +,-,* etc) Finns i paketet java.lang (ej import) Innehåller endast statiska metoder int abs(int x) Math.abs(-12) 12 double pow(double x, double y) Math.pow(2, 8) 256.0 double sqrt(double x) Math.sqrt(25) 5.0 int max(int x, int y) Math.max(5, 1) 5 int min(int x, int y) Math.min(5, 1) 1 long round(double x) Math.round(5,49) 5 double sin(double x) Math.sin(30) 0.5 double random() Math.random() 0.0 1.0 Se API:n för fler metoder 14