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:
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.