2015年6月30日 星期二

8 運算關係式Expression(2)

8     運算關係式Expression(2)
邏輯運算子(Logical Operators)
邏輯運算子包含and( &)or( | )not( ! ),運算結果如下表:

a
b
a&b
a | b
!a
True
True
True
True
False
True
False
False
True
False
False
True
False
True
True
False
False
False
False
True

class Logical1 {
public static void main (String[] args) {

  System.out.println("(false&true)運算結果 = " + (false&true));
  System.out.println("(true|false)運算結果 = "+ (true|false));
  System.out.println("(!true)運算結果 = "+ (!true));
}
}
執行結果:C:\js>java Logical1
(false&true)運算結果 = false
(true|false)運算結果 = true
(!true)運算結果 = false





短路邏輯運算(Short Circuit Logical Operators)
短路邏輯運算子使用2個邏輯運算子符號,短路and(&&)及短路or( | | )
and(&&):第一個運算值為false時,已注定邏輯運算結果為false,將不必繼續執行第二個運算值。
or( | | ):第一個運算值為true時,已注定邏輯運算結果為true,將不必繼續執行第二個運算值。
class Short10 {
  public static void main (String[] args) {
    int in1 = 3;
    System.out.println("測試 (true && (++in1 > 0)) = "+ (true && (++in1 > 0)));
    System.out.println("測試是否有執行 ++ in1 "+ in1);
    // (++in1>0)要執行,in1=3+1=4
    in1 = 3;
    System.out.println("測試 (false && (++in1 > 0)) = "+ (false && (++in1 > 0)));
    System.out.println("測試是否有執行 ++ in1 "+ in1);
    // (++in1>0)不用執行,in1=3
    in1 = 3;
    System.out.println("測試 (true || (++in1 > 0)) = "+ (true || (++in1> 0)));
    System.out.println("測試是否有執行 ++ in1 "+ in1);
    // (++in1>0)不用執行,in1=3
    in1 = 3;
    System.out.println("測試 (false || (++in1 > 0)) = "+ (false || (++in1 > 0)));
    System.out.println("測試是否有執行 ++ in1 "+ in1);
    // (++in1>0)要執行,in1=3+1=4
  }
}
執行結果:C:\js>java Short10
測試 (true && (++in1 > 0)) = true
測試是否有執行 ++ in1 4
測試 (false && (++in1 > 0)) = false
測試是否有執行 ++ in1 3
測試 (true || (++in1 > 0)) = true
測試是否有執行 ++ in1 3
測試 (false || (++in1 > 0)) = true
測試是否有執行 ++ in1 4



if-else三元運算子
if-else三元運算子是沒有if-else的運算子。
格式:
boolean-exp? exp1 or value1exp2 or value2

Boolean-exp為真時,值為執行exp1結果或為value1Boolean-exp為假時,值為執行exp2結果或為value12。使用if-else三元運算子程式較簡潔,但不易懂。如使用後述if-else述句,則較容易懂,程式碼是多了些。

class Ternary3{
  public static void main (String[] args) {
    int x = 5;
    //  if-else 三元運算 x > 10 ? x + 20 : x+30
    System.out.println("1. x > 10 ? x + 20 : x+30結果為" +( x > 10 ? x + 20 :
      x+30));
    System.out.println("2. x > 3 ? 100 : 200結果為" +( x > 3 ? 100 : 200));

    //  if-else述句x > 10 ? x + 20 : x+30
    if (x > 10)
      System.out.println("3. x > 10結果為" +( x + 20));
    else
      System.out.println("4. x > 10結果為" +( x + 30));
  }
}
執行結果:C:\js>java Ternary3
1. x > 10 ? x + 20 : x+30結果為35
2. x > 3 ? 100 : 200結果為100
4. x > 10結果為35



轉型運算子(Casting Operators)
轉型運算子即前述的資料型別轉換的強迫轉型。
基本型別除boolean型別外皆能強迫轉型。
class型別不允許轉型,String是個特例,但同一classes的物件之間可以轉型,以後會有說明。


其他的運算子
其他運算子尚包含位元運算子(Bitwise Operators)、位移運算子(Shift Bitwise Operators)、補數運算子(Complement Bitwise Operators)等,因較不常使用,待後續有機會再行補足。


2015年6月29日 星期一

7 運算關係式Expression(1)

7     運算關係式Expression(1)
指定運算子(Assignment Operators)
指定運算子以等號 " = " 表示之。為將" = "符號右方之值設定給左方之欄位(變數)

class Assign1 {
  public static void main (String[] args) {
    int num1, lit1, asn1, sum1;

num1 = 20;
lit1= '';
System.out.println("數字 = "+num1);
System.out.println("文字 = "+lit1);

asn1 = lit1;
System.out.println("指定運算後之值 = "+asn1);

sum1 = num1 + lit1;
System.out.println("加法運算後之值 = "+sum1);
  }
}
執行結果:C:\js>java Assign1
數字 = 20
文字 = 24373
指定運算後之值 = 24373
加法運算後之值 = 24393




[賦值及賦址]
基本型別的指定運算,儲存的是實際數值(賦值)。物件的指定運算,儲存的是參考位址(賦址)。須注意下例兩者之不同,即指定運算後,更改一個物件之值,亦會影響另一物件。

class Objvr{
  int r = 10;
}

class Assignvr{
  public static void main(String[] args){
    //賦值運算(7-1)
    int a = 100;
    int b = 200;
    System.out.print("賦值1(指定運算複製前)");
    System.out.print("a = " + a);
    System.out.println("  b = " + b);
   
    a = b;         //指定運算(賦值)
    System.out.print("賦值2(指定運算複製後)");
    System.out.print("a = " + a);
    System.out.println("  b = " + b);
   
    a = 300;         //變更其一之值
    System.out.print("賦值3(變更其一之值後)");
    System.out.print("a = " + a);
    System.out.println("  b = " + b);
   
    //賦址運算(7-2)
    Objvr x = new Objvr();
    Objvr y = new Objvr();
    x.r = 400;
    y.r = 500;
    System.out.print("賦址1(指定運算複製前)");
    System.out.print("x.r = " + x.r);
    System.out.println("  y.r = " + y.r);
   


    x = y;         //指定運算(賦址)x.r = 500y.r = 500
System.out.print("賦址2(指定運算複製後)");
    System.out.print("x.r = " + x.r);
    System.out.println("  y.r = " + y.r);
   
    x.r = 600;      //只更改x.r之值,但位址相同,y.r亦同值
    System.out.print("賦址3(變更其一之值後)");
    System.out.print("x.r = " + x.r);
    System.out.println("  y.r = " + y.r);
  }
}

執行結果:C:\js>java Assignvr
賦值1(指定運算複製前)a = 100  b = 200
賦值2(指定運算複製後)a = 200  b = 200
賦值3(變更其一之值後)a = 300  b = 200
賦址1(指定運算複製前)x.r = 400  y.r = 500
賦址2(指定運算複製後)x.r = 500  y.r = 500
賦址3(變更其一之值後)x.r = 600  y.r = 600





算術運算子(Arithmetic Operators)
算術運算子:加法( + )、減法( - )、乘法( * )、除法( / )、求餘數( % )
class Arith1 {
  public static void main (String[] args) {

    int num1 = 50;
int num2 = 2;
int result1;

result1 = num1 + num2;
System.out.println("兩數相加 = "+ result1);

result1 = num1 - num2;
System.out.println("兩數相減 = "+ result1);

result1 = num1 * num2;
System.out.println("兩數相乘 = "+ result1);

result1 = num1 / num2;
System.out.println("兩數相除 = "+ result1);

result1 = num1 % num2;
System.out.println("餘數之值 = "+ result1);
}
}
執行結果:C:\js>java Arith1
兩數相加 = 52
兩數相減 = 48
兩數相乘 = 100
兩數相除 = 25
餘數之值 = 0





[複合等號]
等號兩邊為同一變數時,可省略等號右邊變數,並將右邊運算符號移至等號左邊,簡化如下:
a = a + b ; 可簡化為 a += b ;
a = a - b ; 可簡化為 a - = b ;
a = a * b ; 可簡化為 a *= b ;
a = a / b ; 可簡化為 a /= b ;
a = a % b ; 可簡化為 a %= b ;

class Comeq1 {
  public static void main (String[] args) {
    int num1 = 50;
    int num2 = 2;
   
    num1 += num2;
    System.out.println("兩數相加 = " +  num1);
   
    num1 -= num2;
    System.out.println("兩數相減 = " +  num1);
      
    num1 *= num2;
    System.out.println("兩數相乘 = " +  num1);
      
    num1 /= num2;
    System.out.println("兩數相除 = " +  num1);
   
    num1 +=1;  
    num1 %= num2;
    System.out.println("餘數之值 = " +  num1);
  }
}
執行結果:C:\js>java Comeq1
兩數相加 = 52
兩數相減 = 50
兩數相乘 = 100
兩數相除 = 50
餘數之值 = 1
一元運算子(Unary Operators)
一元運算子包含證號(+)和負號(-),負號為取得運算元的負值,正號沒有影響。

class Unary1{
public static void main (String[] args) {
int a = 10 , b = 20;
int x , y;
x = -a;  //x的值為-10
    System.out.println("x = " + x);

x = a * -b;  //x = a * (-b);
y = +x;    //正號沒有影響
System.out.println("y = " + y);
}
}

執行結果:C:\js>java Unary1
x = -10
y = -200


遞增/遞減運算子(Increment/Decrement Operators)
前置式:執行時加一或減一          ++a- -a
後置式:執行後加一或減一          a++a- -
class Incre1 {
public static void main (String[] args) {
int num1, num2, num3, num4;

    num1 = 10;
    System.out.println("前置遞增 num1 = "+ ++ num1);

    num2 = 10;
    System.out.println("後置遞增 num2 = "+ num2++);
    System.out.println("後置遞增 num2 = "+ num2);

    num3 = 10;
    System.out.println("前置遞減 num3 = "+ -- num3);

    num4 = 10;
    System.out.println("後置遞減 num4 = "+ num4--);
    System.out.println("後置遞減 num4 = "+ num4);
}
}
執行結果:C:\js>java Incre1
前置遞增 num1 = 11
後置遞增 num2 = 10
後置遞增 num2 = 11
前置遞減 num3 = 9
後置遞減 num4 = 10
後置遞減 num4 = 9



比較運算子(Compare Operators)
比較運算子:等於( = = )、不等於( ! = )、大於( > )、小於( < )、大於等於( > = )
         小於等於( < = )
比較運算子運算結果為true()false()

class Compare1 {
public static void main (String[] args) {
int num1 = 3, num2 = 2;

System.out.println("測試 (num1 == num2) = " + (num1==num2));
System.out.println("測試 (num1 != num2) = " + (num1 != num2));
System.out.println("測試 (num1 > num2) = " + (num1 > num2));
System.out.println("測試 (num1 < num2) = " + (num1 < num2));
System.out.println("測試 (num1 >= num2) = " + (num1 >= num2));
System.out.println("測試 (num1 <= num2) = " + (num1 <= num2));
}
}
執行結果:C:\js>java Compare1
測試 (num1 == num2) = false
測試 (num1 != num2) = true
測試 (num1 > num2) = true
測試 (num1 < num2) = false
測試 (num1 >= num2) = true
測試 (num1 <= num2) = false




*參考型別(物件)之相等性測試將闢另章說明。