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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 x = x + 100 的處理方式與編譯為相同 IL 的 x += 100 不同?

為什么 x = x + 100 的處理方式與編譯為相同 IL 的 x += 100 不同?

C#
胡子哥哥 2022-01-09 15:18:49
我們知道這兩個加法語句是等價的,并且編譯成相同的 IL 代碼:int x = 100;x += 100;x = x + 100;但是,當(dāng)需要明確的演員表時,我注意到了一些奇怪的事情:byte b = 100;b += 200; // Compiles (1)b = b + 200; // Cannot implicitly convert int to byte (2)b = (byte) (b + 200); // Compiles (3)很明顯為什么第二個語句需要顯式轉(zhuǎn)換,因為加法的結(jié)果是整數(shù)。但對我來說奇怪的是第一個陳述。它編譯為與第三條語句完全相同的 IL,因此看起來編譯器添加了一個對我們來說應(yīng)該是顯式的強制轉(zhuǎn)換。但它不能在第二個語句中做到這一點。這對我來說似乎是矛盾的,因為我希望第一個語句等同于第二個并且永遠(yuǎn)不會編譯,那么為什么它會編譯呢?注意:當(dāng)需要從longto顯式轉(zhuǎn)換時,這不會編譯int:int x = 100;long y = 200;x += y;
查看完整描述

1 回答

?
慕森王

TA貢獻1777條經(jīng)驗 獲得超3個贊

您確實需要查看規(guī)格以獲取此類信息(并且很難理解措辭)。然而,直接從馬嘴里

12.18.3 復(fù)合賦值

x op= y通過應(yīng)用二元運算符重載決議(第 12.4.5 節(jié))來處理表單的操作,就好像該操作是編寫的 x op y.然后,

  • 如果所選運算符的返回類型可隱式轉(zhuǎn)換為 的類型x,則運算的計算結(jié)果為x = x  op y,但 x 僅計算一次。

  • 否則,如果所選運算符是預(yù)定義運算符,如果所選運算符的返回類型可顯式轉(zhuǎn)換為 的類型x,并且如果y可隱式轉(zhuǎn)換x 為x = (T)(x op y),其中T是 的類型x,除了x只計算一次。

  • 否則,復(fù)合賦值無效,并發(fā)生綁定時錯誤。

...

等等等等等等

...

上面的第二條規(guī)則允許在某些情況下x op= y進行評估。規(guī)則存在,使得預(yù)定義的運算符可以當(dāng)左操作數(shù)的類型的被用作化合物運營商,,,,或。即使兩個參數(shù)都是其中一種類型,預(yù)定義的運算符也會產(chǎn)生 int 類型的結(jié)果,如 §12.4.7.3 中所述。因此,如果沒有強制轉(zhuǎn)換,就不可能將結(jié)果分配給左操作數(shù)。x = (T)(x op y) sbytebyteshortushortchar

預(yù)定義運算符的規(guī)則的直觀效果很簡單,x op= y即如果x op yx = y都允許,則允許。

byte b = 0;char ch = '\0';int i = 0;b += 1; // Okb += 1000; // Error, b = 1000 not permittedb += i; // Error, b = i not permittedb += (byte)i; // Okch += 1; // Error, ch = 1 not permittedch += (char)1; // Ok

每個錯誤的直觀原因是相應(yīng)的簡單分配也將是一個錯誤。

簡而言之,計算機說不。


查看完整回答
反對 回復(fù) 2022-01-09
  • 1 回答
  • 0 關(guān)注
  • 247 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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