Java語(yǔ)法 | 常用的運(yùn)算符

前言

C: 計(jì)算機(jī)王污,計(jì)算機(jī),顧名思義就是用來(lái)進(jìn)行數(shù)據(jù)計(jì)算的鞋囊。那在計(jì)算機(jī)中運(yùn)行的程序們隅居,也是用于計(jì)算和處理數(shù)據(jù)的,每個(gè)編程語(yǔ)言都準(zhǔn)備了很多常用的運(yùn)算符來(lái)支撐我們的數(shù)據(jù)處理和計(jì)算葛虐。

而且我們有良好的數(shù)學(xué)打底的話胎源,它們一點(diǎn)也不難。

數(shù)學(xué)懵逼

賦值運(yùn)算符

首先要介紹的就是 = 號(hào)屿脐,上篇我們見過(guò)了涕蚤,在 Java 中它不再表示相等,而是表示賦值的意思的诵。前期每次遇到它你都要給自己刷刷被數(shù)學(xué)洗過(guò)的腦:"它不是相等判斷万栅,它是賦值符號(hào),即將等號(hào)右側(cè)的內(nèi)容賦值給左側(cè)的變量"西疤。

案例需求:學(xué)員王浩的Java成績(jī)是80分烦粒,學(xué)員張萌的Java成績(jī)與王浩的相同,輸出張萌的成績(jī)代赁。

public class Demo {
    public static void main(String[] args) {
        // 王浩成績(jī)
        int wScore = 80;
        // 張萌成績(jī)
        int zScore;
        // 賦值:把等號(hào)右邊的賦值給等號(hào)左邊的
        zScore = wScore;
        System.out.println("張萌的成績(jī)?yōu)椋? + zScore);
    }
}

查老師有話說(shuō): 幾乎所有編程語(yǔ)言中扰她,= 號(hào)都表示賦值,再或者又表示賦值又表示相等芭碍。

我們?cè)賮?lái)個(gè)案例感受下賦值符號(hào)徒役。

案例需求:將 num1 和 num2 實(shí)現(xiàn)值的交換。

思路: 下方的 num1 和 num2 的值要想交換一下窖壕,可以通過(guò)第3個(gè)變量作為中間媒介來(lái)進(jìn)行忧勿。

查老師有話說(shuō): 當(dāng)我們想讓一瓶雪碧和一瓶可樂(lè)里的液體進(jìn)行交換時(shí)杉女,我們沒辦法直接將它們交換,需要用到一個(gè)空瓶子來(lái)做個(gè)中轉(zhuǎn)鸳吸。

public class Demo {
    public static void main(String[] args) {
        int num1 = 8;
        int num2 = 9;
        // 此種轉(zhuǎn)換方式不可行  類似于雪碧和可樂(lè)直接對(duì)嘴換 
        // num1 = num2; num1結(jié)果為9
        // num2 = num1; num2結(jié)果為9
        
        // 定義一個(gè)中間變量來(lái)實(shí)現(xiàn)交換
        int temp;
        temp = num1; // temp為8
        num1 = num2; // num1為9
        num2 = temp; // num2為8
    }
}

算術(shù)運(yùn)算符

除了賦值符號(hào)外熏挎,我們最不陌生的應(yīng)該就是算術(shù)運(yùn)算符了:

  • + 加法運(yùn)算符
  • - 減法運(yùn)算符
  • * 乘法運(yùn)算符
  • / 除法運(yùn)算符
  • % 求模運(yùn)算符(求余數(shù))
  • ++ 自增運(yùn)算符
  • -- 自減運(yùn)算符

四則運(yùn)算

這些運(yùn)算符,前五個(gè)都挺簡(jiǎn)單层释,看看下面的示例:

int num1 = 11;
int num2 = 2;
System.out.println(num1 + num2); // 13
System.out.println(num1 - num2); // 9
System.out.println(num1 * num2); // 22
System.out.println(num1 / num2); // 5
System.out.println(num1 % num2); // 1

查老師有話說(shuō): 你肯定很好奇為什么 11 / 2 = 5 婆瓜? 而不是等于 5.5 ?其實(shí)這就要涉及到數(shù)據(jù)類型的問(wèn)題了贡羔,在 Java 中參與計(jì)算時(shí)廉白,兩個(gè)數(shù)參與計(jì)算會(huì)以其中取值范圍大的類型為最終計(jì)算結(jié)果的類型。

因?yàn)樯戏绞莾蓚€(gè) int 類型變量乖寒,所以計(jì)算后的結(jié)果也是 int 類型猴蹂。如果你執(zhí)意想要更精確的結(jié)果,那么可以將輸出語(yǔ)句這么改造: num1 * 1.0 / num2 楣嘁。這樣的話磅轻,其中一方已經(jīng)變?yōu)榱烁笕≈捣秶念愋停?jì)算結(jié)果的類型也會(huì)與之變化為取值范圍大的類型逐虚。

image-20210106234142710

自增和自減

但你可能對(duì)最后兩個(gè)算術(shù)符號(hào)產(chǎn)生疑惑聋溜,++-- 到底是用來(lái)干嘛的?

// ++ 和 --都分為前置形式和后置形式
int num1 = 10;

// 下方示例叭爱,以 ++ 符號(hào)為例撮躁,++ 和 -- 同理。
// 1.如果單獨(dú)寫成一條語(yǔ)句买雾,前置 ++ 和后置 ++ 都是表示自增1
// 等價(jià)于 num1 = num1 + 1;(num1 = 10 + 1) 將num1的值+1然后再賦值給num1把曼,這樣num1的結(jié)果為11
// num1 ++; 
// ++ num1;

// 2.但如果 ++ 被放在復(fù)雜情況使用時(shí),前置和后置是有區(qū)別的
// System.out.println(++ num1); // 11
System.out.println(num1 ++); // 10
System.out.println(num1); // 11

查老師有話說(shuō): 之所以出現(xiàn)此類結(jié)果漓穿,目前簡(jiǎn)單理解為前置++表示先自增然后再使用值嗤军,后置++表示先使用值再自增。

即:System.out.println(++ num1); 中晃危,先是將num1進(jìn)行了自增操作叙赚,變?yōu)榱?1,然后再進(jìn)行了輸出山害。

System.out.println(num1 ++); 中纠俭,先是使用num1進(jìn)行了輸出,結(jié)果是10浪慌,然后再對(duì)變量num1進(jìn)行了自增操作冤荆,所以下方再打印輸出num1,結(jié)果就成為了11权纤。

我們?cè)賮?lái)看下方的代碼钓简,試著去讀一讀它們的含義乌妒,分析下結(jié)果是否和你預(yù)期的一致。

int num1 = 5;
int num2 = 2;
int a = num1 % num2;
int b = num1 / num2;
System.out.println(num1 + "%" + num2 + "=" + a); // 5 % 2 = 1
System.out.println(num1 + "/" + num2 + "=" + b); // 5 / 2 = 2
num1 ++; 
num2 --;
System.out.println("num1 = " + num1); // num1 = 6
System.out.println("num2 = " + num2); // num2 = 1

查老師有話說(shuō): 學(xué)會(huì)閱讀代碼外邓,真的很重要撤蚊,你自己寫的也好還是別人寫的也罷,讀不懂它們损话,就無(wú)法理清楚它想干什么侦啸,不要怕!嘗試嘗試丧枪!

char類型的秘密

補(bǔ)充:++ 和 - - 與 char 類型相遇時(shí)的問(wèn)題:

// 如果字符執(zhí)行數(shù)值計(jì)算 那么它會(huì)自動(dòng)轉(zhuǎn)換為對(duì)應(yīng)碼表中數(shù)值然后執(zhí)行計(jì)算
char alp1 = 'a';
char alp2 = 'A';
System.out.println(alp1 + 1); // 98
System.out.println(alp2 + 1); // 67

char 類型是可以轉(zhuǎn)換為 int 整數(shù)類型的光涂,它的轉(zhuǎn)換規(guī)則是按照 ASCII 、DBCS 這些碼表來(lái)進(jìn)行的拧烦。例如:小寫的 a 是 97忘闻,大寫的 A 是 65。

ASCII

查老師有話說(shuō): ASCII ((American Standard Code for Information Interchange): 美國(guó)信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng)恋博,主要用于顯示現(xiàn)代英語(yǔ)和其他西歐語(yǔ)言齐佳。它是最通用的信息交換標(biāo)準(zhǔn),并等同于國(guó)際標(biāo)準(zhǔn)ISO/IEC 646债沮。ASCII第一次以規(guī)范標(biāo)準(zhǔn)的類型發(fā)表是在1967年炼吴,最后一次更新則是在1986年,到目前為止共定義了128個(gè)字符疫衩。[1]

為了解決中國(guó)缺厉、日本和韓國(guó)的象形文字符和ASCII的某種兼容性,出現(xiàn)了雙字節(jié)字符集(DBCS:double-byte character set)隧土。DBCS從 第256 代碼開始,就像ASCII一樣命爬,最初的128個(gè)代碼是ASCII曹傀。然而,較高的128個(gè)代碼中的某些總是跟隨著第二個(gè)字節(jié)饲宛。這兩個(gè)字節(jié)一起(稱作首字節(jié)和跟隨字節(jié))定義一個(gè)字符皆愉,通常是一個(gè)復(fù)雜的象形文字。[2]

// 如果執(zhí)行++或-- 則是先將char類型轉(zhuǎn)換為整數(shù)類型艇抠,然后計(jì)算完之后再將其轉(zhuǎn)換為char類型
char alp1 = 'a';
alp1 ++; // alp1 = alp1 + 1;
System.out.println(alp1); // b

復(fù)合賦值運(yùn)算符

在同時(shí)認(rèn)識(shí)了賦值幕庐、算術(shù)兩種運(yùn)算符之后,查老師再帶你認(rèn)識(shí) Java 中一種特別的運(yùn)算符:復(fù)合賦值運(yùn)算符家淤,即整合了賦值運(yùn)算符和算術(shù)運(yùn)算符的特別玩法异剥。

  • +=
  • -=
  • *=
  • /=
  • %=

雖然長(zhǎng)的奇特,但是它們理解起來(lái)真的很容易絮重,看看下方的示例:

int num1 = 10;
num1 -= 2; // 等價(jià)于 num1 = num1 - 2;
System.out.println(num1); // 結(jié)果為8

關(guān)系運(yùn)算符

Java 中還有可以用來(lái)判斷的關(guān)系運(yùn)算符冤寿,以后我們應(yīng)用還是很多的歹苦。

例如:當(dāng)用戶名長(zhǎng)度小于5時(shí),做一些錯(cuò)誤提示等督怜,這都是關(guān)系運(yùn)算符要應(yīng)用的場(chǎng)景殴瘦。

關(guān)系運(yùn)算符計(jì)算的結(jié)果是一個(gè)布爾類型(boolean)的值,要么是 true号杠,要么是 false蚪腋。

運(yùn)算符 含義 示例 結(jié)果
== 等于 5 == 6 false
!= 不等于 5 != 6 true
> 大于 5 > 6 false
< 小于 5 < 6 true
>= 大于等于 5 >= 6 false
<= 小于等于 5 <= 6 true
// 下方代碼用 () 括起來(lái)純粹為了讓 == 和 = 分開一些,更利于閱讀
boolean result = (5 == 2);
System.out.println(result); // false
// 在Java中 不相等用!=表示
boolean result1 = (5 != 2);
System.out.println(result1); // true

查老師有話說(shuō): 牢記的方法就是多在對(duì)應(yīng)代碼上寫注釋姨蟋,= 號(hào)表示賦值運(yùn)算符 == 表示相等關(guān)系屉凯。

邏輯運(yùn)算符

生活中,有很多情況下不是一個(gè)關(guān)系運(yùn)算符就可以做好判斷的芬探,例如:我想表示某個(gè)成績(jī)范圍 70 到 80神得,Java 中不可以用 70 < x < 80,這時(shí)候就需要用邏輯運(yùn)算符了偷仿。

所謂邏輯運(yùn)算符哩簿,就是我們生活中的 并且、或者 這些意思酝静。70 < x < 80 代表的就是 x 大于 70节榜,并且 x 小于 80,可以用邏輯運(yùn)算符寫為x > 70 && x < 80别智。

運(yùn)算符 含義 運(yùn)算規(guī)則
&& 短路 兩個(gè)操作數(shù)都是true宗苍,結(jié)果才是true
|| 短路 兩個(gè)操作數(shù)一個(gè)是true,結(jié)果就是true
! 操作數(shù)為true薄榛,結(jié)果為false讳窟;操作數(shù)為false,結(jié)果就為true
// 短路與:&&  理解為并且   兩個(gè)條件都為true敞恋,結(jié)果才能為true     true && true == true;
// 短路或:||  理解為或者   只要有一個(gè)條件為true丽啡,結(jié)果就為true   true || false == true;
// 非:!  理解為取反     !true == false;   !false == true;
boolean flag1 = (2 == 3); // false
boolean flag2 = (2 == 2); // true
boolean flag3 = flag1 && flag2;
boolean flag4 = flag1 || flag2;
System.out.println(flag3); // false
System.out.println(flag4); // true

神奇的短路功能

其實(shí)除了 && 還有單個(gè) & 也可以表達(dá)一樣的意思,|| 還有 | 也可以表達(dá)一樣的意思硬猫。

但是我們一般推薦使用 &&|| 补箍,原因就是它們擁有 短路 功能。

// ======非短路情況======
int num1 = 7;
// 無(wú)論第一個(gè)表達(dá)式是否成立啸蜜,都會(huì)執(zhí)行后面的表達(dá)式
boolean flag2 = false & (++ num1 != 8);
System.out.println(flag2); // false
// ++ num1執(zhí)行了坑雅,所以結(jié)果為8
System.out.println(num1); // 8
// ======短路情況======
int num1 = 7;
// 因?yàn)榈谝粋€(gè)表達(dá)式是false,它已經(jīng)可以決定flag2的值就是false衬横,所以&&后的表達(dá)式不會(huì)再執(zhí)行裹粤,構(gòu)成了短路
boolean flag2 = false && (++ num1 == 8); 
System.out.println(flag2); // false
// ++ num1沒有執(zhí)行,所以保留為原值
System.out.println(num1); // 7

查老師有話說(shuō): 毫無(wú)疑問(wèn)蜂林,短路符號(hào)可以更加節(jié)省程序的執(zhí)行效率蛹尝。

三目運(yùn)算符

在 Java 中還支持一種特殊的運(yùn)算符后豫,三目運(yùn)算符,它又被稱為三元運(yùn)算符突那。

day02_4_5
// 三目運(yùn)算符(三元運(yùn)算符)
// 條件 ? 表達(dá)式1 : 表達(dá)式2
// 如果條件為true挫酿,則執(zhí)行表達(dá)式1,否則執(zhí)行表達(dá)式2
int min = (5 < 7) ? 5 : 7;
System.out.println(min); // 5
int max = (10 < 7) ? 7 : 10;
System.out.println(max); // 10

查老師有話說(shuō): 后期用的還挺多的愕难,用好了它可以有效優(yōu)化一些代碼結(jié)構(gòu)早龟,簡(jiǎn)化代碼。

運(yùn)算符優(yōu)先級(jí)

至于運(yùn)算符號(hào)的優(yōu)先級(jí)猫缭,查老師則認(rèn)為無(wú)需記憶葱弟,只要記住:想讓誰(shuí)先運(yùn)行猜丹,就給其加小括號(hào)即可芝加。而且其實(shí)從我們多年的數(shù)學(xué)習(xí)慣來(lái)看,加小括號(hào)也有利于閱讀射窒。

  • 單目運(yùn)算符包括 ! 藏杖、++--脉顿,優(yōu)先級(jí)別高
  • 優(yōu)先級(jí)別最低的事賦值運(yùn)算符
  • 可以通過(guò) () 控制表達(dá)式的運(yùn)算順序蝌麸,() 優(yōu)先級(jí)最高
  • 從右向左結(jié)合性的只有賦值運(yùn)算符、三目運(yùn)算符和單目運(yùn)算符
  • 算術(shù)運(yùn)算符 > 關(guān)系運(yùn)算符 > 邏輯運(yùn)算符

查老師出題環(huán)節(jié)

計(jì)算BMI

需求:使用 Scanner 收集身高體重艾疟,并計(jì)算出相應(yīng)BMI值是多少来吩?

提示:BMI的計(jì)算公式是:體重(kg) / (身高 * 身高)
例如:小明的體重是 72 kg, 身高是1.69,那么小明的 BMI 就是:72 / (1.69 * 1.69)

BMI 判定

需求:亞洲人的肥胖標(biāo)準(zhǔn)應(yīng)該是 BMI 在18.5至24.9時(shí)為正常水平蔽莱,根據(jù)計(jì)算的 BMI弟疆,告知使用者身體是否標(biāo)準(zhǔn)。

標(biāo)準(zhǔn):您當(dāng)前的 BMI 符合正常水平盗冷!

不標(biāo)準(zhǔn):您當(dāng)前的 BMI 偏離正常水平兽间!

參考文獻(xiàn)

[1]莫紹強(qiáng)、陳善國(guó). 計(jì)算機(jī)應(yīng)用基礎(chǔ)教程:中國(guó)鐵道出版社正塌,2012年:12-13

[2]鐘小莉, 謝旻旻, 李永寧. 文字編碼與Unicode編碼研究[J]. 經(jīng)營(yíng)管理者, 2010(20):364-364.

后記

好了,常用的運(yùn)算符介紹也就到這兒結(jié)束了恤溶,本篇的作業(yè)請(qǐng)微信搜索關(guān)注: 查老師的講義 乓诽,然后回復(fù) 常用的運(yùn)算符作業(yè) 即可。

這些符號(hào)我們也算初步認(rèn)識(shí)過(guò)了咒程,你還 以嗎鸠天?你的數(shù)學(xué)基礎(chǔ)是否給予你了力量呢?計(jì)算機(jī)學(xué)習(xí)不僅要和英語(yǔ)打交道帐姻,數(shù)學(xué)更加重要稠集,不過(guò)還好目前查老師更新的都是小白文奶段,對(duì)數(shù)學(xué)基礎(chǔ)要求不是太多。

你們聽懂了嗎

查老師有話說(shuō): 對(duì)于技術(shù)的學(xué)習(xí)剥纷,查老師一貫遵循的步驟是:先用最最簡(jiǎn)單的 demo 讓它跑起來(lái)痹籍,然后學(xué)學(xué)它的最最常用 API 和 配置讓自己能用起來(lái),最后熟練使用的基礎(chǔ)上晦鞋,在空閑時(shí)嘗試閱讀它的源碼讓自己能夠洞徹它的運(yùn)行機(jī)制蹲缠,部分問(wèn)題出現(xiàn)的原因,同時(shí)借鑒這些技術(shù)實(shí)現(xiàn)來(lái)提升自己的代碼高度悠垛。

所以在查老師的文章中线定,前期基本都是小白文,僅僅穿插很少量的源碼研究确买。當(dāng)然等小白文更新多了斤讥,你們還依然喜歡,后期會(huì)不定時(shí)專門對(duì)部分技術(shù)的源碼進(jìn)行解析湾趾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芭商,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子撑帖,更是在濱河造成了極大的恐慌蓉坎,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胡嘿,死亡現(xiàn)場(chǎng)離奇詭異蛉艾,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)衷敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門勿侯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人缴罗,你說(shuō)我怎么就攤上這事助琐。” “怎么了面氓?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵兵钮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我舌界,道長(zhǎng)掘譬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任呻拌,我火速辦了婚禮葱轩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己靴拱,他們只是感情好垃喊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著袜炕,像睡著了一般本谜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妇蛀,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天耕突,我揣著相機(jī)與錄音,去河邊找鬼评架。 笑死眷茁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纵诞。 我是一名探鬼主播上祈,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浙芙!你這毒婦竟也來(lái)了登刺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嗡呼,失蹤者是張志新(化名)和其女友劉穎纸俭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體南窗,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揍很,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了万伤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窒悔。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖敌买,靈堂內(nèi)的尸體忽然破棺而出简珠,到底是詐尸還是另有隱情,我是刑警寧澤虹钮,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布聋庵,位于F島的核電站,受9級(jí)特大地震影響芙粱,放射性物質(zhì)發(fā)生泄漏祭玉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一宅倒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦拐迁、人聲如沸蹭劈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铺韧。三九已至,卻和暖如春缓淹,著一層夾襖步出監(jiān)牢的瞬間哈打,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工讯壶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留料仗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓伏蚊,卻偏偏與公主長(zhǎng)得像立轧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躏吊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容