對於大多數的編程語言來說,運算符都是差不多的。運算符包括算術運算符,賦值運算符,比較運算符,邏輯運算符,位運算符,三元運算符等。
遞增運算符正是對“C++”這個名字的一種解釋,暗示着“超載 C 的一步”。在早期的一次 Java 演講中,Bill Joy (始創人之一)聲稱“Java=C++ --”(C 加加減減),意味着 Java 已去除了 C++一些沒來由折磨人的地方,形成一種更精簡的語言。
一、算術運算符:算術運算在我們小學階段就學習過,在java語言中的算術運算符同我們現實生活中的運算符多少有一點差別。比如在符號上面:+:仍舊錶示加法;
-:表示減法;
*:表示乘法;
/:表示除法;
%:表示取模,就是取餘數。比如5%2的結果就是1.1就是餘數。這個取模需要與除法做區別。在博客末尾,筆者將會奉上一道由取模,除法,以及if選擇組合的大題。
++、--;這兩個符號是編程語言中所特有的。前者表示自增,每次增加1個單位,後者表示自減,每次減少1個單位。在這裏需要注意的是a++,++a;這兩種表達式的含義不同。
int a=2;
int b=3;
System.out.println(a++/b);
System.out.println(++a/b);
上面的這段代碼結果將會是“0”、“1”。可能初學者會比較意外。a++/b;這個表達式的算法過程是這樣的,首先進行a/b;也就是2/3,其結果是0.6666……。由於是int型數據,因此是整數,也就會輸出0;如果此時,在第一條輸出語句之後,再輸出a。我們就會發現a的值已經由2變成了3.但是變成3是在a/b這一步做完之後才自增的。
a--;--a的原理同a++;++a的原理相同。在以後的學習中,像for循環語句中,我們經常會遇到這種方式表達。比如for(int x=0;x<10;x++){};這樣就能將循環控制在十次。我們還會在統計中見到這種情況。比如:
int count=0;
for(int x=0;x<10;x++){
if(x<5){
count++;
}
}
System.out.println(count);
上面這個表達式中,我們就能發現自增的好處。這道題是想要表達在0到9的數字當中,小於5的數字一共有幾個。這種統計思想在以後的學習中將會經常遇到。
二、賦值運算符:賦值運算符需要我們注意的是a=b;這個表達式,並不是說a等於b,而是指將b賦值給了a。賦值運算符的擴展運算符需要我們掌握的,比如+=;-=;*=;/=;%=等。關於賦值運算符比較經典的題如下:
1、實現變量a與變量b的值的交換。
int a=3;
int b=4;
實現a=4,b=3。
方法一:a=a^b; b=a^b; a=a^b;
方法二:int c=a; a=b; b=c;
方法三:a=a +b; b=a-b; a=a-b;
方法四:b=(a+b)-(a=b);</span>
2、下面兩者有什麼區別。
(1)short s=1;s=s+1;
(2)short s=1;
s+=1;
其實(1)中的代碼會出現編譯錯誤。因爲s+1是int類型,而s是short類型。所以不能直接將int類型賦值給short類型,這裏我們穿插帶一下強制轉換。但是(2)中的s+=1就不同了。s+=1隱含了強制轉換。就是s=(short)(s+1)。
3、強制轉換溢出的結果
Byte x=130;System.out.println(“x”);
由於計算機計算都是採用二進制補碼的方式進行,因此需要先計算出130的補碼。
130的二進制爲:1000 0010;
由於130爲正數,因此其原碼即是補碼。
又因爲130在程序中,默認是4個字節,因此其完整表示形式爲:
0000 0000 0000 0000 0000 0000 1000 0010;
因爲byte只有一個字節,因此截取後八位得:
1000 0010;
這個字節爲負數,同時又是補碼,爲了求其原碼以得到最終答案,因此需要對其減1。得:
1(符號位) 000 0001;
再取反得到原碼:
1(符號位)111 1110;
這個二進制數值就是—126.
Byte b1=(byte)128; //-128;
Byte b2=(byte)129; //-127;
Byte b3=(byte)130; //-126;
在運算中,當低類型數據與高類型數據進行計算時,系統會自動將表達式中的低類型數據提升到高類型。如:
byte b = 3 ; int c;
c= b + 2; //b會自動提升爲int類型進行運算。
三、比較運算符。當我們知道了=不是等於之後,就應該知道==這個才叫等於。比較運算符的結果只有兩種,即boolean類型的兩個值:true 、 false。就像我在上一篇博客中提到的if判斷句一樣。if後面的括號中的條件判斷同樣也是boolean類型。具體符號包括"=="、"!="、">"、"<"、">="、"<="。
四:位移運算符。比如“^”以及“<<”、“>>”、“>>>”等。其中^叫異或。
異或的規律是:一個數據對另一個數據位異或兩次,該數據不變。這就可以做數據加密了。System.out.println(~-a);輸出的結果爲a-1. ~表示按位非。按位非就是對一個數的補碼按位取反。
<<:表示向左位移。比如5<<1。這裏需要將5轉換爲二進制才能瞭解細節。5的二進制“101”。向左移動一位,就變爲“1010”,而這個結果是10.也就是5乘以2的1次方。
左移<<時。 System.out.println(4<<3);// 結果爲4*2^3=32;
System.out.println(-4<<3) ; // -4*2^3=-32;
右移>>時。System.out.println(5>>2);// 結果爲5/2^2=1;
System.out.println(-5>>2) ;// 負數結果是-2
System.out.println(-32>>3); -4
System.out.println(-33>>3);-5
System.out.println(-34>>3);-5
.......
System.out.println(-38>>3); -5
System.out.println(-39>>3); -5
System.out.println(-40>>3); -5
練習題
珠穆朗瑪峯高8848m,設一張紙的厚度0.01m,紙張摺疊幾次能夠達到此高度?
第一種方法:for(int x=1;x<32;x++){//由於1在int型,因此x最大可以左移32位 .
if((1<<x)>884900){
System.out.println(x);
break;
}
}
第二種方法:<span> </span>int start =1;
int end=884900;
int count=0;//定義一個變量,用來計算次數。
<span> </span>//由於不知道具體次數,因此我們選擇了while循環來處理。
while(start<end){
start*=2;
count++;
}
System.out.println(count);
五:邏輯運算符:
&:有false則false
|:有true則true
!:非true則false,非false則true
&&:結果和&是一樣的,只不過有短路效果。左邊是false,右邊不執行。
六:三元運算符:比較表達式?表達式1:表達式2;
所有的三元運算符能夠實現的,if語句的第二種格式都能實現。如果if語句第二種格式控制的語句體是輸出語句,三元運算符就不可以。因爲三元運算符是一個運算符,必須要有一個結果返回,不能是一個輸出語句。
下面這道題是對這兩天知識的一個綜合運用。
<pre name="code" class="java">import java.util.Scanner;
/**
*
* 從鍵盤接受一個數字,打印該數字表示的時間,最大單位到天,例如: 鍵盤輸入6,打印6秒; (分)60 (小時)3600 (天)86400
* 鍵盤輸入60,打印1分; 鍵盤輸入66,打印1分6秒; 鍵盤輸入666,打印11分6秒; 鍵盤輸入3601,打印1小時1秒//3761;1小時2分41秒
* 3660:1小時1分;
*
*/
public class Test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個int範圍內的正數:");
long num = sc.nextInt();
if (num < 60) {//一分鐘範圍內
System.out.println(num + "秒");
}
else if (num >= 60 && num < 3600) {//一個小時範圍內
if (num % 60 == 0) {
System.out.println(num / 60 + "分");
} else {
System.out.println(num / 60 + "分" + num % 60 + "秒");
}
}
else if (num >= 3600 && num < 86400) {//這以下的判斷都是在一天範圍內
if (num % 3600 == 0) {//時間正好爲整數小時
System.out.println(num / 3600 + "小時");
} else {//時間不是正好爲整數小時的情況
if (num % 60 == 0) {//時間正好爲整數小時整數分鐘的情況
System.out.println(num / 3600 + "小時" + num / 60 % 60 + "分");
} else {//時間不是正好爲整數小時整數分鐘的情況
if (num % 3600 < 60) {
System.out
.println(num / 3600 + "小時" + num % 3600 + "秒");
} else {
System.out.println(num / 3600 + "小時" + num / 60 % 60
+ "分" + num % 3600 % 60 + "秒");
}
}
}
}
else {//這以下的判斷都是在當num>=86400即超過或等於一天的情況下下進行
if (num % 86400 == 0) {//此處判斷時間正好是整數天
System.out.println(num / 86400 + "天");
}
else {//如果不是整數天的時間,並且大於一天的時間,就執行以下語句
if (num % 86400 < 3600) {//當時間在取得整數天之後,剩餘時間不夠一小時的情況執行以下語句:
if (num % 86400 < 60) {//當取得整數天後,求剩餘秒數
System.out.println(num / 86400 + "天" + num % 86400
+ "秒");
}
else if (num % 86400 % 60 == 0) {//當時間取得整數天後,剩餘的時間正好爲整數分的情況
System.out.println(num / 86400 + "天" + num % 86400 / 60
+ "分");
}
else {//當取得整數天後,剩餘時間不夠一小時的其他情況
System.out.println(num / 86400 + "天" + num % 86400 / 60
+ "分" + num % 86400 % 60 + "秒");
}
}
else {//當時間取得整數天之後,剩餘時間不小於一小時,執行以下語句
if (num % 86400 % 3600 == 0) {//時間取得整數天後,剩餘時間爲整數小時的情況
System.out.println(num / 86400 + "天" + num % 86400
/ 3600 + "小時");
} else if (num % 86400 % 3600 < 60) {//時間取得整數天後,整數小時後,不夠一分鐘的情況
System.out.println(num / 86400 + "天" + num % 86400
/ 3600 + "小時" + num % 86400 % 3600 + "秒");
} else if (num % 86400 % 60 == 0) {//時間取得整數天,整數小時後,剩餘時間正好爲整數分的情況
System.out.println(num / 86400 + "天" + num % 86400
/ 3600 + "小時" + num % 86400 % 3600 / 60 + "分");
} else {//其他情況
System.out.println(num / 86400 + "天" + num % 86400
/ 3600 + "小時" + num % 86400 % 3600 / 60 + "分"
+ num % 86400 % 3600 % 60 + "秒");
}
}
}
}
}
}
七:關鍵字
定義:被Java賦予了特殊含義的單詞。
特點:體現上都是英文小寫。
1、 用於定義數據類型的關鍵字
基本數據類型:
整數類型:byte short int long 浮點類型:float double
字符類型:char 布爾型:boolean
引用數據類型:
class(類) interface(接口)
void用於函數上表示無返回值類型
2、用於定義數據類型值的關鍵字
true(真) false(假) null(空)
3、 用於定義流程控制的關鍵字
判斷:if else switch case default
循環:for while do
繼續循環:continue 結束循環或選擇結構:break
返回:return
4、 用於定義訪問權限修飾符的關鍵字
private(私有的) protected(受保護的) public(公有的)
5、 用於定義類、函數,變量修飾符的關鍵字
abstract(抽象的) final(最終的) static(靜態的) synchronized(同步的) enum(枚舉)
6、用於定義類與類之間關係的關鍵字
extends(繼承) implements(實現)
7、 用於定義建立實例及引用實例,判斷實例的關鍵字
new(建立實例) this(當前引用) super(父類引用) instanceof(判斷對象類型)
8、 用於異常處理的關鍵字
try(檢查異常) catch(捕獲異常) finally(最終執行)
throw throws:兩多表示拋出異常,但使用位置不同
9、 用於包的關鍵字
package(創建包) import(導入包)
10、其他修飾關鍵字
native(本地)
strictfp(strict float point,精確浮點)
transient(變量修飾符,用它聲明一個實例變量,在對象序列化時不會被序列化)
volatile(類型修飾符,用來修飾被不同線程訪問和修改的變量)
assert(斷言,可以看作是異常處理的一種高級形式,用於捕捉我們在代碼中做出的假設)