【0基礎學Java第三課】-- 運算符

3. 運算符

  • 3.1 什么是運算符
  • 3.2 算術運算符
    • 3.2.1 **基本四則運算符:加減乘除模(+ - * / %)**
    • 3.2.2 增量運算符 += -= *= %=
    • 3.2.3 自增/自減運算符++ --
  • 3.3 關系運算符
  • 3.4邏輯運算符(重點)
    • 3.4.1 邏輯與 &&
    • 3.4.2 邏輯 ||
    • 3.4.3邏輯非 !
    • 3.4.4 短路求值
  • 3.5 位運算符
    • 3.5.1按位與 &
    • 3.5.2 按位或 |
    • 3.5.3 按位取反 ~
    • 3.5.4 按位異或 ^
  • 3.6 移位運算(了解)
    • 3.6.1 左移 <<
    • 3.6.2 右移 >>
    • 3.6.3 無符號右移 >>>
    • 3.7 條件運算符
  • 3.8 運算符的優先級

3.1 什么是運算符

計算機的最基本的用途之一就是執行數學運算,比如+,<,就是運算符,即:對操作數進行操作時的符號,不同運算符操作的含義不同。
作為一門計算機語言,Java也提供了一套豐富的運算符來操縱變量。Java中運算符可分為以下:

  • 算術運算符(+ - */)
  • 關系運算符(< > ==)
  • 邏輯運算符
  • 位運算符
  • 移位運算符以及條件運算符等。

3.2 算術運算符

3.2.1 基本四則運算符:加減乘除模(+ - * / %)

    public static void main1(String[] args) {
/*        int a = 20;int b = 10;System.out.println(a + b); // 30System.out.println(a - b); // 10System.out.println(a * b); // 200System.out.println(a / b); // 2System.out.println(a % b); // 0 --->模運算相當于數學中除法的余數//System.out.println(a/0); //做除法和取模時,右操作數不能為0*/int a = 3;int b = 2;// 在數學中應該是1.5 但是在Java中輸出結果為1 會向下取整,即小數點之后全部舍棄掉了System.out.println(a / b); // 1// 如果要得到數學中的結果,可以使用如下方式double d = a*1.0 / b; System.out.println(d);// 1.5//取決于操作數第一個數是否為正負//取決于操作數第一個數是否為正負System.out.println(7%3);//1System.out.println(7%-3);//1System.out.println(-7%3);//-1System.out.println(-7%3);//-1// +的左側是int,右側是double,在加之前int被提升為doubleSystem.out.println(1+0.2); //1.2System.out.println(11.5 % 2.0); //1.5}

注意

  • 都是二元運算符,使用時必須要有左右兩個操作數
  • int / int 結果還是int類型,而且會向下取整
  • 做除法和取模時,右操作數不能為0
  • % 不僅可以對整型取模,也可以對double類型取模,但是沒有意義,一般都是對整型取模的
  • 兩側操作數類型不一致時,向類型大的提升

3.2.2 增量運算符 += -= *= %=

該種類型運算符操作完成后,會將操縱的結果賦值給左操作數。

    public static void main2(String[] args) {int a= 1;a += 2;   // 相當于 a = a + 2System.out.println(a); //3long b = 10L;int i = 3;i += b;System.out.println(i);// 13//判斷不同類型+=是提升還是截斷byte b1 = 1;byte b2 = 127;b2 += b1;System.out.println(b2);//-128  截斷的}

注意:只有變量才能使用該運算符,常量不能使用。

3.2.3 自增/自減運算符++ –

++是給變量的值+1,–是給變量的值-1。

    public static void main3(String[] args) {int a = 1;a++; // 后置++ 表示給a的值加1,此時a的值為2System.out.println(a++); // 注意:后置++是先使用變量原來值,表示式結束時給變量+1,因此輸出2System.out.println(a); // 輸出3++a; // 前置++ 表示給a的值加1System.out.println(++a); // 注意:前置++是先給變量+1,然后使用變量中的值,因此輸出5System.out.println(a); // 輸出5// --操作符給操作-1,與++含義類似}

注意

  • 如果單獨使用,【前置++】和【后置++】沒有任何區別
  • 如果混合使用,【前置++】先+1,然后使用變量+1之后的值,【后置++】先使用變量原來的值,表達式結束時給變量+1
  • 只有變量才能使用自增/自減運算符,常量不能使用,因為常量不允許被修改

3.3 關系運算符

關系運算符主要有六個: == != < > <= >= ,其計算結果是 true 或者 false 。

    public static void main(String[] args) {//關系運算符int a = 10;int b = 20;// 注意:在Java中 = 表示賦值,要與數學中的含義區分// 在Java中 == 表示相等System.out.println(a == b); // falseSystem.out.println(a != b); // trueSystem.out.println(a < b); // trueSystem.out.println(a > b); // falseSystem.out.println(a <= b); // trueSystem.out.println(a >= b); // false}

注意:當需要多次判斷時,不能連著寫,比如:3 < a < 5,Java程序與數學中是有區別的

3.4邏輯運算符(重點)

邏輯運算符主要有三個: && || ! ,運算結果都是 boolean類型。

3.4.1 邏輯與 &&

語法規則:表達式1 && 表達式2,左右表達式必須是boolean類型的結果。
兩個表達式都為真,結果才是真,只要有一個是假,結果就是假。

    public static void main(String[] args) {int a = 1;int b = 2;System.out.println(a == 1 && b == 2); // 左為真 且 右為真 則結果為真System.out.println(a == 1 && b > 100); // 左為真 但 右為假 則結果為假System.out.println(a > 100 && b == 2); // 左為假 但 右為真 則結果為假System.out.println(a > 100 && b > 100); // 左為假 且 右為假 則結果為假}

3.4.2 邏輯 ||

語法規則:表達式1 || 表達式2,左右表達式必須是boolean類型的結果。
左右表達式至少一個為真,則為真。

    public static void main(String[] args) {int a = 1;int b = 2;System.out.println(a == 1 || b == 2); // 左為真 且 右為真 則結果為真System.out.println(a == 1 || b > 100); // 左為真 但 右為假 則結果也為真System.out.println(a > 100 || b == 2); // 左為假 但 右為真 則結果也為真System.out.println(a > 100 || b > 100); // 左為假 且 右為假 則結果為假}

3.4.3邏輯非 !

語法規則:! 表達式
真變假,假變真。

    public static void main(String[] args) {int a = 1;System.out.println(!(a == 1)); // a == 1 為true,取個非就是falseSystem.out.println(!(a != 1)); // a != 1 為false,取個非就是true}

3.4.4 短路求值

&& 和 || 遵守短路求值的規則.

    public static void main(String[] args) {System.out.println(10 > 20 && 10 / 0 == 0); // 打印 falseSystem.out.println(10 < 20 || 10 / 0 == 0); // 打印 trueSystem.out.println(10 > 20 & 10 / 0 == 0); // 程序拋出異常System.out.println(10 < 20 | 10 / 0 == 0); // 程序拋出異常}

注意

  • 對于 && , 如果左側表達式值為 false, 則表達式結果一定是 false, 無需計算右側表達式.
  • 對于 ||, 如果左側表達式值為 true, 則表達式結果一定是 true, 無需計算右側表達式.
  • & 和 | 如果表達式結果為 boolean 時, 也表示邏輯運算. 但與 && || 相比, 它們不支持短路求值.

3.5 位運算符

Java 中數據存儲的最小單位是字節,而數據操作的最小單位是比特位. 字節是最小的存儲單位,每個字節是由8個二進制比特位組成的,多個字節組合在一起可以表示各種不同的數據。
位運算符主要有四個: & | ~ ^除~ 是一元運算符外,其余都是二元運算符

位操作表示 ** 按二進制位運算**. 計算機中都是使用二進制來表示數據的(01構成的序列), 按位運算就是在按照二進制位的每一位依次進行計算。

3.5.1按位與 &

如果兩個二進制位都是 1, 則結果為 1, 否則結果為 0。

    public static void main(String[] args) {int a = 10;int b = 20;//a - 0000 1010//b - 0001 0100//& - 0000 0000 - 0System.out.println(a & b); // 0}
    a - 0000 1010b - 0001 0100& - 0000 0000 - 0

3.5.2 按位或 |

如果兩個二進制位都是 0, 則結果為 0, 否則結果為 1.

    public static void main(String[] args) {int a = 10;int b = 20;//a - 0000 1010//b - 0001 0100//| - 0001 1110 - 30System.out.println(a | b); //30}
    a - 0000 1010b - 0001 0100| - 0001 1110 - 30

注意當 & 和 | 的操作數為整數(int, short, long, byte) 的時候, 表示按位運算, 當操作數為 boolean 的時候, 表示邏輯運算

3.5.3 按位取反 ~

如果該位為 0 則轉為 1, 如果該位為 1 則轉為 0

    public static void main(String[] args) {int a = 0xf;System.out.printf("%x\n", ~a);//fffffff0}

注意

  • 0x 前綴的數字為 十六進制 數字. 十六進制可以看成是二進制的簡化表示方式. 一個十六進制數字對應 4個二進制位.
  • 0xf 表示 10 進制的 15, 也就是二進制的 1111
  • printf 能夠格式化輸出內容, %x 表示按照十六進制輸出.
  • \n 表示換行符

3.5.4 按位異或 ^

如果兩個數字的二進制位相同, 則結果為 0, 相異則結果為 1.

    public static void main(String[] args) {System.out.printf("%x\n", 6^6);// 0//6 - 0000 0110//6 - 0000 0110//^ - 0000 0000  //0System.out.printf("%x\n", 6^0);// 6//6 - 0000 0110//0 - 0000 0000//^ - 0000 0110 // 6}
    6 - 0000 01106 - 0000 0110^ - 0000 0000  - 06 - 0000 01100 - 0000 0000^ - 0000 0110 -  6

注意

  • n^n = 0 兩個數相同,異或的結果為0.
  • n^0 = n 一個數異或0,結果為它本身。
  • 1 ^ 3 ^ 6 ^ 3 ^ 1 = 6 ^ 0 = 6 運算符交換律

3.6 移位運算(了解)

移位運算符有三個: << >> >>> ,都是二元運算符,且都是按照二進制比特位來運算的。

3.6.1 左移 <<

最左側位不要了, 最右側補 0.
11左移1位,2位如下
在這里插入圖片描述

    public static void main(String[] args) {int a = 11;System.out.printf("%x\n", a << 1); // 22System.out.printf("%x\n", a << 2); // 44// 運行結果(注意, 是按十六進制打印的)}

注意:向左移位時,丟棄的是符號位,因此正數左移可能會編程負數。

3.6.2 右移 >>

最右側位不要了, 最左側補符號位(正數補0, 負數補1)
在這里插入圖片描述

    public static void main(String[] args) {int a = 11;System.out.printf("%x\n", a >> 1); // 5System.out.printf("%x\n", a >> 2); // 2// 運行結果(注意, 是按十六進制打印的)int b = 0xffff0000;System.out.printf("%x\n", b >> 1); //ffff8000// 運行結果(注意, 是按十六進制打印的)byte c = -1;System.out.println(c >> 1);  // 有符號右移-1}

3.6.3 無符號右移 >>>

最右側位不要了, 最左側補 0.

    public static void main(String[] args) {byte c = -1;System.out.println(c >> 1);  // 有符號右移-1System.out.println(c >>> 1); // 無符號右移2147483647}

注意

  1. 左移 1 位, 相當于原數字 * 2. 左移 N 位, 相當于原數字 * 2 的N次方.
  2. 右移 1 位, 相當于原數字 / 2. 右移 N 位, 相當于原數字 / 2 的N次方.
  3. 由于計算機計算移位效率高于計算乘除, 當某個代碼正好乘除 2 的N次方的時候可以用移位運算代替.
  4. 移動負數位或者移位位數過大都沒有意義.

3.7 條件運算符

條件運算符只有一個:
表達式1 ? 表達式2 : 表達式3
當 表達式1 的值為 true 時, 整個表達式的值為 表達式2 的值;
當 表達式1 的值為 false 時, 整個表達式的值為 表達式3 的值.
也是 Java 中唯一的一個 三目運算符, 是條件判斷語句的簡化寫法.

    public static void main(String[] args) {// 求兩個整數的最大值int a = 10;int b = 20;int max = a > b ? a : b; // 20//表達式不能單獨存在,其產生的結果必須要被使用。//a > b ? a : b;  報錯//表達式2和表達式3的結果要是同類型的,除非能發生類型隱式類型轉換int c = 10;int d = 20;//int e = c > d? 1 : 2.0;  報錯}

3.8 運算符的優先級

在一條表達式中,各個運算符可以混合起來進行運算,但是運算符的優先級不同,比如:* 和 / 的優先級要高于 +和 - ,有些情況下稍不注意,可能就會造成很大的麻煩。

    public static void main(String[] args) {// 求a和b的平均值int a = 10;int b = 20;int c = a + (b - a) >> 1;//+ 的優先級要高于 >> , 因此a先和b-a的結果做加法,整體為20,最后再進行右移System.out.println(c); //10}

注意:運算符之間是有優先級的. 具體的規則我們不必記憶. 在可能存在歧義的代碼中加上括號即可.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164923.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164923.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164923.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DBS note4:Buffer Management

目錄 1、介紹 2、緩沖池 3、處理頁面請求 4、LRU替換和時鐘策略 1&#xff09;順序掃描性能 - LRU 5、最近最常使用替換策略&#xff08;MRU Replacement&#xff09; 1&#xff09;Sequential Scanning Performance - MRU 6、練習題 1&#xff09;判斷真假 2&#xf…

華清遠見嵌入式學習——網絡編程——作業4

作業要求&#xff1a;①使用IO多路復用中的select函數實現TCP并發服務器客戶端 ②使用IO多路復用中的poll函數實現TCP并發服務器的服務器端 一、 代碼 #include <myhead.h>#define SERPORT 8888 //服務器端口號 #define SERIP "192.168.114.113"…

Samsung下origen中uboot的配置與編譯

uboot的特點&#xff1a; n代碼結構清晰 n 支持豐富的處理器與開發板&#xff0c;易于移植 n 支持豐富的用戶命令 n 支持豐富的網絡協議 n 支持豐富的文件系統 n 支持豐富的設備驅動 n 更新活躍、用戶較多、資料豐富 n 開放源代碼 n 較高的穩定性 n 不具有通用性&#xff08;不…

JavaScript編程基礎 – 布爾值(Booleans)

JavaScript編程基礎 – 布爾值(Booleans) Javascript Programming Essentials – Booleans 一個JavaScript布爾值包含兩個值中的一個&#xff0c;即 true 或者 false。 本文簡要介紹JavaScript布爾值的具體應用&#xff0c;以及可能作為對象的布爾值等。 1. 布爾值(Booleans)…

Go語言超全詳解(入門級)

文章目錄 1. Go語言的出現2. go版本的hello world3. 數據類型3.0 定義變量3.0.1 如果變量沒有初始化3.0.2 如果變量沒有指定類型3.0.3 :符號3.0.4 多變量聲明3.0.5 匿名變量3.0.6 變量作用域 3.1 基本類型3.2 指針3.2.1 指針聲明和初始化3.2.2 空指針 3.3 數組3.3.1 聲明數組3.…

java+mysql的校園兼職微信小程序(附源碼 調試 文檔)

校園兼職微信小程序 摘要一、引言二、國內外研究現狀三、系統設計四、系統實現與界面展示五、源碼獲取 摘要 本文詳述了一個基于Java和MySQL數據庫技術的校園兼職微信小程序的畢業設計。系統主要分為三種用戶角色&#xff1a;管理員、學生用戶和商家用戶。管理員擁有學生管理、…

jjwt使用說明-筆記

jjwt官網鏈接&#xff1a;https://github.com/jwtk/jjwt POM 依賴 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.12.3</version> </dependency> <dependency><grou…

華納云:linux中vsz和rss有哪些區別

在Linux中&#xff0c;VSZ(Virtual Set Size)和RSS(Resident Set Size)是兩個用于描述進程內存使用的指標&#xff0c;它們表示不同方面的內存情況。 1. VSZ&#xff08;Virtual Set Size&#xff09;: VSZ 表示進程的虛擬內存大小。 包括進程使用的所有內存&#xff0c;包括實…

Python中的函數

一、函數參數與返回值基礎知識 1、不要使用可變類型&#xff08;list等&#xff09;作為參數默認值&#xff0c;用None來代替。 參數默認值只會在函數定義階段被創建一次&#xff0c;之后無論創建多少次&#xff0c;函數內拿到的默認值都是同一個對象&#xff0c;為規避這個問…

Vue 2.0源碼分析-數據驅動

Vue.js 一個核心思想是數據驅動。所謂數據驅動&#xff0c;是指視圖是由數據驅動生成的&#xff0c;我們對視圖的修改&#xff0c;不會直接操作 DOM&#xff0c;而是通過修改數據。它相比我們傳統的前端開發&#xff0c;如使用 jQuery 等前端庫直接修改 DOM&#xff0c;大大簡化…

【python學習】基礎篇-常用模塊-collections模塊:數據結構,如列表、元組、字典和集合等

Python中的collections模塊提供了一些有用的數據結構&#xff0c;如列表、元組、字典和集合等。 以下是collections模塊中一些常用數據結構的用法&#xff1a; Counter類 Counter類是一個字典子類&#xff0c;用于計數可哈希對象。 它可以接受一個可迭代對象作為參數&#xff…

Atlassian Confluence 路徑遍歷和命令執行漏洞 (CVE-2019-3396)

漏洞描述 Confluence 是由澳大利亞軟件公司 Atlassian 開發的基于 Web 的企業 wiki。 Atlassian Confluence 6.14.2 版本之前存在一個未經授權的目錄遍歷漏洞&#xff0c;攻擊者可以使用 Velocity 模板注入讀取任意文件或執行任意命令。 漏洞環境及漏洞利用 啟動docker環境…

快來考試拿證書!KubeSphere 個人技能專業考試認證上線啦!

以容器技術和容器編排為基礎的云原生應用&#xff0c;被越來越多的企業用戶接受和使用&#xff0c;并且在生產環境中使用容器技術的比例逐年增加。Kubernetes 無疑已經成為容器編排的事實基礎&#xff0c;而依托于 Kubernetes 開發的開源容器平臺 KubeSphere 也收獲了一眾擁躉。…

vue3使用provider+ inject直接將參數由祖宗傳送給孫子

如題。在vue項目中&#xff0c;如果祖宗想將參數傳遞給孫子甚至更小一輩的組件&#xff0c;是一件麻煩事。可以通過爺爺-兒子-孫子-曾孫這樣的鏈條&#xff0c;一輩輩地傳承下去&#xff0c;但未免太繁瑣、太蠢了些&#xff1b;也可以通過store間接傳送&#xff0c;但如何觸發孫…

9-什么是迭代器,生成器,裝飾器、django的信號用過嗎?如何用,干過什么、什么是深拷貝,什么是淺拷貝,如何使用、slice操作符和list構造函數

1 什么是迭代器&#xff0c;生成器&#xff0c;裝飾器 2 django的信號用過嗎&#xff1f;如何用&#xff0c;干過什么 3 什么是深拷貝&#xff0c;什么是淺拷貝&#xff0c;如何使用 3.1 淺拷貝 3.2 深拷貝 3.3 擴展(slice操作符和list構造函數) 1 什么是迭代器&#xff0c;生成…

14 redis全量復制與部分復制

1、設置主服務器的地址和端口 首先是在從服務器設置需要同步的主服務器信息&#xff0c;包括機器IP, 端口。 主從復制的開啟&#xff0c;完全是在從節點發起的。不需要我們在主節點做任何事情。 從節點開啟主從復制&#xff0c;有3種方式 配置文件&#xff1a;在從服務器的配…

【神印王座】龍皓晨美妝勝過月夜,魔神皇識破無視,撮合月夜阿寶

Hello,小伙伴們&#xff0c;我是拾荒君。 《神印王座》國漫第82集已更新&#xff0c;拾荒君和大多數人一樣&#xff0c;更新就去看了。魔神皇楓秀&#xff0c;威嚴凜然&#xff0c;突然空降月魔宮&#xff0c;整個宮殿都在這股無與倫比的強大氣息中顫栗。為了順利躲避魔神皇的…

稻谷飄香金融助力——建行江門市分行助力鄉村振興

7月的臺山&#xff0c;稻谷飄香。在大耕戶李勝業的農田里&#xff0c;金燦燦的稻谷翻起層層稻浪&#xff0c;收割機在稻浪里來回穿梭&#xff0c;割稻、脫粒、裝車等工序一氣呵成。空氣中彌漫著豐收的喜悅。 夏糧迎豐收的背后&#xff0c;是中國建設銀行江門市分行&#xff08…

遠端WWW服務支持TRACE請求

安全掃描的時候&#xff0c;掃出來的問題&#xff0c;這里不分享如何處理&#xff0c;就只分享下&#xff0c;如何找到有問題的端口。 通過命令 curl -v -X TRACE -I ip:port&#xff0c;這里的ip和端口就是掃描出有問題的服務器地址ip以及開放的服務端口。 觀察返回值&#x…

Python基礎:生成器(Generators)和生成器表達式(Generator Expressions)詳解

生成器&#xff08;Generators&#xff09;和 生成器表達式&#xff08;Generator Expressions&#xff09;是 Python 中用于處理迭代器和序列數據的強大工具。它們允許你按需生成值&#xff0c;而不是一次性生成所有值&#xff0c;從而節省內存和提高性能。 1. 生成器&#x…