java基礎--------java語法基礎之運算符、關鍵字等


對於大多數的編程語言來說,運算符都是差不多的。運算符包括算術運算符,賦值運算符,比較運算符,邏輯運算符,位運算符,三元運算符等。

遞增運算符正是對“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已經變成了3,並且是++a;也就是a先進行自增,然後再運算。這個時候的++a/b的效果就相當於(1+3)/3。其結果是1.3333……。由於是int型,因此結果就是1。而此時如果要輸出a的話,我們就會發現,a的值已經變爲4了。


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;


4、類型的自動提升:

        在運算中,當低類型數據與高類型數據進行計算時,系統會自動將表達式中的低類型數據提升到高類型。如:

         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


^:相同則false,不同則true。

!:非true則false,非false則true

&&:結果和&是一樣的,只不過有短路效果。左邊是false,右邊不執行。


||:結果和|是一樣的,只不過有短路效果。左邊是true,右邊不執行。


六:三元運算符:比較表達式?表達式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(斷言,可以看作是異常處理的一種高級形式,用於捕捉我們在代碼中做出的假設)



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