s s 1與s 1的區別

2021-06-06 01:31:36 字數 2504 閱讀 1201

s=s+1與s+=1在官方**上據說是等效的,可是在實際的應用中,它們之間還是有一點小小的區別,這些區別造成了一些困惑,現在就對這些區別做一些解釋。

前幾天乙個很牛的朋友問我:「s=s+1與s+=1有什麼區別?」,我認為他在開玩笑,因為以這個朋友的實力,不會不知道這個的,我認為這是乙個陷阱,趕快到msdn上 進行查詢,得到的結果是:

使用 += 賦值運算子的表示式,

x += y
等效於
x = x + y。既然msdn上都說了「等效」,當然它們應該是一樣的。我的朋友立即給我發過來一段**,
short s = 1;
s = s + 1;
short n = 1;
n += 1;
console.readkey();
其中s=s+1編譯錯誤:無法將型別「int」隱式轉換為「short」。存在乙個顯式轉換(是否缺少強制轉換?),並且定位在s=s+1這一行,從
這裡看兩個還真的不等效。
於是將**改寫為
short s = 1;
s = (short)(s + 1);
short n = 1;
n += 1;
console.readkey();
編譯通過,於是推測s=s+1這個表示式中,1被預設的看為整型int,根據運算規則,s+1中的s也會隱式的轉換成int,於是結果就變成
了int型別,由於int型別比short型別的精度高,所以將int賦值給short時,需要進行強制型別轉換,於是,我又編寫了下面的**
short s = 1;

short k = 2;

s = s+k;

short n = 1;

n += 1;

console.readkey();

編譯仍然不能通過,提示資訊錯誤無法將型別「int」隱式轉換為「short」。存在乙個顯式轉換(是否缺少強制轉換?),暈倒,short+short得出的結果仍然是int型別,為了測試這個想法,於是編寫**如下:

short s = 1;

short k = 2;

console.writeline((s + k).gettype().fullname);

short n = 1;

n += 1;

console.readkey();

得到的結果是system.int32(在c#中,short對應system.int16,int對應system.int32),在c#中,為數值型別和字串型別預定義了二元 + 運算子。其實+運算子應該也是乙個函式呼叫,只是這個函式的名字比較特殊罷了。

當乙個函式的名稱相同,而要根據引數的型別或者引數的個數的不同而有不同的實現的時候,需要進行函式的過載,問題可能就是出現在這個+運算子的過載了。

推測在系統的內部,系統只過載了 int operator+(int,int)這樣的函式,在進行short+short運算時,系統尋找精確的匹配,但是沒有找到,可是將short公升級為int是乙個自動的過程,於是系統呼叫了int operator(int,int)這個函式,得到的結果也就被轉化為int型別,就出現了上面的錯誤。

而+=這個運算子與+運算子一樣,但是系統過載了short operator +=(short,short)或者short operator +=(int,int),這個函式的具體實現沒辦法看到,可是據推測應該是這樣

short operator+=(int b)

return (short)(this+b);

也就是在返回資料的結果前,系統自己做了強制型別轉換。為了驗證這個思想,我又做了兩件事情。

第一:對short型別擴充套件乙個方法(vs2008的擴充套件方法),該方法實現的是兩個short型別的變數的加和,但是在返回結果前,對結果進行強制型別轉換。**如下:

{static class myshort

{public static short add(this short a,short b)

return (short)(a+b);

重新編寫**

short s = 1;

short k = 2;

s=s.add(k);

沒有任何問題,編譯通過。

第二:對源**進行反編譯,看看反編譯的**

源**如下:

static void main(string args)

short s = 1;

short k = 2;

s=s.add(k);

short n = 1;

n += 1;

console.readkey();

生成的反編譯的**:

private static void

short s = 1;

short k = 2;

short n = 1;

n = (short) (n + 1);

console.readkey();

對比可以知道,+=運算子果然在返回結果之前系統進行了強制型別轉換。

java中short s s 1和s 1的區別

首先給大家分享乙個巨牛巨牛的人工智慧教程,是我無意中發現的。教程不僅零基礎,通俗易懂,而且非常風趣幽默,還時不時有內涵段子,像看 一樣,哈哈 我正在學習中,覺得太牛了,所以分享給大家!點這裡可以跳轉到教程 short s s 1 會出現編譯錯誤。s 1的時候,結果會被 公升格 為int型別。把int...

SS1信令呼叫流程及其缺陷

傳統一號信令網路的呼叫流程 國內傳統的話音中繼均採用一號信令來控制接續,一號信令屬隨路信令,訊號 主 被叫號碼 通過話音通道中的多頻模擬訊號 mfc 來傳送。以下是一號信令網的呼叫流程 在乙個傳統 系統中,使用者摘機並拔被叫號碼,號碼用雙音訊訊號傳送到交換局 co 交換局分析被叫號碼。交換局分析被叫...

資料結構 S1

因為要準備考研開始學習資料結構,希望養成寫部落格的習慣 資料結構三要素 邏輯結構,物理結構,資料運算方法 各種函 數 在今後對各種不同資料結構的學習,其大體的思路都是對這三 要素的學習。1.邏輯結構 集合 線性結構 樹形結構 圖結構 2.物理結構 順序儲存 鏈式儲存 索引儲存 雜湊儲存。3.演算法 ...