第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

變化的行為可能會(huì)降低精度

變化的行為可能會(huì)降低精度

瀟湘沐 2019-11-03 14:04:25
在Java中,當(dāng)您執(zhí)行int b = 0;b = b + 1.0;您可能會(huì)損失精度誤差。但是為什么要這么做int b = 0;b += 1.0;沒(méi)有任何錯(cuò)誤嗎?
查看完整描述

1 回答

?
白豬掌柜的

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊

那是因?yàn)閎 += 1.0;等價(jià)于b = (int) ((b) + (1.0));。的基本收縮轉(zhuǎn)換(JLS 5.1.3)隱藏在復(fù)合賦值操作。


JLS 15.26.2復(fù)合賦值運(yùn)算符(JLS第三版):

形式為E1 op = E2的復(fù)合賦值表達(dá)式等效于E1 =(T)(((E1)op(E2))),其中T是E1的類型,只是E1僅被評(píng)估一次。


例如,以下代碼是正確的:


short x = 3;

x += 4.6;

并導(dǎo)致x具有該值,7因?yàn)樗刃в冢?/p>


short x = 3;

x = (short)(x + 4.6);

這也解釋了為什么以下代碼會(huì)編譯:


byte b = 1;

int x = 5;

b += x; // compiles fine!

但這不是:


byte b = 1;

int x = 5;

b = b + x; // DOESN'T COMPILE!

在這種情況下,您需要顯式轉(zhuǎn)換:


byte b = 1;

int x = 5;

b = (byte) (b + x); // now it compiles fine!

值得注意的是,復(fù)合賦值中的隱式強(qiáng)制轉(zhuǎn)換是精彩書(shū)籍Java Puzzlers中的Puzzle 9:Tweedledum的主題。這是本書(shū)的摘錄(為簡(jiǎn)潔起見(jiàn),對(duì)其進(jìn)行了略作編輯):


許多程序員認(rèn)為這x += i;僅僅是的簡(jiǎn)寫x = x + i;。事實(shí)并非如此:如果結(jié)果的類型比變量的類型寬,則復(fù)合賦值運(yùn)算符將執(zhí)行無(wú)聲收窄基元轉(zhuǎn)換。


為了避免不愉快的意外,不要類型的變量使用復(fù)合賦值運(yùn)算符 byte,short或char。當(dāng)類型的變量使用復(fù)合賦值運(yùn)算符int,確保在右手側(cè)的表達(dá)式的類型不long,float或double。在類型變量上使用復(fù)合賦值運(yùn)算符時(shí)float,請(qǐng)確保右側(cè)的表達(dá)式不是type double。這些規(guī)則足以防止編譯器生成危險(xiǎn)的縮小強(qiáng)制類型轉(zhuǎn)換。


對(duì)于語(yǔ)言設(shè)計(jì)師來(lái)說(shuō),復(fù)合賦值運(yùn)算符生成不可見(jiàn)的強(qiáng)制轉(zhuǎn)換可能是一個(gè)錯(cuò)誤;變量類型比計(jì)算結(jié)果窄的復(fù)合賦值可能是非法的。


最后一段值得注意:C#在這方面要嚴(yán)格得多(請(qǐng)參見(jiàn)C#語(yǔ)言規(guī)范7.13.2復(fù)合賦值)。




查看完整回答
反對(duì) 回復(fù) 2019-11-04
  • 1 回答
  • 0 關(guān)注
  • 216 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)