天天看點

java中的運算符的概念,以及常用的邏輯運算符

1、算數運算符

1.1 問題

1 什麼叫做運算符

2 什麼叫做表達式

3 算術運算符有哪些           

1.2 答案

1.2.1 運算符的概念

對常量或者變量進行操作的符号

1.2.2 表達式

用運算符把常量或者變量連接配接起來符合java文法的式子就可以稱為表達式。

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

舉例說明:

int a = 10;
int b = 20;
int c = a + b;           

+:是運算符,并且是算術運算符。

a + b:是表達式,由于+是算術運算符,是以這個表達式叫算術表達式。

1.2.3 算術運算符的分類

java中的運算符的概念,以及常用的邏輯運算符

注意:

  • /和%的差別:兩個資料做除法,/取結果的商,%取結果的餘數。
  • 整數操作隻能得到整數,要想得到小數,必須有浮點數參與運算。
public class Demo1Operator {
public static voidmain(String[] args) {
System.out.println(5 / 2); 
System.out.println(5 / 2.0);
System.out.println(5.0 / 2);
System.out.println(5.0 /2.0);

System.out.println("---------------------");

System.out.println(5 % 2); 
System.out.println(4 % 2); 
}
}           

2、字元的+操作

2.1 問題

1 字元的+操作運算過程

2 什麼是ASCII碼表

3 為什麼要有這樣的碼表           

2.2 答案

2.2.1 字元的+操作運算過程

當(byte short char int)在一起運算的時候,都會提升為int之後,再進行運算;char提升為int的過程,就是查找碼表中,字元所對應的數值表示形式

2.2.2 ASCII碼表

ASCII (American Standard Code for Information Interchange):美國資訊交換标準代碼,是計算機中位元組到字元的一套對應關系。通俗講就是每個字元都有一個對應的數字

常見的char類型資料代表的int值

'a'----97 'A'----65 '0'----48

舉例:
int a = 'A' + 1;
//1.根據'A'查找碼表找到對應的數值 65
//2.需要提升為int類型
//3.進行算數運算 得到結果66 int類型
//4.将結果指派給變量a

舉例: 大寫轉小寫
char c='A';
char c1=(char)(c+32);
           
java中的運算符的概念,以及常用的邏輯運算符

2.2.3 為什麼要有這樣的碼表

計算機中資料的存儲,都是以位元組的形式在進行存儲,我們不會直接操作繁瑣的、不便于記憶的位元組

2.3 補充

進制相關
在計算機内部所有的資料都使用二進制表示,每一個二進制位(bit)有0和1兩種
是以8個二進制位就可以組合出256種狀态,,這被稱為一個位元組(byte)
一個位元組一共可以用來表示256種不同的狀态。每一種狀态都有一個符号,就是256個符号。
從00000000到11111111

ASCII碼:上世紀60年代美國制定了一套字元編碼。對英語字元與二進制位之間的關系,做了統一的規定。這被稱為ASCII碼, ASCII碼一共規定了128個字元的編碼,比如空"space"是32 (二進制是00100000) 大寫字母A是65(二進制01000001).這128個符号。包括32個不能列印出來的控制符号。隻占用一個位元組後面的7位。
最前面的一位統一規定為0。
缺點:
1 不能表示所有字元
2 相同的編碼表示的字元不一樣,  假設120在法語編碼表中代表(你) 可能在希伯語編碼中代表另一個意思 是以各個國家都有了自己的字元集 比如中國的就是GBK GB2312  中國台灣的big5(繁體編碼)

亂碼: 世界上存在着多種編碼方式。從一個二進制數字可以被解釋成不同的符号,
是以想要打開一個文本檔案就必須知道它的編碼方式,否則用錯誤的編碼方式解讀就會出現亂碼.

Unicode:一種編碼将世界上所有的符号都納入其中。每一個符号都賦予一個獨一無二的編碼,
使用Unicode沒有亂碼的問題,是以也叫萬國碼

Unicode缺點:Unicode隻規定了符号的二進制代碼。卻沒有規定這個二進制代碼應該是如何存儲的 ,無法差別Unicode和ASCII:計算機無法區分三個位元組表示一個符号,還是分别表示三個符号。另外我們知道英文字母隻用一個位元組表示就夠了,如果Unicode統一規定,。每一個符号用三個或4個位元組表示.那麼每個英文字母前都必然有2~3個位元組是0,這是對存儲空間來說是極大的浪費。

Unicode方向是比較大的。真正落地的實作是下面這種方式
UTF-8:是在網際網路上使用最廣泛的一種Unicode的實作方式。
UTF-8是一種變長的編碼方式。它可以使用1~6個位元組來表示一個符号。根據不同的符号而變化位元組長度。

後邊的學習乃至工作開發中都是會用這個編碼方式           

3、字元串的+操作

3.1 問題

1  字元串是什麼資料類型

2  字元串的表現形式

3  字元串的+操作是什麼意思           

3.2 答案

3.2.1 字元串

字元串是引用資料類型;用一對雙引号包裹起來的

3.2.2 字元串的+操作

當“+”操作中出現字元串時,這個”+”是字元串連接配接符,而不是算術運算

public class Test {  
public static voidmain(String[] args) {
System.out.println(1 + 23);
System.out.println("年齡為:" +23);  
System.out.println(1 + 99 +"年黑馬");
}
}           

3.3 練習

char c='a';
int num=10;
String s="hello";
System.out.println(c+num+s);  
System.out.println(c+s+num);  
System.out.println(c+(num+s));  
System.out.println(s+num+c);  
System.out.println(s+(num+c));           

4、案例:數值拆分

4.1 拆分規則

個位 :數值 % 10

十位 :數值 / 10 % 10

百位 :數值 / 10 / 10 % 10

千位 :數值 / 10 / 10 / 10 % 10;

4.2 練習

鍵盤錄入一個四位數,擷取該數字各個位置上的資料值并列印

5、自增自減運算符

5.1 問題

1 自增自減的符号

2 參與操作,在前和在後的差別           

5.2 答案

5.2.1 符号

java中的運算符的概念,以及常用的邏輯運算符

++和-- 既可以放在變量的後邊,也可以放在變量的前邊。單獨使用的時候, ++和-- 無論是放在變量的前邊還是後邊,結果是一樣的。

5.2.2 參與操作

如果放在變量的後邊,先将該變量原本的值,取出來參與操作,随後再進行自增(++),自減(--)

如果放在變量的前邊,先對該變量做自增(++)或者自減(--),然後再拿變量參與操作

5.3 練習

需求:看程式,不提前運作,說結果
代碼1:
int a = 1;//這三個a是同一個,存儲空間是一樣的,其中一個改變其他的使用時候都變了
int b = a++ + a++;
分析:
int b = (1) + (2);//表達式
a值變化:1 -- 2 -- 3
a值?b值?

代碼2:
int a = 1;
int b = ++a + a++;
int b = (2) + (2);//表達式
a值變化:1 2 3
a值?b值?

代碼3:
int a = 1;
int b = ++a + ++a;
int b = (2) + (3);
a值變化:1 2 3
a值?b值?

注意點: 
short s1=10;
s1++;//自增1不會改變自身的變量的資料類型           

5.4 注意事項

使用自增/自減運算時應注意下面幾個問題。

自增/自減隻能作用于變量,不允許對常量、表達式或其他類型的變量進行操作。常見的錯誤是試圖将自增或自減運算符用于非簡單變量表達式中。

自增/自減運算可以用于整數類型byte、short、int、long,浮點類型 float、double,以及字元串類型char。

在 Java 1.5 以上版本中,自增/自減運算可以用于基本類型對應的包裝器類Byte、Short、Integer、Long、Float、Double 和 Character。注:就業班會講包裝類           

6、指派運算符

6.1 問題

1、指派運算符的作用

2、基本指派運算符有哪些?

3、擴充指派運算符有哪些           

6.2 答案

6.2.1 作用

指派運算符的作用是将一個表達式的值賦給左邊,左邊必須是可修改的,不能是常量。

6.2.2 基本指派運算符

符号:=

作用:指派

說明:将等号右邊的資料值指派給等号左邊的變量(a = 10; 将10指派給a變量)

6.2.3 擴充指派運算符

java中的運算符的概念,以及常用的邏輯運算符

注意事項:

擴充的指派運算符隐含了強制類型轉換。

short s = 10;
s = s + 10; // 此行代碼報出,因為運算中s提升為int類型,運算結果int指派給short可能損失精度
s += 10; // 此行代碼沒有問題,隐含了強制類型轉換,相當于 s = (short) (s + 10);           

7、關系運算符(比較運算符)

7.1 問題

1 關系運算符分類

2 關系運算符的結果是什麼

3 =和==的差別           

7.2 答案

7.2.1 分類

關系運算符有6種關系,分别為小于、小于等于、大于、等于、大于等于、不等于

java中的運算符的概念,以及常用的邏輯運算符

7.2.2 結果

關系運算符的結果都是boolean類型,要麼是true,要麼是false。

7.2.3 =和==的差別

千萬不要把“==”誤寫成“=”,"=="是判斷是否相等的關系,"="是指派。

=指派運算符
==比較運算符
比較基本資料類型,比較的是資料值本身
比較引用資料類型,比較的是位址值(後續學習)           

7.3 代碼示例

int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // false
System.out.println(a >= b); // false
System.out.println(a < b); // true
System.out.println(a <= b); // true

// 關系運算的結果肯定是boolean類型,是以也可以将運算結果指派給boolean類型的變量
boolean flag = a > b;
System.out.println(flag); // 輸出false           

8、邏輯運算符

8.1 問題

1、邏輯運算符的概念

2、邏輯運算符的分類

3、邏輯運算符的作用           

8.2 答案

8.2.1 概念

  • 了解層面:邏輯運算符,可以用來整合多個條件,為一段整體的邏輯
  • 代碼層面:連接配接布爾類型的表達式, 或者是值

8.2.2 分類

java中的運算符的概念,以及常用的邏輯運算符

8.2.3 作用

用于(整合)多個比較表達式的條件,最終得到的結果是boolean類型的true或false。

其實就是用來連接配接關系表達式的運算符(也可以直接連接配接布爾類型的常量或者變量)

9、短路邏輯運算符

9.1 問題

1、分類

2、作用           

9.2 答案

9.2.1 分類

java中的運算符的概念,以及常用的邏輯運算符

9.2.2 作用

在邏輯與運算中,隻要有一個表達式的值為false,那麼結果就可以判定為false了,沒有必要将所有表達式的值都計算出來,短路與操作就有這樣的效果,可以提高效率。同理在邏輯或運算中,一旦發現值為true,右邊的表達式将不再參與運算

計算規則:

  • 邏輯與&,無論左邊真假,右邊都要執行。
  • 短路與&&,如果左邊為真,右邊執行;如果左邊為假,右邊不執行。
  • 邏輯或|,無論左邊真假,右邊都要執行。
  • 短路或||,如果左邊為假,右邊執行;如果左邊為真,右邊不執行。

9.3 代碼示例

int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5)); // 兩個表達都會運算
System.out.println(x); // 4
System.out.println(y); // 5

System.out.println((x++ > 4) && (y++ > 5)); // 左邊已經可以确定結果為false,右邊不參與運算
System.out.println(x); // 4
System.out.println(y); // 4           

備注:開發中推薦使用短路運算符

10、三元運算符

10.1 問題

1、格式

2、執行流程           

10.2 答案

10.2.1 格式

關系表達式 ? 表達式1 : 表達式2;           

10.2.2 執行流程

問号前面的位置是判斷的條件,判斷結果為boolean型。

為true時調用表達式1,為false時調用表達式2。

其邏輯為:如果條件表達式成立或者滿足則執行表達式1,否則執行第二個。

10.3 示例代碼

int a = 10;
int b = 20;
int c = a > b ? a : b; // 判斷 a>b 是否為真,如果為真取a的值,如果為假,取b的值           

10.4 注意事項

1.表達式1和2要有明确的計算結果,不能寫輸出語句
int max = num1 > num2 ?System.out.println(num1) : System.out.println(num);
//大錯特錯

2.三元運算符的運算結果不能直接擺在那裡,要麼定義變量接收,要麼直接列印輸出
num1 > num2 ? num1 : num2; //錯誤的
int num = num1 > num2 ? num1: num2;
可以直接列印(單純展示資料)
System.out.println(num1 >num2 ? num1 : num2);

3.表達式1和2 結果要有一個統一的類型
double d = 10 > 5 ? 2 : 1.0; 提升,隐式轉換

???=10 > 5 ? "2" : 1.0; 

4.三元運算符可以嵌套使用:
int a=10,b=20;
String result=a>b?"a大":"b大";
如果a和b相等嵌套一下
String result=a>b?"a大":(a==b?"相等":"b大");           

11、案例:三個和尚

求三個數的最大值

import java.util.Scanner;

public class Test2Operator {
public static voidmain(String[] args) {
//1.使用Scanner鍵盤錄入三個整數
Scanner sc = newScanner(System.in);
System.out.println("請輸入三個整數:");
int num1 = sc.nextInt();
int num2 = sc.nextInt();
int num3 = sc.nextInt();
//2:用三元運算符擷取前兩個整數的最大值,并用臨時變量儲存起來。
int temp = num1 > num2 ? num1: num2;  
//3:用三元運算符,讓擷取臨時最大值和第三個數比較,得到結果。
int max = temp > num3 ? temp: num3; 
//4:輸出結果
System.out.println("最大值是:"+ max);
}
}           

思考:

如果我要求三個數的最小值呢?

隻要把裡面的大于号變成小于号就可以了

12、運算符的優先級

在Java中,運算符優先級如下圖所示:

java中的運算符的概念,以及常用的邏輯運算符

有沒有覺得很麻煩,很頭疼?是以,這些優先級我們不需要記憶。

隻要知道一點即可:小括号優先于所有!

在計算的時候必定是先計算小括号裡面的,再計算小括号外面的。

代碼示例:

int a = 10;
int b = 20;
System.out.println(a > b || a< b && a > b);//代碼閱讀性很差

-----------改寫如下--------------
int a = 10;
int b = 20;
System.out.println((a > b) ||(a < b && a > b));//代碼閱讀性很好