前言
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)也不難。
賦值運(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ì)與之變化為取值范圍大的類型逐虚。
自增和自減
但你可能對(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。
查老師有話說(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)算符突那。
// 三目運(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)行解析湾趾。