Föreläsning 7 Uttryck, Operatorer Och Kontrollflöden
Nyckelord I Java abstractdoubleintsuper booleanelseinterfaceswitch breakextendslongsynchronized bytefinalnativethis casefinallynewthrow catchfloatpackagethrows charforprivatetransient classgotoprotectedtry constifpublicvoid continueimplementsreturnvolatile defaultimportshortwhile doinstanceofstatic
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 // Operatorn + appliceras på operanderna 5 och 2 // Resultatet av uttrycket är av typen int och har värdet 7
Sammansatta Uttryck Ett uttryck kan sättas samman av flera uttryck x = // 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 evaluerings- ordningen bestämmas x = ((a + b) * (c / d)) - 42;
Primitivatyper boolean boolsk typ char 16-bitar Unicode byte 8-bitars heltal short 16-bitars heltal int 32-bitars heltal long 64-bitars heltal float 32-bitars flyttal double 64-bitars flyttal Samtliga typer är definierade i detalj, vilket innebär att t.ex en int alltid är 32 bitar
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 true eller false (sant eller falskt) Booleska uttryck har ett resultat som också är true eller false Används i kontrollflödeskonstruktion eller som ”flaggor” // Fält private boolean a; // Sätts till false private boolean b = true; // Lokala variabler boolean isDone = false; boolean isTrue = (2 + 2 == 4);
Booleska operatorer && (and) Båda operanderna sanna = uttrycket sant Någon eller båda operanderna falska = uttrycket falskt boolean op1 = true; boolean op2 = false; boolean and = op1 && op2; op1op2op1 && op2 true false truefalse || (or) Någon eller båda operanderna sanna = uttrycket sant Båda operanderna falska = uttrycket falskt boolean op1 = true; boolean op2 = false; boolean or = op1 || op2; op1op2op1 || op2 true falsetrue falsetrue false ^ (xor) Båda operanderna samma värden = uttrycket falskt Båda operanderna olika värden = uttrycket sant boolean op1 = true; boolean op2 = false; boolean xor = op1 ^ op2; op1op2op1 ^ op2 true false truefalsetrue falsetrue false ! (not) Är operanden sann = uttrycket falskt Är operanden falsk = uttrycket sant boolean op1 = true; boolean op2 = false; boolean not = !op1; op1op2!op1 true false truefalse true false true
Prioritet Och Associativitet PrioritetOperatorTyp 1( )parenteser 2!NOT 3&&AND 4^XOR 5||OR Alla booleska operatorer har vänster- associativitet
Numeriska Data(typer) TypAntal BitarVärdeområde byte8-128 till 127 short till int till long till float E+38 till E+38 double E+308 till 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 = ; float b = ; a = ; b = ; avrundas till:
Aritmetiska Operatorer Operatorer OperationOperatorJavaAlgebra addition+m +2 subtraktion-m – 2m - 2 multiplikation*m * 22m, m · 2 division/m / 2 modulus%m % 2m modulo 2 PrioritetOperator 1( ) 2* / % 3+ - Prioritet 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 StartUttryckOperationTolkningResultat int j = 0, k = 0;j = ++k;prefixk = k + 1, j = k;j är nu 1 och k är 1 int j = 0, k = 0;j = k++;postfixj = k, k = k + 1j är nu 0 och k är 1 int j = 1, k = 1;j = --k;prefixk = k – 1, j = kj är nu 0 och k är 0 int j = 1, k = 1;j = k--;postfixj = k, k = k - 1j är nu 1 och k är 0 Använd först k, öka det sedan Används för att öka eller minska ett värde med 1 (++, --) Öka först k, använd det sedan
Tilldelningsoperatorer OperatorTypExempelTolkning =Vanlig tilldelningm = n; +=Addition, sen tilldelningm += 3;m = m + 3; -=Subtraktion, sen tilldelningm -= 3;m = m – 3; *=Multiplikation, sen tilldelningm *= 3;m = m * 3; /=Division, sen tilldelningm /= 3;m = m / 3; %=Rest, sen tilldelningm %= 3;m = m % 3; Tilldelar ett värde till en variabel Kan kombineras med andra vanliga operatorer
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 OperatorTypExempelResultat <mindre än5 < 10true >större än10 > 10false <=mindre än eller lika med11 <= 10false >=större än eller lika med10 >= 10true ==lika med5 == 5true !=ej lika med5 != 5false Används för att jämföra variabler och uttryck med varandra Resultatet är av typen boolean
Prioritet OperatorTyp 1( )paranteser ökning, minskning 3* / %multiplikation, division, modulus 4+ -addition, subtraktion 5 =mindre-, större än (eller lika med) 6== !=är lika med, skiljt ifrån Använd paranteser för att tydliggöra
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 = 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
Implicit Typkonvertering 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 = 13; // automatisk "cast" double d = i; // ok, double rymmer en int short s = i; // fel, short rymmer inte en int int i = 3; double d = 2.0; double svar = i / d; // 3 / 2.0 3.0 / 2.0 1.5
Explicit Typkonvertering 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 long j = 13; // påtvingad "cast" int i = (int)j; // long (64 bit) int (32 bit) double d = ; float f = (float)d; // Kan tappa precision!! int i2 = (int)d; // Tappar decimaldelen
Föreläsning 7 Kontrollflöden
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() == true) { 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 }
Flödeskontroller TypKonstruktioner Villkorif-else switch Iterationwhile do-while for Avbrottbreak continue return
if if (condition) {block} Skriv ut ”Positivt” på skärmen Sätt tal till 1 Fortsätt här tal > 0 false true // någon kod if (tal > 0) { System.out.println("Positivt"); tal = 1; } // någon kod
if-else if (condition) {block1} else {block2} // någon kod if (tal > 0) { System.out.println("Positivt"); tal = 1; } else { System.out.println("Negativt"); tal = -1; } // någon kod Skriv ut ”Positivt” på skärmen Sätt tal till 1 Fortsätt här tal > 0 falsetrue Skriv ut ”Negativt” på skärmen Sätt tal till -1
if-else if if (condition1) {block1} else if (condition2) {block2} else {block3} Skriv ut ”Positivt” på skärmen Fortsätt här tal > 0 false true Sätt tal till 1 tal < 0 tal == 0 Skriv ut ”Negativt” på skärmen true Sätt tal till -1 Skriv ut ”Noll” på skärmen true Sätt tal till 0 Skriv ut ”Fel!!” false
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!"); }
for for (initiering; test; förändring) {block} for (int i = 0; i < 10; i++) { System.out.println("rad" + i); } false Skriv ut i i++ i < 10 true i = 0
while while (condition) {block} int n = Integer.parseInt(s); while (n > 0) { System.out.println("n = " +n); n /= 2; // n = n / 2; } System.out.println(n); n = läs in tal n > 0 false true Skriv ut n dela n med 2 Skriv ut n
do-while do {block} while (condition) 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)); int tal = 0; mellan 1 och 5 true tal = inläsning print "Ange ett tal" false
break avslutar en loop tidigare for (int i = 0; i < 10; i++) { if (i == 5) { break; } System.out.print(i + " "); } Skriv ut i i++ i < 10 false true i = 0 i == 5 true break false
continue hoppar över resten av loopen for (int i = 0; i < 10; i++) { if (i == 5) { continue; } System.out.print(i + " "); } print i i++ i <=10 false true i = 0 i == 5 true continue false
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 true; else return false; }
Klassen Math Kan utföra mer avancerade mate- matiska 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) 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