真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java自增自減運(yùn)算符的使用方法

這篇文章主要為大家分享Java自增自減運(yùn)算符的使用方法。文中還介紹了自增自減運(yùn)算符的基本運(yùn)算規(guī)則和運(yùn)算符的賦值方法,希望大家通過這篇文章能有所收獲。

創(chuàng)新互聯(lián)主營(yíng)柘榮網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),柘榮h5小程序開發(fā)搭建,柘榮網(wǎng)站營(yíng)銷推廣歡迎柘榮等地區(qū)企業(yè)咨詢

一、基本運(yùn)算規(guī)則介紹

自增(++)和自減(--)運(yùn)算符是對(duì)變量在原始值的基礎(chǔ)上進(jìn)行加1或減1的操作。它們都有前綴和后綴兩種形式。前綴形式的運(yùn)算規(guī)則可以概括為:”先自增(減),后引用”,而后綴形式的運(yùn)算規(guī)則可以概括為:”先引用,后自增(減)”。這里所說的”引用”,指的是使用變量的值。另外,我們還要強(qiáng)調(diào)一個(gè)細(xì)節(jié):無(wú)論是前綴形式還是后綴形式,自增自減運(yùn)算符的優(yōu)先級(jí)要高于賦值運(yùn)算符。大家要記清楚這個(gè)細(xì)節(jié),后文還會(huì)針對(duì)這個(gè)細(xì)節(jié)進(jìn)行論述。下面我們就分為幾種情況來(lái)研究++和--在不同場(chǎng)合下的運(yùn)算效果。

二、語(yǔ)句中僅有++或--

請(qǐng)看代碼:

Java自增自減運(yùn)算符的使用方法
我們可以看到,這段代碼中總共有3條語(yǔ)句,其中第2條語(yǔ)句中僅有一個(gè)后綴形式++操作,程序的輸出結(jié)果是3。那么我們?cè)賮?lái)看另外一段代碼:

Java自增自減運(yùn)算符的使用方法
這段代碼與之前的那段代碼基本一樣,只是第2條語(yǔ)句中,后綴形式的++操作被換成了前綴形式,程序的輸出結(jié)果還是3。這說明:當(dāng)一條語(yǔ)句中僅有++或--操作時(shí),前綴形式與后綴形式的運(yùn)算符沒有任何區(qū)別。請(qǐng)注意:這句話的前半句是一個(gè)很重要的前提,那就是” 一條語(yǔ)句中僅有++或--操作”,如果脫離了這個(gè)前提,后半句所說的結(jié)論并不成立。

三、++或--運(yùn)算結(jié)果賦值給其他變量

可能有些小伙伴沒看明白這個(gè)標(biāo)題是什么意思,我們來(lái)看一段代碼:

Java自增自減運(yùn)算符的使用方法
這段代碼的第2條語(yǔ)句對(duì)變量a進(jìn)行了自增操作,并且把這個(gè)操作結(jié)果賦值給另一個(gè)變量b。語(yǔ)句中的變量b就是標(biāo)題中所說的”其他變量”,是指沒有進(jìn)行自增自減操作的其他變量。為什么要強(qiáng)調(diào)”賦值給其他變量”這個(gè)前提呢?就是因?yàn)槿绻堰\(yùn)算結(jié)果賦值給變量a自身,又會(huì)產(chǎn)生不同的效果,我們后面再去講解賦值給自身的情況?,F(xiàn)在先來(lái)分析程序,重點(diǎn)看第2條語(yǔ)句:變量a所進(jìn)行的是前綴形式的自增操作,那么按照”先自增后引用”的運(yùn)算規(guī)則,a的值首先變成3,然后賦值b。因此,給變量b賦值的是3,那么輸出結(jié)果當(dāng)然就是3和3。
如果代碼變成下面的樣子:

Java自增自減運(yùn)算符的使用方法
這一次,代碼的第2行發(fā)生了變化,a的自增操作變成了后綴形式。此時(shí)的程序輸出結(jié)果是3和2。為什么會(huì)是這樣的運(yùn)行結(jié)果呢?網(wǎng)上有很多資料對(duì)此的解釋是:因?yàn)楸磉_(dá)式中出現(xiàn)的是后綴形式的自增操作,因此,運(yùn)算的規(guī)則就變成了”先引用后自增”。計(jì)算機(jī)會(huì)先使用a的值給b賦值,a的值是2,所以b被賦值為2,a在完成給b賦值的操作之后,才會(huì)完成自增變?yōu)?,所以程序的輸出結(jié)果為3和2。這種解釋看似非常合理,但其實(shí)是錯(cuò)誤的!

按照這種解釋,后綴形式的自增是在賦值之后才完成的,由此可以推出后綴形式的自增自減運(yùn)算的優(yōu)先級(jí)比賦值運(yùn)算的優(yōu)先級(jí)更低。而我們之前已經(jīng)特意強(qiáng)調(diào)過:無(wú)論是前綴形式還是后綴形式,自增自減運(yùn)算符的優(yōu)先級(jí)都比賦值運(yùn)算符要高。接下來(lái)問題來(lái)了:既然++和--的運(yùn)算優(yōu)先級(jí)高于賦值運(yùn)算符,那么為什么賦值之前a的值沒有自增為3呢?

其實(shí)這是個(gè)錯(cuò)覺!a在賦值給變量b之前,就已經(jīng)完成了自增!為了講解清楚真實(shí)情況,我們必須科普一個(gè)小常識(shí),那就是:當(dāng)程序中,如果變量參與了算術(shù)運(yùn)算、或者以變量的值進(jìn)行賦值,或者打印了某個(gè)變量的值,總之只要程序中用到這個(gè)變量的值,都會(huì)先把這個(gè)變量存入一個(gè)臨時(shí)的空間,專業(yè)上把這個(gè)臨時(shí)的空間稱之為”操作數(shù)?!?。我們之前所說的”先引用后自增”中所說的這個(gè)”引用”操作,其實(shí)就是指”把變量的值存入操作數(shù)?!边@個(gè)動(dòng)作。當(dāng)程序中需要用到變量的值,計(jì)算機(jī)是從”操作數(shù)?!敝腥〕鲋颠M(jìn)行運(yùn)算,并不是我們想象的直接從變量所在的內(nèi)存單元中取出數(shù)值。但是,如果語(yǔ)句中僅有++或--,并不會(huì)把變量的值存入操作數(shù)棧,而是直接對(duì)變量進(jìn)行自增或自減的操作,這也是為什么我們把語(yǔ)句中僅有++或--單獨(dú)作為一種情況講解的原因。

科普完這個(gè)小常識(shí)之后,我們來(lái)解釋剛才的代碼為什么會(huì)輸出3和2。代碼中出現(xiàn)用a的值給變量b賦值的語(yǔ)句,并且a的后面出現(xiàn)了++,說明要對(duì)a進(jìn)行后綴形式的自增操作。按照我們剛才科普的小常識(shí),a參與了賦值運(yùn)算,那么就會(huì)把a(bǔ)的值存入操作數(shù)棧。因?yàn)閍的自增是后綴形式的,所以要遵循”先引用后自增”的運(yùn)算規(guī)則,因此,計(jì)算機(jī)會(huì)首先取出a的值2存入操作數(shù)棧,然后再把a(bǔ)的值增加到3。做完自增操作之后,接下來(lái)會(huì)對(duì)變量b進(jìn)行賦值操作。那么,是用哪個(gè)值給變量b賦值呢?就是用剛才存到操作數(shù)棧中的那個(gè)2對(duì)變量b進(jìn)行賦值,所以b最終得到的值是2,因此輸出結(jié)果是3和2。
在這里,請(qǐng)大家注意一個(gè)細(xì)節(jié),那就是:代碼中的自增操作雖然是后綴形式的,但這個(gè)自增動(dòng)作卻是在賦值之前完成的,這也解釋了后綴形式的自增運(yùn)算優(yōu)先級(jí)高于賦值運(yùn)算,而網(wǎng)上很多資料中所說的”先完成賦值再去做自增操作”是完全錯(cuò)誤的。
那么,之前例題中第2條語(yǔ)句是”b=++a;”,會(huì)不會(huì)也把a(bǔ)的值存入操作數(shù)棧呢?答案是肯定的,只要是變量參了算術(shù)運(yùn)算、賦值、被打印這些操作,都會(huì)取出變量的值存入操作數(shù)棧。因?yàn)檎Z(yǔ)句中出現(xiàn)的是前綴形式的自增,所以在把值存入操作數(shù)棧之前就已經(jīng)完成了自增操作。

好,現(xiàn)在我們來(lái)加大一點(diǎn)難度,請(qǐng)看代碼:

Java自增自減運(yùn)算符的使用方法
這段代碼的第2條語(yǔ)句,出現(xiàn)了2次++a,那么運(yùn)算結(jié)果會(huì)是多少呢?”=”右邊的表達(dá)式為”++a + ++a”,按照運(yùn)算優(yōu)先級(jí),計(jì)算機(jī)首先對(duì)a進(jìn)行自增操作,經(jīng)過這一步操作之后,變量a的值變成了3,緊接著,計(jì)算機(jī)會(huì)把這個(gè)3存入操作數(shù)棧中,為了方便講述,我們把這個(gè)操作數(shù)棧叫做”棧1”,接下來(lái),表達(dá)式中又出現(xiàn)了++a,此時(shí)計(jì)算機(jī)再次對(duì)a進(jìn)行自增,a的值變成了4,為了完成加法操作,計(jì)算機(jī)又把這個(gè)4存入到另一個(gè)操作數(shù)棧中。我們把這個(gè)操作數(shù)棧稱為”棧2”。按照運(yùn)算優(yōu)先級(jí),接下來(lái)要做的事情就是完成加法運(yùn)算,計(jì)算機(jī)把”棧1”中的3和”棧2”中的4分別取出并且進(jìn)行相加,得到的結(jié)果是7,最后把這個(gè)7賦值給”=”左邊的變量b。所以上面代碼運(yùn)行所輸出的結(jié)果分別是4和7。

下面我們?cè)賮?lái)研究一個(gè)關(guān)于運(yùn)算順序問題,請(qǐng)看下面的代碼:

Java自增自減運(yùn)算符的使用方法
我們還是重點(diǎn)來(lái)分析第2行代碼?!?”右邊首先是++a,所以對(duì)先a進(jìn)行自增操作,此時(shí)a變成了3,緊接著把自增之后的值存入”棧1”,接下來(lái)遇到了a++,因?yàn)槭呛缶Y形式的自增操作,遵循”先引用后自增”的運(yùn)算規(guī)則,計(jì)算機(jī)先取出a的值3,并且存入”棧2”,然后對(duì)a進(jìn)行自增的操作,a的值變成了4?,F(xiàn)在,”棧1”和”棧2”中都已經(jīng)存入了值,那么,此時(shí)計(jì)算機(jī)是先把”棧1”和”棧2”中的值做個(gè)相加操作呢,還是先去做變量a的第3次自增操作呢?很多同學(xué)肯定都會(huì)認(rèn)為計(jì)算機(jī)肯定是先去完成a的第3次自增操作,理由是自增自減運(yùn)算優(yōu)先級(jí)高于加法運(yùn)算。其實(shí)不然,當(dāng)運(yùn)算進(jìn)行到這一步的時(shí)候,計(jì)算機(jī)會(huì)先把”棧1”和”棧2”中的兩個(gè)值相加,然后才去完成a的第3次自增操作。很多人都不理解為什么會(huì)這樣,難道不是++a的優(yōu)先級(jí)更高嗎?

這里需要澄清一個(gè)大家對(duì)”優(yōu)先級(jí)”概念的誤解。當(dāng)計(jì)算機(jī)有AB兩個(gè)操作可以做的時(shí)候,如果選擇先完成A得到的結(jié)果是X,而選擇先完成B得到結(jié)果是Y,此時(shí)計(jì)算機(jī)必須按照運(yùn)算的優(yōu)先級(jí)做出選擇。而如果先完成A和先完成B對(duì)運(yùn)算結(jié)果沒有影響,那么計(jì)算機(jī)就會(huì)先完成左邊(先出現(xiàn)的)的操作。此時(shí),如果把”棧1”和”棧2”中的值相加,并不會(huì)影響到最終的運(yùn)算結(jié)果,并且這個(gè)操作是先于”a的第3次自增”出現(xiàn)的,所以計(jì)算機(jī)會(huì)先把”棧1”和”棧2”中的值加起來(lái),然后才完成”a的第3次自增”。

很多小伙伴可能不理解,那么自增操作優(yōu)先級(jí)高于加法操作,是如何體現(xiàn)出來(lái)的呢?大家仔細(xì)看,在代碼的第2條語(yǔ)句中,a的自增出現(xiàn)了3次,加法運(yùn)算出現(xiàn)了2次?!盿的第2次自增”后于”第1次加法運(yùn)算”出現(xiàn),但卻先于”第1次加法運(yùn)算”執(zhí)行,同理,”a的第3次自增”后于”第2次加法運(yùn)算”出現(xiàn),卻先于”第2次加法運(yùn)算”執(zhí)行。這些都體現(xiàn)出自增運(yùn)算的優(yōu)先級(jí)是高于加法運(yùn)算的。

講清楚”優(yōu)先級(jí)”這個(gè)問題之后,我們?cè)倩氐嚼}本身。第1次加法運(yùn)算是3和3相加,結(jié)果是6,計(jì)算機(jī)會(huì)把這個(gè)6存入”棧3”。緊接著計(jì)算機(jī)看到表達(dá)式中第2次出現(xiàn)了++a,于是再次對(duì)a進(jìn)行自增操作,a的值變成了5,并且存入”棧4”。之后就是完成”棧3”和”棧4”中數(shù)值的相加操作,也就是把6和5相加,最終得到的結(jié)果是11。因此程序最終的輸出結(jié)果是5和11。

四、++或--運(yùn)算結(jié)果賦值給自身

標(biāo)題中所說的”自身”,就是指進(jìn)行了自增或自減運(yùn)算操作的變量。我們來(lái)看下面的代碼:

Java自增自減運(yùn)算符的使用方法
以上代碼的第2條語(yǔ)句,對(duì)a進(jìn)行了前綴形式的自增,然后又賦值給a自身,那么a的值是多少呢?因?yàn)閍進(jìn)行的是前綴形式的自增,所以運(yùn)算規(guī)則是”先自增后引用”,自增之后a的值變成了3,把3存入操作數(shù)棧,之后以3賦值給a,所以a的值還是3。

但是,如果我們把代碼變成如下形式:

Java自增自減運(yùn)算符的使用方法
這一次,我們把第2條語(yǔ)句中的++a改成了a++。這種情況下,程序輸出a的值為竟然為2,而不是3。說的直白一點(diǎn),a并沒有按我們的想象實(shí)現(xiàn)自增。這是為什么呢?我們來(lái)分析一下整個(gè)運(yùn)算的過程:計(jì)算機(jī)看到”=”右邊是后綴形式的自增,因此以”先引用后自增”的規(guī)則進(jìn)行運(yùn)算,先把a(bǔ)的值存入操作數(shù)棧,緊接著對(duì)a進(jìn)行自增操作,a的值變成了3,最后又用操作數(shù)棧中的那個(gè)2對(duì)a進(jìn)行賦值,a的值又變成了2。這樣給我們?cè)斐闪艘环N”a沒有進(jìn)行自增”的錯(cuò)覺。之前說過,網(wǎng)上很多資料都誤傳“后綴形式自增操作優(yōu)先級(jí)低于賦值運(yùn)算”。如果按照這種錯(cuò)誤說法,無(wú)法解釋以上代碼最終的輸出結(jié)果為2的原因。這也是為什么本文一開始就強(qiáng)調(diào)”無(wú)論是前綴形式還是后綴形式,自增自減運(yùn)算符的優(yōu)先級(jí)要高于賦值運(yùn)算符”的原因,就是因?yàn)檫@個(gè)細(xì)節(jié)是破解此類問題的關(guān)鍵點(diǎn)。類似的情況還可以衍生出很多版本,例如以下這段代碼::

Java自增自減運(yùn)算符的使用方法
這段代碼中,第2條語(yǔ)句對(duì)a進(jìn)行了兩次自增操作,最終輸出a的值是6。而如果按照”后綴形式的自增自減優(yōu)先級(jí)低于賦值運(yùn)算”的錯(cuò)誤說法,則會(huì)認(rèn)為最終輸出a的值是7,理由是”=”右邊的運(yùn)算結(jié)果是6,賦值給”=”左邊的a之后,又進(jìn)行一次自增,最終的結(jié)果是7,當(dāng)然,事實(shí)可以證明這種理解是錯(cuò)誤的。
接下來(lái),我們?cè)賮?lái)研究一種更特殊的情況,請(qǐng)看以下代碼:

Java自增自減運(yùn)算符的使用方法
這一次,語(yǔ)句中出現(xiàn)了復(fù)合賦值運(yùn)算符。如果程序運(yùn)行,輸出a的值會(huì)是多少呢?我們首先可以推導(dǎo)出”+=”右邊的運(yùn)算結(jié)果是7(具體推導(dǎo)過程不再贅述)。我們還知道,復(fù)合賦值運(yùn)算符在完成運(yùn)算的時(shí)候,要把右邊當(dāng)作整體。那么現(xiàn)在關(guān)鍵的問題就只剩一個(gè)了,那就是:”+=”左邊的a到底是多少?很多人認(rèn)為”+=”左邊a的值應(yīng)該是4,原因是++的運(yùn)算優(yōu)先級(jí)高于+=,所以要先完成2次自增,完成了2次自增以后,a的值已經(jīng)變成了4,由此推得”+=”左邊a的值應(yīng)該是4,而最終的運(yùn)算結(jié)果是11(4+7的和)。但實(shí)際運(yùn)行程序的話,可以看到輸出a的值為9而非11。這是為什么呢?就是因?yàn)?=的優(yōu)先級(jí)雖然低于++,但是計(jì)算機(jī)在實(shí)際完成+=運(yùn)算的時(shí)候會(huì)分為好幾個(gè)步驟進(jìn)行。我們可以大致把+=運(yùn)算分解為四大步驟:
A、把+=左邊的變量值存入操作數(shù)棧1
B、計(jì)算+=右邊的表達(dá)式,并把計(jì)算結(jié)果存入操作數(shù)棧2(此步驟其實(shí)是由多個(gè)具體步驟組成的)
C、把操作數(shù)棧1和操作數(shù)棧2中的數(shù)值相加得到運(yùn)算結(jié)果
D、把運(yùn)算結(jié)果存入變量a當(dāng)中

現(xiàn)在最關(guān)鍵的問題是步驟A和B哪一個(gè)先被執(zhí)行。如果先執(zhí)行步驟A,那么存入操作數(shù)棧1的是變量a自增之前的值,也就是2;反之,如果先執(zhí)行B,那么存入操作數(shù)棧1的是變量a自增之后的值,也就是4。真實(shí)的情況是先執(zhí)行步驟A,也就是把變量a自增之前的值存入操作數(shù)棧1。這是一個(gè)普遍適用的規(guī)律,所以大家一定要記?。寒?dāng)語(yǔ)句中以復(fù)合賦值運(yùn)算符給變量賦值的時(shí)候,計(jì)算機(jī)會(huì)先把復(fù)合賦值運(yùn)算符左邊變量的值存入操作數(shù)棧。因此,這段程序運(yùn)行的結(jié)果是9。

看完上述內(nèi)容,你們對(duì)自增自減運(yùn)算符的使用方法有進(jìn)一步的了解嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。


新聞名稱:Java自增自減運(yùn)算符的使用方法
當(dāng)前URL:http://weahome.cn/article/ipeipo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部