JAVA-運算符及流程控制語句

運算符:運算符是一種特殊的符號,用以表示數據的運算、賦值和比較等。

  算數運算符

        加(+)、減法(-)、乘(*)、除(/)、 取餘(%)

  整數相除,只能取整數部分,小數部分被捨棄。

  整數運算時,0不能做除數;浮點運算時,0.0可以,但結果是無窮。


     +  -  + - * / % ++ -- +

注意:1) /:   int i = 12;  i = i / 5;

          2) %:最後的符號只跟被模數相同

          3)前++:先+1,後運算     後++:先運算,後+1

          4)+:String字符串與其他數據類型只能做連接運算,且結果爲String類型。

                sysout('*' + '\t' + '*'); vs  sysout("*" + '\t' + '*');



  關係運算符: >(大於),<(小於),>=(大於等於),<=(小於等於),==(等於),!=(不等於)。

        所有的關係運算符結果就是 布爾類型,真或假。


  注意: = 叫賦值運算,== 是判斷是否相等。


   自增++/自減運算符--

   自增/自減運算符只能用於變量,常數不可以。

   自增和自減用法是完全一樣,所以只講自增。

   自增++就是讓變量自增1,自減--就是讓變量自減1.

   自增運算符的用法有兩種,前++(++i)和後++(i++)。效果都會讓i自增1,但++i會用自增以後的數進行運算;而i++會用自增以前的數進行運算

    int a = 5;

    System.out.println(i++);//5 i是6

    System.out.println(++i);//7 i是7


  經驗:

   1 同一個語句中,++最好只一次。

   2 i=i++; 或 i=++i 都沒有意義,用了++就不要再賦值了。


 邏輯運算符   &   &&  |  ||  ^ !

   與 (&/&&)  並且,兩個條件都爲真,結果才真;否則結果爲假

   或 (|/||)  或者,兩個條件有一個爲真,結果爲真;只有都不成立才爲假。

   非 (!)   不是,取反

   邏輯運算符的優化:當前面表達式決定了整個邏輯運算的值時,後面的條件不需要再判斷。叫短路。短路與(&&)/短路或(||)/邏輯非(!)。

   具體說,就是 與運算 時,如果前面的條件爲假時,後面就不判斷了;

    或運算 時,如果前面的條件爲真時,後面就不判斷了。

   

  

  三目/條件運算符

   (條件)?結果1:結果2

  如果條件成立,返回結果1;否則返回結果2。

  (a>b)?a:b; // 計算a和b的最大值

  三目運算符的功能更多使用if/else語句實現。

(條件表達式)? 表達式1 : 表達式2;

1)既然是運算符,一定會返回一個結果,並且結果的數據類型與表達式1,2的類型一致

2)表達式1與表達式2 的數據類型一致。

3)使用三元運算符的,一定可以轉換爲if-else。反之不一定成立。




  賦值運算符

   就是=, a=b; 把右邊的值賦給左邊的變量。

    a = (b+c); //對,把b+c的值 賦給了a

    (a+b) = c; //錯,不能把c的值賦給了a+b,a+b不是變量。

    10 = a; //錯,不能把a賦給10,10不是變量,常數

   賦值運算符可以和其它運算符結合,形成複合賦值運算符。

   a+=5  ->  a = a+5

   a-=5  ->  a = a-5

   a+=5 和 a=a+5的區別:

    += 是賦值運算;a=a+5是先加運算,後賦值運算。


=    +=   -=  *=    /=   %=

int i= 12;

i  = i * 5;

i *= 5;//與上一行代碼同樣的意思

【特別地】

short s = 10;

s = s + 5;//報編譯的異常

s = (short)(s + 5);

s += 5;//s = s + 5,但是結果不會改變s的數據類型。




  位運算符 - 按照二進制的位進行運算

   移位運算

    分爲左移(<<),右移(>>),無符號右移(>>>)

    左移後面補0,右移前面補符號位,無符號右移前面補0。

    如果移位超過32/64,會先取32/64的餘數後再移位。int是32,long是64。

     7>>2 = ?    //0000 0111 -> 0000 0001    1

     7<<2 = ?    //0000 0111 -> 0001 1100    28

     7 >>> 2 = ? //0000 0111 -> 0000 0001    1

     -7 >>> 2 = ?//... 1111 1001 -> 0011 ... 1110 非常大的一個數

               0011 1111 1111 1111 1111 1111 1111 1110

          【例子】1.如何交換m = 12和n = 5的值

四種方案:

             2.將60轉換爲十六進制輸出。



        位與/或/非運算

    位與(&)就是按二進制位進行與運算,與1作 位與 相當於保持原有的值不變;與0作 位與 相當於清0。 與0xFF做位與的效果就是 取二進制的後8位。

    位或(|):與1作 位或 相當於置1,與0作 位或 維持 原有的值不變。

    位非(~):就是按位取反


  關於運算符有誰先算誰後算的問題,叫運算符的優先級。優先級有固定的順序,但記住兩點即可:

   1 括號()的優先級極高,不確定就用括號括一下,肯定先算了。

   2 賦值=的優先級極低,所以肯定最後算。


 程序的執行次序包括三種


   順序結構/分支結構/循環結構。


   順序結構 就是代碼從上到下執行。最普通的代碼執行次序。

   分支結構 也叫選擇結構,就是代碼到了這個位置,按照條件選擇一個分支執行,也可以不選任何分支執行。

   循環結構 就是代碼到了這個位置,可以多次反覆執行。

   代碼先天就是順序結構,如果需要分支結構或者循環結構,使用特殊的代碼--流程控制語句。


   流程控制語句之分支語句 (選擇語句/條件語句/分支語句)

    Java中的分支語句: if/else語句、switch/case語句


   if/else的語法結構:


    if(條件1){   //如果  必須出現1次

      //滿足條件1時執行的語句塊

    }

    else if(條件2){ //或者  出現0-n次

      //滿足條件2時執行的語句塊

    }

    else{ //否則  出現0-1次

      //以上所有條件都不滿足時執行的語句塊

    }


    int a = 10;

    if(a>0){

      System.out.println("正數");

    }else if(a==0){

      System.out.println("零");

    }else{

      System.out.println("負數");

    }


  交換的算法:

  int a=3,b=2;

  int temp;

  temp=b;//a=3 b=2 temp=2

  b=a;//a=3 b=3 temp=2

  a=temp;//a=2 b=3


 使用分支/循環語句時,注意臨界點的判斷。 分支語句或者循環語句中如果只有一個語句,{}可以省略不寫。



  作業:

   1 ppt上的個稅和出租車車費兩個代碼。

   2 輸入年份和月份,輸出該月有多少天

    1 3 5 7 8 10 12月 有31天

    4 6 9 11月 有30天

    2月 平年28天,閏年29天

    如何判斷閏年:

    1 能被4整除並且不能被100整除的是閏年   或者

    2 能被400整除的是閏年




switch-case語句

if/else可以替換switch-case,但反之不行。

switch語句應用面極窄,只能判斷有限個整數/整數表達式/枚舉。浮點/字符串/類都不能判斷。

語法:

  switch(整數/整數表達式/枚舉){

    case 值1:

        語句塊;

        break;

    ...

    default:

        語句塊;

        break;

  }

 注:  1 case後面只能放值,不能是表達式。case分支可以寫多個

                Java1.7switch開始可以支持String類型的內容,即 switch("zhangsan")  可以使用

         2 每個分支後面要用break退出,否則語法不報錯,執行時邏輯出錯。

         3 default一般放在最後,但其實可以放在前面和中間。


 循環結構/循環語句 - 反覆執行相同的代碼塊


       java的循環語句有三種: for循環/while循環/do while循環


       for循環和while循環是完全互通的,do while循環有所不同,先循環後判斷。因此,for循環和while看條件執行,可能不執行;但do while循環至少執行一次。


       要求: 打印1-10的數字(循環語句搞定,執行相同的代碼塊)


  for循環的語法:

   for(循環變量的聲明和初始化;循環條件;循環變量值的變化){

     //反覆執行的代碼塊; 循環體

   }

   for(int i=1;i<11;i++){

     System.out.println(i);

   }

   執行次序: 1、int i=1 ; 2、i<11  3、println(i)  4、i++  5、i<11  6 ...

    i<11 不滿足後退出


  練習:

   1 累加求和

     累加:1+2+...+10000=?

   2 水仙花數問題

     要求打印出所有的三位數的水仙花數。

     所謂“水仙花數”即一個整數滿足其值等於各個數位的立方和。例如:

     153是一個水仙花數,因爲153=1的3次方+5的三次方+3的三次方


  QQ聊天,也是一個循環,但循環次數不確定。次數不確定的循環:

   for(;;){

     ...;

     if(條件) break; // break可以退出switch語句或循環語句

     ...;

   }


   for(;;){ ...; }叫死循環,也叫無限循環。無限循環在程序員編程時是有可能被使用的,比如: 服務器等待客戶端的連接就是無限循環。

   如果寫錯了,形成了死循環,按ctrl+C 可以退出。


  代碼放在循環裏還是循環外的標準:

   執行1次的放循環外,多次執行的放循環裏。


多重循環 - 最常見的是二重循環

打印圖形:

*

**

***

****

*****


for(int i=0;i<5;i++){

  for(int j=0;j<i+1;j++){ // 內層循環的循環條件比較的困難,可以套公式

    System.out.print("*");

  }

  System.out.println();

}

 內層循環條件的公式:

  j<m*i+n

  m就是每次循環的增量,如果遞減取負數。

  n就是第一次循環的次數。

 公式使用條件: i和j都要從零開始。   i和j都用++做循環變量的改變。


 作業:

   1 猜數字的遊戲,生成1-100的隨機數,然後循環猜,輸出猜大了,猜小了,猜對了,當猜對時退出。

   2 輸入一個1-20的數字作開始,打印出該數字到100所有與7無關的數字。與7無關就是: 不能是7的倍數並且不能有數字7(個位數和十位數都不能是7)   

   3 打印圖形如下:(行不變,列需要2個循環,分別打印空格和星星)

      *             0000*

     ***            000***

    *****           00*****

   *******          0*******

  *********         *********

   4 搬磚的問題。有36人,有36塊磚。男人每人一次能搬4塊,女人每人一次能搬3塊,小孩每2人搬一塊,正好一次搬完,每個人都搬了一次。求: 幾男幾女幾小孩

    3,3,30

   5 打印2-200的所有質數。(難,可以商量)

   質數就是隻能被1和它自身整除的數。 2 3 5 7 11 13 17 19 ....




打印2-200的所有質數。(難,可以商量)

  質數就是隻能被1和它自身整除的數。 //不能直接做判斷標準

  質數i不能被2到i-1 整除。 //判斷標準

  一旦能被2到i-1整除,i肯定不是質數


 while循環,與for循環基本一樣,除了格式:

 int i = 1;

 while(i<11){

   System.out.println(i);

   i++;

 }

 while(true){ } //無限循環


 do/while循環

  do循環和其它循環不一樣,主要兩點:

   1 do/while循環以分號;做結束,其它的循環以{ }做結束。

   2 do/while循環先執行再判斷條件,因此至少執行一次。

  語法:

  do{

    //循環體;

  }while(條件);

  int i = 1;

  do{

    System.out.println(i);

    i++;

  }while(i<11);

  和前面的for/while循環相比,少了第一次的判斷條件。


 do/while循環使用次數較少,不是重點,但還是要搞定。


  break和continue

   continue語句用在循環體中,用於結束本次循環而開始下一次循環。

   break語句則是結束所在的整個循環。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章