2.運算符篇

1.

		int[] refToArray={10,11};
		int var=1;
		refToArray[var-1]=var=2;
		System.out.println(refToArray[0]+" "+refToArray[1]);
		/**
		 * 根據java語言規定,運算順序從右至左,賦值屬性從左至右。
		 * 故先計算數組下標的,所以refToArray[0]被賦值爲2。
		 * 所以,打印輸出2 11.
		 * */


2.在補碼中,1110代表的是幾?

(1)首位爲1,所以是負數,先寫一個負號,再確定後面的數字

(2)取反-------》0001

(3)加1---------》0010(對應的十進制是2)

所以第一步和第三步合起來就是:-2



3.-2在補碼中如何表示?

正數在補碼中就是該正數;負數的補碼是,不管負號,取反加1就是該負數的補碼。

(1)2的二進制表示是:0010

(2)取反加1:1110

所以-2的補碼是:1110


4.

		int x=1;
		int y=~x+1;
		System.out.println(x+" "+y);
		/**
		 * ~運算符和++、--運算符不一樣,它不會改變變量的值。所以x還是原值,經過運算後y的值爲-1.
		 * 所以輸出1 -1
		 * */

5.

(1)

System.out.println(3/0);//該句代碼會拋出 java.lang.ArithmeticException異常

(2)

System.out.println(3.0/0);//該句代碼不會拋出異常,輸出的是:Infinity

小結:當除法運算中右操作數爲0的時候,如果左操作數爲整數,會拋出異常;如果左操作數爲float或者double,會產生Infinity值。

    當除法運算中右操作數爲0.0(或者簡寫爲0.)的時候,不管左操作數是整型還是浮點型,都會產生Infinity值。

這是因爲如果有浮點型的值,會進行自動轉換。浮點型有無限值(Infinity)和NaN的概念,不會拋出異常;但是整數沒有這些概念。


(3)

System.out.println(3%0);//該句代碼會拋出 java.lang.ArithmeticException異常

(4)

System.out.println(3.0%0);//該句代碼不會拋出異常,輸出的是:NaN

小結:取餘運算歸根結底爲除法運算,當右邊操作數爲0時,如果操作數均爲整數,則會拋出 java.lang.ArithmeticException異常;

  如果左操作數爲浮點數,則結果爲一個NaN。




6.

		byte x=-64;
		byte y=-6;
		System.out.println(x/y+" "+x%y);
		/**
		 * x/y好確定,爲10;取模運算中,餘數的符號完全取決於左操作數,和左操作數的符號一致,故x%y值爲-4。
		 * 打印:10 -4
		 * */


7.

		double x=64.5;
		double y=6.0;
		System.out.println(x/y+" "+x%y);
		/**
		 * x/y好確定,爲10.75;
		 * 在取模運算中,不管有沒有浮點數,步驟是用左邊的操作數連續地去減右邊的操作數,直到結果小於右邊的操作數,此時的結果即爲餘數
		 * 故x%y值爲4.5。
		 * 打印:10.75 4.5
		 * */

8.

		double x=64.0;
		double y=0.0;
		System.out.println(x%y!=x%y);
		/**
		 * 本題考察的核心是NaN值。NaN是一個封裝在Float和Double類中的一個代表非正常整數值結果的常量。
		 * 儘管它可以被應用到邏輯運算中和任何值包括自身進行比較,除了不等於(!=)這個結果爲true,
		 * 其它的比如大於、小於或者等於,結果都爲false。
		 * 故輸出爲false。
		 * 小結:
		 * x%y!=x%y   輸出true
		 * x%y==x%y   輸出false
		 * x%y > x%y  輸出false
		 * x%y < x%y  輸出false
		 * */


9.

		System.out.println(Float.NaN==Float.NaN);
		System.out.println(Float.POSITIVE_INFINITY==Float.POSITIVE_INFINITY);
		/**
		 * INFINITY常量代表無限值,但其只是一個特殊的數值,而不是非數值(其行爲不同於NaN,NaN是非數值)。
		 * INFINITY和自身進行邏輯相等運算返回的是true
		 * 輸出爲false
		 * 		true
		 * */

10.移位運算符

(1)java提供了三種移位運算符:<<(帶符號左移)、  >>(帶符號右移)、  >>>(無符號右移)

(2)移位運算的操作數只能是整數,即char、byte、short、int、long5中類型。進行移位運算時,總是先將char、byte、short轉換爲int後再進行運算,實際上移位運算操作的對象只有整型或者長整型。

(3)<<(帶符號左移)不論正負,低位補0; >>(帶符號右移)整數高位補0,負數高位補1;>>>(無符號右移),高位總是補0。

(4)移位運算符右邊的操作數用於指定移動的位數,按規定其不應該超過左操作數的二進制表示位數。比如,對一個int型數進行移位,其右操作數應該小於32;對一個long型的數據進行移位,其右操作數應該小於64。

但實際上,如果右操作數大於了規定的位數,並不會報錯,而是取右操作數對於規定位數的模來進行移位操作。比如,對於一個int型的數據,左移或者右移32(或者32*n位)位,結果還是原來的數。即17>>32的結果仍然是17,而不是0。


11.

System.out.println(-31>>>5>>5>>>5>>5>>>5>>5);

算術運算從左到右一個一個算,按照運算規則,輸出爲3。


12.

System.out.println(32>>32);//輸出爲32,見第十題的分析。


13.比較運算符:

(1)java提供了6種比較運算符:>、>=、<、<=、==、!=

(2)這6種比較運算符適合所有的基本類型數值之間的比較,但布爾型值只能與布爾型值進行==和!=,運算

(3)字符型的值可以與除了布爾型的值之外的其它基本類型進行比較,因爲每個字符都有一個對應的標準字符碼。當字符型值進行比較運算時,實際比較的是該字符對應的一個整數字符碼。比如64.0f<'A' ,此表達式返回的是true,因爲字符'A'被強制轉換爲浮點型65.0f,所以值爲true

(4)關係運算符==和!=不僅可以用於基本類型之間的比較,還可以用於引用類型之間的比較,但比較的是引用類型指向對象的內存地址值


14.

(1)表達式       "String".replace('g', 'G')=="String".replace('g', 'G')     的值是多少?

在String類的代碼中,replace方法的執行流程是這樣的:

如果發生了替換,就返回一個新的字符串;如果沒有發生替換,就返回this,即原來的字符串。

所以上面的表達式返回false


(2)表達式 "String".replace('T', 'G')=="String" 的值是多少?

由於替換沒有發生,所以返回的是原來的字符串,因此表達式的值爲true


(3)同理,表達式   "String".replace('t', 't')=="String" 的值是true


15.對於String類的substring函數和trim函數等等一些字符串處理函數,和replace函數一樣,是同一個道理(道理就是,沒有變化,返回的就是原來的;變化了返回的就是一個新的對象),所以

(1)表達式 "String".substring(1)=="String" 值爲false

(2)表達式 "String".substring(0)=="String" 值爲true

(3)表達式 "String".substring(0,6)=="String" 值爲true

注意,在substring方法中,substring(int beginIndex, int endIndex),截取的包含頭,不包含尾。這樣的話有一個好處,就是尾減去頭就是字符串的長度了。


(4)表達式 "String".trim()=="String" 值爲true

(5)表達式 "String     ".trim()=="String" 值爲false



(6)表達式 "STRING".toUpperCase()=="STRING" 值爲true


(7)表達式 "STRING".toString()=="STRING" 值爲true
























































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