運算符:運算符是一種特殊的符號,用以表示數據的運算、賦值和比較等。
算數運算符
加(+)、減法(-)、乘(*)、除(/)、 取餘(%)
整數相除,只能取整數部分,小數部分被捨棄。
整數運算時,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語句則是結束所在的整個循環。