Изрази и операции

Приоритет на операциите
 
 
 
[ ] ( )      
++ -- ! ~  
* / %    
+ - << >> >>>
< > <= >=  
= = !=      
&        
^        
|        
&&        
||        
?:        
+=    

 

 Асоциативност на операциите

почти всички - отляво на дясно
=  += ...     от дясно на ляво

Пример:
Да се определи редът на изпълнение на оерациите:

z = p * r % q + w / x - y          ==>    z =((((p * r) % q) + (w / x)) - y)
   6    1    2     4    3    5

z = a + b + k* (c = d = 0)         ==>   z = ((a + b) +( k* ((c = (d = 0)) )))
   7    1    6   5    4     3   2

Типове:

Резултатът от операцията е от типа на опернадите. Ако те са от различен тип се извършва предварително изравняване на типа на операндите по начин да няма загуба на информация (стрелките на фигурата по-долу).  

public class Oper {
    public static void main(String arg[]){
        int i1=4, i2 = 5;
        double f1 =5.0;
        f1= i1/i2 +i1/f1;
    }
}

i1/i2 - без преобразуване на типа - резултат 0
i1/f1 - i1 се преобразува в double - резултат 0.8

Явно преобразуване (caste).

public class Oper {
    public static void main(String arg[]){
        int in;
        long ln=123L;
        double db = 34.5;
        in = ln;        //type mismatch
        in = db;        //type mismatch
        in = (int)ln;    //ok
        in = (int)db;    //ok
    }
}

Почти всички операции могат да се използуват само с примитивните типове. Само операциите '=', '= =', и '!=' могат да се използват с всички обекти и класът "String" поддържа операциите '+' и '+='.

Особености:

Операторът '+' се използва с обекти от тип "String" за конкатенация (свързване). Ако един израз започва с обект от тип "String"всички следващи операнди се преобразуват в "String" (в последните версии това преобразуване се извършва дори ако обектът от тип "String" не е първи операнд:

        int x = 0, y = 1, z = 2;
        String sString = "x, y, z ";
        System.out.println(sString + x + y + z);   //  x,y,z 012
        System.out.println(sString + (x + y + z));  //  x,y,z 3


оператор >>>

  Примери:
public class Operators {
    public static void main(String[]arg){
        int in;           // casting
        long ln=123L;
        double db = 34.5;
        //in = ln;        //type mismatch
        //in = db;        //type mismatch
        in = (int)ln;    //ok
        in = (int)db;    //ok
        /*****************************************************/
        String s, s1="Pijo ", s2="loves ",s3= "apples ";   //concatenation
        s= s1+s2;
        System.out.println(s);
        s+=s3;                  // s=s+s3
        System.out.println(s);
        /*****************************************************/
        int i1=4, i2 = 5;      // division
        double f1 =5.0;
        System.out.println("1: "+i1/i2+"\t" +i1/f1);
        /*****************************************************/
        int k, m=3,z=4,p;      // assignment
        p = k =(m = 2) *(z = 4);
        System.out.println("2: "+k+"\t" + m+"\t" + z+"\t" + p+"\t");
        //(p = k) = 2;       //error:  (p = k) is not variable
        /*****************************************************/
        k=m=3;               //increment
        System.out.println("3: "+  ++k +"\t"+ m++);
        System.out.println("4: "+ k +"\t" + m);
        //k= (m++)++;    // error: m++  is not variable
        /*****************************************************/
        System.out.println("11%4:\t"+11%4);   // modulo
        System.out.println("23%6:\t"+23%6);
        System.out.println("-11%3:\t "+ -11%3);
        /*****************************************************/
        System.out.println("25>11:"+(25>11)+ "\t17<=8: "+(17<=8));  //relations
        System.out.println("25==11:"+(25==11)+ "\t 25!=11: "+(25!=11));
        /*****************************************************/
        boolean b1=true,b2=true,b3=false,b4=false;        // booleans
        System.out.println("true && true: "+(b1&&b2)+ "\t true && false: "+(b1&&b3));
        System.out.println("true || false: "+(b1||b3)+ "\t false || false: "+(b3&&b4));
        System.out.println("!true: "+!b1+"\t !false: "+!b3);
        /*****************************************************/
        int a=4, b=9;                                                   // ternary
        System.out.println("ternary:"+ (a>b?a:b)+ "\t"+ (a<b?a:b));      
    }
}


Управляващи структури

Два типа управляващи структури
    – Управляващи структури за избор - позволяват избор на кода за изпънение
    – Управляващи структури за повторение - позволяват повторението определен брой пъти на код за изпълнение

Управляващи структури за избор

{ } блок - последователно изпълняване на инструкциите. Могат да се включват един в друг.

Област на значение на променливите

public class Controle {
    public static void main(String[] arg){
        int n= 4;
        {
            int k = 5;
            {
                int m=3;
            }            // край на валидността на m 
        }                //
край на валидността на
    }                   
// край на валидността на n 
}

if (логически израз) инструкция

Пример:        int grade = 4;
                     if( grade > 3 ) 
                          System.out.println("Congratulations!");

Пример:        int grade = 4;
                     if( grade > 3 ) {
                          System.out.println("Congratulations!");
                     }

или

if (логически израз) {
   инструкция 1
   инструкция 2
   ...
}


Пример;        int grade = 4;
                     if( grade > 3 ) {
                          System.out.println("Congratulations!");
                          System.out.println("You passed!");
                     }

if (логически израз) инструкция else инструкция

Пример:        int grade = 4;
                     if( grade > 3 ) 
                          System.out.println("Congratulations!");
                     else
                         
System.out.println("Sorry!");

Пример:        int grade = 4;
                     if( grade > 3 ) {
                          System.out.println("Congratulations!");
                     } 
                     else {
                         
System.out.println("Sorry!");
                     }

Пример:        int grade = 4;
                     if( grade > 3 ) {
                          System.out.println("Congratulations!");
                          
System.out.println("You passed!");
                     } 
                     else {
                         
System.out.println("Sorry!");
                          
System.out.println("You failed!");
                     }

switch (дискретен израз) {

        case стойност 1: последователност от инструкции 1
        case стойност 2: последователност от инструкции 2
        …

}
 
 

switch (дискретен израз) {
        case стойност 1: последователност от инструкции 1
        case стойност 2: последователност от инструкции 2
        …
        default: последователност от инструкции по подразбиране
}

Пример:
int grade = 4;
switch (grade) {
   case 0:
   case 1:
   case 2:  
System.out.println("You failed!"); break;
   case 3:  
System.out.println("with great difficulty!"); break;
   case 4:  
System.out.println("You passed!"); break;
   case 5:  System.out.println("You are good");break;
   case 6:  System.out.println("You are very good");break;
   default: System.out.println("This is not possible!");
}
                     
                  


break;

Управляващи структури за повторение

do... while


[етикет:]
do инструкция while(логически израз);



public class Controle {
    public static void main(String[] arg){
        int n;
        do{
            n = (int)(Math.random()*3);        // случайно число в интервала [0,2]
            System.out.println("n= "+n);
        }
        while(n!=0);
    }
}

while

[етикет: ]
while(логически израз) инструкция;





public class Controle {
    public static void main(String[] arg){
        int n=3;
        while(n>0){
            System.out.println("n= "+n--);
        }
    }
}


for

[етикет:]
for ( [initialisation] ; [condition] ; [incrémentations])
    instruction





public class Controle {
    public static void main(String[] arg){
        int i,j;
        for(i=5,j=6;j<8;j++,i++)
            System.out.println("i:"+i+"\tj: "+j);
    }
}

public class Controle {
    public static void main(String[] arg){
        for(int i=5,j=6;j<8;j++,i++)
            System.out.println("i:"+i+"\tj: "+j);
    }
}

for (int i=3, double y=7. ; ..... ) // грешка

public class Controle {
    public static void main(String[] arg){
        for(double x =0.;x!=1.5;x+=0.1)        //безкраен цикъл
            System.out.println("x= "+x);
    }
}

 break и continue в do-while




Внимание - опасност от безкраен цикъл

public class Controle {
    public static void main(String[] arg){
        int i =0;
        do{       
            i++;
            if(i==4)break;
            if(i==2)continue;
            System.out.println("i= "+i);       
        }
        while(i<15);
    }
}


break и continue в while






Внимание - опасност от безкраен цикъл

public class Controle {
    public static void main(String[] arg){
        int i =-1;
        while(i<15){
            i++;
            if(i==4)break;
            if(i==2)continue;
            System.out.println("i= "+i);
        }
    }
}

 break и continue в for





public class Controle {
    public static void main(String[] arg){
        for(int i = 0;i<15;i++){
            if(i==4)break;
            if(i==2)continue;
            System.out.println("i= "+i);
        }
    }
}


break;
break етикет;
Ред и линия за първо срещане на зададена стойност
public class Brk {
    public static void main(String arg[]) {
        int[][] numbers = { { 1, 2, 3 }, { 6, 5, 12}, { 6, 8, 18 } };
        int searchNum = 6,i=0,j=0;
        boolean foundNum = false;
        outLoop: for (i=0; i < numbers.length; i++) {
            for (j=0; j < numbers[i].length; j++) {
                if (searchNum == numbers[i][j]) {
                    foundNum = true;
                    break outLoop;
                }
            }
        }
         if (foundNum)
            System.out.println(searchNum + " found on ["+i+","+j+"]");
        else
            System.out.println(searchNum + " not found!");
    }

}

continue;

continue етикет;

Линии в които има зададена стойност
public class Cntn {
    public static void main(String arg[]) {
        int[][] numbers = { { 1, 2, 3 }, { 6, 5, 12}, { 6, 8, 18 } };
        int searchNum = 6,i=0,j=0;
        searchLabel: for (i=0; i < numbers.length; i++) {
            for (j=0; j < numbers[i].length; j++) {
                if (searchNum == numbers[i][j]) {
                    System.out.println(searchNum + " found on line:"+i);
                    continue searchLabel;
                }
            }
        }

    }

}


return