内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

為什么Java的+=、-=、*=、/=復(fù)合賦值運算符不需要強制轉(zhuǎn)換?-創(chuàng)新互聯(lián)

問題描述:

直到今天,我認(rèn)為例如:

墊江ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
i += j;

只是一個捷徑:

i = i + j;

但是如果我們試試這個:

int i = 5;
long j = 8;

然后 i = i + j; 將無法編譯,但 i += j; 將正常編譯。

這是否意味著實際上 i += j; 是類似 i = (type of i) (i + j) 的快捷方式?

解決方案1:

huntsbot.com聚合了超過10+全球外包任務(wù)平臺的外包需求,尋找外包任務(wù)與機會變的簡單與高效。

與這些問題一樣,JLS 給出了答案。在這種情況下 §15.26.2 Compound Assignment Operators。提取物:

E1 op= E2 形式的復(fù)合賦值表達(dá)式等價于 E1 = (T)((E1) op (E2)),其中 T 是 E1 的類型,除了 E1 只計算一次。

引用自 §15.26.2 的示例

[…] 以下代碼是正確的:short x = 3; x += 4.6;并導(dǎo)致 x 的值為 7,因為它等價于:short x = 3; x = (短)(x + 4.6);

換句話說,你的假設(shè)是正確的。

所以 i+=j 在我檢查自己時編譯,但它會導(dǎo)致精度損失,對吧?如果是這樣,為什么它不允許它也發(fā)生在 i=i+j 中?為什么要在那里打擾我們?

@ronnieaka:我猜語言設(shè)計者認(rèn)為在一種情況下(i += j),與另一種情況下(i = i + j)相比,假設(shè)精度損失是需要的更安全

解決方案2:

與HuntsBot一起,探索全球自由職業(yè)機會–huntsbot.com

這種轉(zhuǎn)換的一個很好的例子是使用 *= 或 /=

byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57

或者

byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40

或者

char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'

或者

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'

@AkshatAgarwal ch 是一個字符。 65 * 1.5 = 97.5 ->明白了嗎?

是的,但我可以看到一些初學(xué)者來到這里,讀到這里,然后走開,以為你可以通過將任何字符乘以 1.5 將其從大寫轉(zhuǎn)換為小寫。

@DavidWallace 任何字符,只要它是 A ;)

@PeterLawrey & @DavidWallace 我會透露你的秘密- ch += 32 =D

解決方案3:

與HuntsBot一起,探索全球自由職業(yè)機會–huntsbot.com

非常好的問題。 Java Language specification 確認(rèn)您的建議。

例如下面的代碼是正確的:short x = 3; x += 4.6;并導(dǎo)致 x 的值為 7,因為它等價于:short x = 3; x = (短)(x + 4.6);

或者更有趣:“int x=33333333; x+=1.0f;”。

@supercat,這是什么詭計?不正確四舍五入的擴大轉(zhuǎn)換,然后是實際上不會改變結(jié)果的加法,再次轉(zhuǎn)換為 int 以產(chǎn)生對于正常人來說最出乎意料的結(jié)果。

@neXus:恕我直言,轉(zhuǎn)換規(guī)則應(yīng)該將 double->float 視為擴展,因為 float 類型的值識別實數(shù)的具體程度低于 double 類型的值。如果將 double 視為完整的郵政地址,將 float 視為 5 位郵政編碼,則可以滿足對給定完整地址的郵政編碼的請求,但無法準(zhǔn)確指定完整的郵政編碼請求只給出郵政編碼的地址。將街道地址轉(zhuǎn)換為郵政編碼是一項有損操作,但是...

...需要完整地址的人通常不會只要求郵政編碼。從 float->double 轉(zhuǎn)換相當(dāng)于將美國郵政編碼 90210 轉(zhuǎn)換為“US Post Office, Beverly Hills CA 90210”。

解決方案4:

HuntsBot周刊–不定時分享成功產(chǎn)品案例,學(xué)習(xí)他們?nèi)绾纬晒⒆约旱母睒I(yè)–huntsbot.com

是的,

基本上當(dāng)我們寫

i += l; 

編譯器將其轉(zhuǎn)換為

i = (int)(i + l);

我剛剛檢查了 .class 文件代碼。

真的很高興知道

你能告訴我這是哪個類文件嗎?

@hexafraction:類文件是什么意思?如果您詢問我在帖子中提到的類文件,而不是您的 java 類的編譯版本

哦,你提到了“類”文件代碼,這讓我相信涉及到一個特定的類文件。我現(xiàn)在明白你的意思了。

@Bogdan 正確使用字體應(yīng)該不是問題。選擇錯誤字體進(jìn)行編程的程序員應(yīng)該清楚地考慮如何進(jìn)行......

@glglgl 我不同意在這些情況下應(yīng)該依靠字體來區(qū)分......但是每個人都可以自由選擇認(rèn)為最好的東西。

解決方案5:

huntsbot.com精選全球7大洲遠(yuǎn)程工作機會,涵蓋各領(lǐng)域,幫助想要遠(yuǎn)程工作的數(shù)字游民們能更精準(zhǔn)、更高效的找到對方。

如果是 i = i + l,您需要從 long 轉(zhuǎn)換為 int explicitly,然后它將編譯并給出正確的輸出。喜歡

i = i + (int)l;

或者

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

但在 += 的情況下,它工作得很好,因為運算符隱式地將類型轉(zhuǎn)換從右變量的類型轉(zhuǎn)換為左變量的類型,因此不需要顯式轉(zhuǎn)換。

在這種情況下,“隱式轉(zhuǎn)換”可能是有損的。實際上,正如@LukasEder 在他的回答中所說,對 int 的強制轉(zhuǎn)換是在 + 之后 執(zhí)行的。如果確實將 long 轉(zhuǎn)換為 int,編譯器會(應(yīng)該?)拋出警告。

解決方案6:

HuntsBot周刊–不定時分享成功產(chǎn)品案例,學(xué)習(xí)他們?nèi)绾纬晒⒆约旱母睒I(yè)–huntsbot.com

這里的問題涉及類型轉(zhuǎn)換。

當(dāng)你添加 int 和 long 時,

int 對象被轉(zhuǎn)換為 long 并且兩者都被添加并且你得到 long 對象。但長對象不能隱式轉(zhuǎn)換為 int。所以,你必須明確地這樣做。

但是 += 的編碼方式使其可以進(jìn)行類型轉(zhuǎn)換。 i=(int)(i+m)

解決方案7:

一個優(yōu)秀的自由職業(yè)者,應(yīng)該有對需求敏感和精準(zhǔn)需求捕獲的能力,而huntsbot.com提供了這個機會

在 Java 中,當(dāng)賦值操作右側(cè)的表達(dá)式類型可以安全地提升為賦值左側(cè)變量的類型時,會自動執(zhí)行類型轉(zhuǎn)換。因此我們可以安全地分配:

byte ->short ->int ->long ->float ->double.

反過來也行不通。例如,我們不能自動將 long 轉(zhuǎn)換為 int,因為第一個比第二個需要更多的存儲空間,因此可能會丟失信息。要強制進(jìn)行此類轉(zhuǎn)換,我們必須執(zhí)行顯式轉(zhuǎn)換。 Type - Conversion

嘿,但是 long 比 float 大 2 倍。

float 不能保存所有可能的 int 值,double 不能保存所有可能的 long 值。

“安全轉(zhuǎn)換”是什么意思?從答案的后半部分,我可以推斷出您的意思是自動轉(zhuǎn)換(隱式轉(zhuǎn)換),這在 float ->long 的情況下當(dāng)然不是真的。浮動 pi = 3.14f;長 b = pi;將導(dǎo)致編譯器錯誤。

您最好將浮點原始類型與整數(shù)原始類型區(qū)分開來。他們不是一回事。

Java 有簡單的轉(zhuǎn)換規(guī)則,要求在許多模式中使用強制類型轉(zhuǎn)換,如果沒有強制類型轉(zhuǎn)換的行為會符合預(yù)期,但在許多通常是錯誤的模式中不需要強制類型轉(zhuǎn)換。例如,編譯器將毫無怨言地接受 double d=33333333+1.0f;,即使結(jié)果 33333332.0 可能不是預(yù)期的結(jié)果(順便提一下,33333334.0f 的算術(shù)正確答案可以表示為 float 或 int)。

解決方案8:

huntsbot.com全球7大洲遠(yuǎn)程工作機會,探索不一樣的工作方式

有時,這樣的問題可以在面試中被問到。

例如,當(dāng)你寫:

int a = 2;
long b = 3;
a = a + b;

沒有自動類型轉(zhuǎn)換。在 C++ 中編譯上述代碼不會有任何錯誤,但在 Java 中您會得到類似 Incompatible type exception 的內(nèi)容。

因此,為避免這種情況,您必須像這樣編寫代碼:

int a = 2;
long b = 3;
a += b;// No compilation error or any exception due to the auto typecasting

感謝您對 C++ 中的 op 使用與 Java 中的使用進(jìn)行比較的見解。我總是喜歡看到這些瑣事,而且我確實認(rèn)為它們對可能經(jīng)常被忽略的對話做出了貢獻(xiàn)。

但是這個問題本身很有趣,在采訪中問這個是愚蠢的。這并不能證明這個人可以編寫出高質(zhì)量的代碼——它只是證明他有足夠的耐心準(zhǔn)備 Oracle 證書考試。并且通過使用危險的自動轉(zhuǎn)換來“避免”不兼容的類型,從而隱藏可能的溢出錯誤,甚至可能證明該人無法產(chǎn)生可能的高質(zhì)量代碼。該死的Java作者所有這些自動轉(zhuǎn)換和自動裝箱等等!

解決方案9:

huntsbot.com – 高效賺錢,自由工作

主要區(qū)別在于,使用 a = a + b,沒有進(jìn)行類型轉(zhuǎn)換,因此編譯器會因為你沒有進(jìn)行類型轉(zhuǎn)換而生氣。但是對于 a += b,它真正做的是將 b 類型轉(zhuǎn)換為與 a 兼容的類型。所以如果你這樣做

int a=5;
long b=10;
a+=b;
System.out.println(a);

你真正在做的是:

int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);

復(fù)合賦值運算符執(zhí)行二元運算結(jié)果的縮小轉(zhuǎn)換,而不是右手操作數(shù)。因此,在您的示例中,“a += b”不等于“a = a + (int) b”,但正如此處其他答案所解釋的那樣,“a = (int)(a + b)”。

解決方案10:

huntsbot.com全球7大洲遠(yuǎn)程工作機會,探索不一樣的工作方式

微妙的點在這里…

當(dāng) j 是 double 且 i 是 int 時,i+j 存在隱式類型轉(zhuǎn)換。 Java ALWAYS 在整數(shù)之間存在運算時會將整數(shù)轉(zhuǎn)換為雙精度數(shù)。

為了澄清 i+=j,其中 i 是整數(shù),j 是雙精度可以描述為

i = (i + j)

請參閱:this description of implicit casting

為了清楚起見,在這種情況下,您可能需要將 j 類型轉(zhuǎn)換為 (int)。

我認(rèn)為一個更有趣的案例可能是int someInt = 16777217; float someFloat = 0.0f; someInt += someFloat;。向 someInt 添加零不應(yīng)影響其值,但將 someInt 提升為 float 可能會更改其值。

解決方案11:

與HuntsBot一起,探索全球自由職業(yè)機會–huntsbot.com

Java 語言規(guī)范 defines E1 op= E2 to be equivalent to E1 = (T) ((E1) op (E2)) where T is a type of E1 and E1 is evaluated once。

這是一個技術(shù)性的答案,但您可能想知道為什么會這樣。好吧,讓我們考慮以下程序。

public class PlusEquals {public static void main(String[] args) {byte a = 1;
        byte b = 2;
        a = a + b;
        System.out.println(a);
    }
}

這個程序打印什么?

你猜對了3?太糟糕了,這個程序不會編譯。為什么?好吧,在 Java is defined to return an int 中添加字節(jié)也是如此。我相信這是因為 Java 虛擬機沒有定義字節(jié)操作來保存字節(jié)碼(畢竟這些字節(jié)碼的數(shù)量有限),而是使用整數(shù)操作是一種語言中公開的實現(xiàn)細(xì)節(jié)。

但是,如果 a = a + b 不起作用,這意味著如果將 E1 += E2 定義為 E1 = E1 + E2,則 a += b 將永遠(yuǎn)無法用于字節(jié)。正如前面的例子所示,情況確實如此。作為使 += 運算符適用于字節(jié)和短褲的一種技巧,其中涉及到隱式轉(zhuǎn)換。這并不是什么大問題,但在 Java 1.0 工作期間,重點是從一開始就發(fā)布該語言?,F(xiàn)在,由于向后兼容,Java 1.0 中引入的這個 hack 無法刪除。

原文鏈接:https://www.huntsbot.com/qa/6LDa/why-dont-javas-compound-assignment-operators-require-casting?lang=zh_CN

一個優(yōu)秀的自由職業(yè)者,應(yīng)該有對需求敏感和精準(zhǔn)需求捕獲的能力,而huntsbot.com提供了這個機會

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站欄目:為什么Java的+=、-=、*=、/=復(fù)合賦值運算符不需要強制轉(zhuǎn)換?-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://m.rwnh.cn/article42/ddodec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、虛擬主機服務(wù)器托管、Google、ChatGPT、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
海伦市| 广安市| 青河县| 乌鲁木齐县| 涞源县| 崇文区| 安仁县| 江油市| 盐池县| 长治县| 仁怀市| 安康市| 乌什县| 霞浦县| 扎兰屯市| 福州市| 邵武市| 寿光市| 怀化市| 遂宁市| 苍溪县| 章丘市| 叙永县| 新源县| 涪陵区| 沙洋县| 久治县| 青冈县| 长岛县| 台湾省| 苍溪县| 浠水县| 高雄县| 潮安县| 武夷山市| 修文县| 辽阳县| 怀柔区| 德安县| 永嘉县| 西林县|