1. Numeriska operatorer
I nedanstående tabell listas alla numeriska operatorer i Java. Varje operator har en prioritet, som gör att man inte behöver använda så många paranteser.
Operator | | Prioritet | | Beskrivning |
++ | | 1 | | Ökning av en variabel med 1, eller 1.0 |
-- | | 1 | | Minskning av en variabel med 1, eller 1.0 |
+ | | 1 | | Unärt plus (Multiplikation med 1) |
- | | 1 | | Unärt minus (Multiplikation med -1) |
/ | | 2 | | Division |
* | | 2 | | Multiplikation |
% | | 2 | | Modulo |
+ | | 3 | | Addition |
- | | 3 | | Subtraktion |
op= | | 13 | | Tilldelning med någon operator (op står för någon operator +,-,/,*,%) |
2. Division
Division är den enda matematiska operation som kan få JVM att kasta undantag. Detta sker i fallet då vi försöker dela ett heltal med noll. Då kastas ArithmeticException. Annars tillåter JVM allt när man gör beräkningar:
class TestDivIntZero{
public static void main(String[] args){
int i=1;
try{
i=i/0;
System.out.println("Division ok! i="+i);
}catch(ArithmeticException ae){
System.out.println("ArithmeticException cuz weve been bad!");
}catch(Exception e){
System.out.println("Something else is wrong");
}
}
}
|
Programmet skriver ut följande:
[olle@dev1]$ java TestDivIntZero
ArithmeticException cuz weve been bad!
|
3. Överskrida räckvidden
JVM protesterar alltså inte då man överskrider räckvidden på något annat sätt. Nedan kommer ett exempel:
class TestBound2{
public static void main(String[] args){
byte b=127;
b++;
System.out.println("b="+b);
}
}
|
Men resultatet är lite förvirrande:
[olle@dev1]$ java TestBound2
b=-128
|
Ännu ett exempel:
class TestBound3{
public static void main(String[] args){
int i1=0xffffffff;
int i2=0xfffffffe;
int i3=0x7fffffff; // ints MAX_VALUE
int i4=i3+1; // we try to increase it
System.out.println("i1="+i1);
System.out.println("i2="+i2);
System.out.println("i3="+i3);
System.out.println("i4="+i4);
}
}
|
Utskriften blir följande:
[olle@dev1]$ java TestBound3
i1=-1
i2=-2
i3= 2124483647
i4=-2124483648
|
4. Tilldelning med operator
Tilldelning med operator besparar dig att skriva variabelnamnet två gånger. I stället för x=x*2; skriver du alltså x*=2;. Nedan följer ett program som testar alla tilldeningar:
class TestAssignment{
public static void main(String[] args){
int x,y,z;
if(args.length<2) {
System.out.println("Expecting 2 integers");
System.exit(1);
}
z=Integer.parseInt(args[0]);
y=Integer.parseInt(args[1]);
x=z;
x+=y;
System.out.println("+="+x);
x=z;
x-=y;
System.out.println("-="+x);
x=z;
x*=y;
System.out.println("*="+x);
x=z;
x/=y;
System.out.println("/="+x);
x=z;
x%=y;
System.out.println("%="+x);
}
}
|
Vi testkör programmet med argumenten 6 och 2:
[olle@dev1]$ java TestAssignment 6 2
+=8
-=4
*=12
/=3
%=0
|
5. Inkrementering
En av de vanligaste satserna i programmering är i=i+1;, vi lärde oss att med tilldelningsoperatorer kan detta skrivas i+=1;. Det finns även ett ännu snabbare sätt att skriva detta i Java, nämligen i++; eller ++i;. ++/-- kan även användas inom uttryck och men man får då två fall:
- i++ evalueras i uttrycket till i och sedan inkrementeras variabeln i.
- ++i evalueras i uttrycket till i+1 och sedan inkrementeras variabeln i.
Ett exempel illustrerar saken bättre:
class TestIncrement{
public static void main(String[] args){
int i=3;
int x;
x=i++;
System.out.println("x="+x+" i="+i);
i=3;
x=++i;
System.out.println("x="+x+" i="+i);
}
}
|
Här får vi följande utskrift:
[olle@dev1]$ java TestIncrement
x=3 i=4
x=4 i=4
|
6. Komplexa satser
Om man klumpar ihop för många operationer i samma sats kan resultatet bli oväntat:
class TestPrecendence{
public static void main(String[] args){
int i=1;
i+=7*i++;
System.out.println("i(result)="+i);
int x;
i=1;
x=7*i++;
System.out.println("x="+x);
System.out.println("i="+i);
i+=x;
System.out.println("i(result)="+i);
}
}
|
Vi kör programmet:
[olle@dev1]$ java TestPrecendence
i(result)=8
x=7
i=2
i(result)=9
|
Problemet med satsen i+=7*i++; är att variabeln i tilldelas ett värde 2 gånger, och därför ignoreras tilldelningen i++. Man kan se satsen som en trestegsraket:
- Först evalueras 7*i++ till 8, eftersom i++ ersätts med i i utrycket.
- Sedan tilldelas i värdet 2. Det är i++ som utför detta.
- Sist tilldelas i värdet 8 som beräknades tidigare.