programmera.net -> java -> normal för utskrift | info@programmera.net |
Numeriska operatorer
1. Numeriska operatorer 2. Division 3. Överskrida räckvidden 4. Tilldelning med operator 5. Inkrementering 6. Komplexa satser |
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:
Programmet skriver ut följande:
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");
}
}
}
[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:
Men resultatet är lite förvirrande:
class TestBound2{
public static void main(String[] args){
byte b=127;
b++;
System.out.println("b="+b);
}
}
Ännu ett exempel:
[olle@dev1]$ java TestBound2
b=-128
Utskriften blir följande:
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);
}
}
[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:
Vi testkör programmet med argumenten 6 och 2:
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);
}
}
[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:
Ett exempel illustrerar saken bättre:
Här får vi följande utskrift:
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);
}
}
[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:
Vi kör programmet:
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);
}
}
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:
[olle@dev1]$ java TestPrecendence
i(result)=8
x=7
i=2
i(result)=9