java基礎—三(運算符&選擇結構if)

        long: 8個字節

float:4個字節
A:它們底層的存儲結構不同。
B:float表示的數據範圍比long的範圍要大
long:2^63-1

float:3.4*10^38 > 2*10^38 > 2*8^38 = 2*2^3^38 = 2*2^114 > 2^63-1

float數據在內存中是怎樣存儲的:

float類型數字在計算機中用4個字節存儲。遵循IEEE-754格式標準:一個浮點數有2部分組成:底數m和指數e
底數部分 使用二進制數來表示此浮點數的實際值
指數部分 佔用8bit的二進制數,可表示數值範圍爲0-255

指數可正可負,所以,IEEE規定,此處算出的次方必須減去127纔是真正的指數。所以,float類型的指數可從-126到128

底數部分實際是佔用24bit的一個值,但是最高位始終爲1,所以,最高位省去不存儲,在存儲中佔23bit科學計數法。
格式:
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
S表示浮點數正負    
E指數加上127後的值得二進制數據
M底數
舉例:
17.625在內存中的存儲
首先要把17.625換算成二進制:10001.101
整數部分,除以2,直到商爲0,餘數反轉。
小數部分,乘以2,直到乘位0,進位順序取。
在將10001.101右移,直到小數點前只剩1位:1.0001101 * 2^4 因爲右移動了四位

這個時候,我們的底數和指數就出來了
底數:因爲小數點前必爲1,所以IEEE規定只記錄小數點後的就好。所以,此處的底數爲:0001101
指數:實際爲4,必須加上127(轉出的時候,減去127),所以爲131。也就是10000011
符號部分是整數,所以是0
綜上所述,17.625在內存中的存儲格式是:01000001 10001101 00000000 00000000

byte,short在定義的時候,他們接收的其實是一個int類型的值,這個是自己做了一個數據檢測的,如果不在他們的範圍內,就報錯。

Java語言中的字符char可以存儲一箇中文漢字嗎?爲什麼呢?
可以。因爲java語言中的字符佔用兩個字節。

Java語言採用的是Unicode編碼。

128:10000000

-128;10000000(這裏的1既是符號位,也是數值位)

運算符

1:運算

 對常量和變量進行操作的過程稱爲運算。

2:運算符

 對常量和變量進行操作的符號稱爲運算符

3:操作數

 參與運算的數據稱爲操作數

4:用運算符把常量或者變量連接起來符號java語法的式子就可以稱爲表達式。

  不同運算符連接的式子體現的是不同類型的表達式。


(1)算術運算符


A:+,-,*,/,%,++,--
B:+的用法
a:加法
b:正號
c:字符串連接符
C:/和%的區別
數據做除法操作的時候,/取得是商,%取得是餘數
D:++和--的用法
a:他們的作用是自增或者自減
b:使用
**單獨使用
放在操作數據的前面和後面效果一樣。a++或者++a效果一樣。
**參與操作使用
放在操作數的前面:先自增或者自減,再參與操作
int a = 10;
int b = ++a;
放在操作數的後面:先參與操作,再自增或者自減
int a = 10;
int b = a++;

賦值運算符

A:=,+=,-=,*=,/=,%=等

B:=叫做賦值運算符,也是最基本的賦值運算符
int x = 10; 把10賦值給int類型的變量x。
C:擴展的賦值運算符的特點
隱含了自動強制轉換。

面試題:
short s = 1;
s = s + 1;

short s = 1;
s += 1;

請問上面的代碼哪個有問題?

//short s=1;s=s+1;//有問題
//short s=1;s+=1;//沒有問題,擴展的賦值運算符其實隱含了一個強制類型轉換類型
//s+=1;不是等價於s=s+1;而是等價於s=(s的數據類型)(s+1)
//上面代碼有沒有問題

比較運算符


A:==,!=,>,>=,<,<=
B:無論運算符兩端簡單還是複雜最終結果是boolean類型。
C:千萬不要把==寫成了=

邏輯運算符


A:&,|,^,!,&&,||

B:邏輯運算符用於連接boolean類型的式子

表達式:就是用運算符把常量或者變量連接起來的符合java語法的式子。

C:結論
&邏輯與:有false則false
|邏輯與:有true則true
^邏輯異或:相同則false,不同則true。
!:非true則false,非false則true

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

位運算符



//因爲是位運算,所以先把數據轉換成二進制
/*
&位與運算:有0則0
|位或運算:有1則1
^爲異或運算:相同則0,不同則1
~按位取反運算符:0變1,1變0
00000000 00000000 00000000 00000011
  ~11111111 11111111 11111111 11111100(補碼)
 反碼:11111111 11111111 11111111 11111011
 原碼:10000000 00000000 00000000 00000100
*/

A:^的特殊用法
一個數據針對另一個數據位異或兩次,該數不變
B:面試題
a:請實現兩個變量的交換
**採用第三方變量(開發中常用的)
**用位異或運算符
左邊a,b,a

右邊a^b

**一句話搞定

b=(a+b)-(a=b);

b:請用最有效率的方式計算出2乘以8的結果

2<<3

2 的二進制:       00000000 00000000 00000000 00000010

移3位:(000)00000 00000000 00000000 00010000   //16

2<<3=2*2^3;

<<把<<左邊的數據*2的移動次冪

>>把>>左邊的數據/2的移動次冪

三元運算符
A:格式
比較表達式?表達式1:表達式2;
B:執行流程:
首先計算比較表達式的值,看是true還是false。
如果是true,表達式1就是結果。
如果是false,表達式2就是結果。
C:案例:
a:比較兩個數據是否相等
b:獲取兩個數據中的最大值
c:獲取三個數據中的最大值
/*
* 獲取兩個數中的最大值
* int x=100;
* int y=200;
* int max=(x>y?x:y);
* System.out.println("max:"+max);
* System.out.println("----------------------");
* 獲取三個數中的最大值
* int a=1;
* int b=2;
* int c=3;
  * 先比較怕a,b的最大值
* 拿最大值和w進行比較
* int temp=((a>b)?a:b);
* int max1=(temp>c?temp:c);
* System.out.println("max1:"+max1);
* System.out.println("----------------------");
*一步搞定方法
* int max2=(a>b)?((a>c)?a:c):((b>c)?b:c);
* System.out.println("----------------------");
*  比較兩個整數是否相同
*  boolean flag=(a==b)?true:false;
*/


鍵盤錄入
(1)實際開發中,數據是變化的,爲了提高程序的靈活性,我們加入鍵盤錄入數據。
A:導包
import java.util.Scanner;
位置:在class的上邊
B:創建對象
Scanner sc = new Scanner(System.in);
C:獲取數據
int x = sc.nextInt();


流程控制語句

(1)順序結構 從上往下,依次執行


(2)選擇結構(分支結構)按照不同的選擇,執行不同的代碼

(3)循環結構 做一些重複的代碼


if語句
(1)三種格式
A:格式1
if(比較表達式) {
語句體;
}

執行流程:
判斷比較表達式的值,看是true還是false
如果是true,就執行語句體
如果是false,就不執行語句體

B:格式2
(比較表達式) {
語句體1;
}else {
語句體2;
}

執行流程:
判斷比較表達式的值,看是true還是false
如果是true,就執行語句體1
如果是false,就執行語句體2

C:格式3
if(比較表達式1) {
語句體1;
}else if(比較表達式2){
語句體2;
}
...
else {
語句體n+1;
}

執行流程:
判斷比較表達式1的值,看是true還是false
如果是true,就執行語句體1
如果是false,就繼續判斷比較表達式2的值,看是true還是false
如果是true,就執行語句體2
如果是false,就繼續判斷比較表達式3的值,看是true還是false
...
如果都不滿足,就執行語句體n+1
(2)注意事項
A:比較表達式無論簡單還是複雜,結果是boolean類型
B:if語句控制的語句體如果是一條語句,是可以省略大括號的;如果是多條,不能省略。
建議:永遠不要省略。
C:一般來說,有左大括號,就沒有分號,有分號,就沒有左大括號。
D:else後面如果沒有if,是不會出現比較表達式的。
E:三種if語句其實都是一個語句,只要有一個執行,其他的就不再執行。
(3)案例:
A:比較兩個數是否相等
B:獲取兩個數中的最大值
C:獲取三個數中的最大值(if語句的嵌套)
D:根據成績輸出對應的等級
E:根據月份,輸出對應的季節
F:根據x計算對應y的值並輸出
(4)三元運算符和if語句第二種格式的關係
所有的三元運算符能夠實現的,if語句的第二種格式都能實現。反之不成立。

如果if語句第二種格式控制的語句體是輸出語句,就不可以。
因爲三元運算符是一個運算符,必須要有一個結果返回,不能是一個輸出語句。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章