日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

小心VB.NET中的除运算符/和/

發(fā)布時(shí)間:2025/3/20 asp.net 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小心VB.NET中的除运算符/和/ 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

小心VB.NET中的除運(yùn)算符"/"和"/"

????? VB.NET中除運(yùn)算符有兩種,普通除"/"和整數(shù)除"/",如果我們寫程序時(shí)不注意兩者的區(qū)別,很容易造成潛在的錯(cuò)誤,這種錯(cuò)誤很隱蔽,不容易被發(fā)現(xiàn)。而且VB.NET中類型轉(zhuǎn)換和C#差別很大,應(yīng)該引起我們足夠的重視,這些看似微不足道的細(xì)節(jié)卻直接關(guān)系都我們代碼的健壯性。

??????1.問題的引出

??????下面是開發(fā)中遇到問題代碼的簡化部分,輸入大部分?jǐn)?shù)據(jù)都沒問題,但當(dāng)輸入數(shù)字為18時(shí)會拋出異常“System.ArgumentException: 偏移量和長度超出數(shù)組的界限,于從索引到源集合結(jié)尾處的元素?cái)?shù)量。在 System.Collections.ArrayList.GetRange(Int32 index, Int32 count)”。是什么原因使ArrayList集合越界呢?這和VB.NET中的除運(yùn)算符有什么關(guān)系呢?當(dāng)我們理解了VB.NET中兩種除的區(qū)別以及類型轉(zhuǎn)換(Double—>Integer)的實(shí)質(zhì)后,問題的答案也就不言自明了。

引出問題的代碼


??????2.普通除"/"和整數(shù)除"/"

????? 1)普通除:expression1 / expression2

????? 結(jié)果是 expression1 除以 expression2 的完整的商,包括任何余數(shù)。執(zhí)行除法之前,任何整數(shù)數(shù)值表達(dá)式(除數(shù)和被除數(shù))都會被擴(kuò)展為 Double。如果將結(jié)果賦給整數(shù)數(shù)據(jù)類型,Visual Basic 會試圖將結(jié)果從 Double 轉(zhuǎn)換成這種類型。

????? 舉例說明:30 / 18 = 1.6666666666666667,執(zhí)行除法前被除數(shù)30和除數(shù)18都擴(kuò)展為Double類型,結(jié)果也為Double類型。

????? 2)整數(shù)除:expression1?/ expression2

????? 結(jié)果是 expression1 除以 expression2 的整數(shù)商,它丟棄了所有余數(shù),只保留整數(shù)部分(稱為截?cái)?#xff09;。結(jié)果數(shù)據(jù)類型是數(shù)值類型,對應(yīng)于 expression1 和 expression2 的數(shù)據(jù)類型。值得注意的一點(diǎn),如果除數(shù)或被除數(shù)為浮點(diǎn)數(shù),在執(zhí)行除法前,編譯器會采用“四舍六入五成雙”的規(guī)則將其轉(zhuǎn)換成Long類型,再執(zhí)行除法。

??????舉例說明:30 / 18 = 1,只保留結(jié)果的整數(shù)部分。

????? 3.VB.NET中的類型轉(zhuǎn)換(Double—>Integer)

????? 根據(jù)第二部分對普通除的解釋,當(dāng)CLR執(zhí)行Dim oneTimeNum As Integer =?30 / 18時(shí),首先將被除數(shù)30和除數(shù)18都擴(kuò)展為Double類型,進(jìn)行除運(yùn)算得到Double類型的結(jié)果1.6666666666666667,因?yàn)橐獙ouble類型數(shù)據(jù)賦值給Integer類型變量,此時(shí)要執(zhí)行強(qiáng)制類型轉(zhuǎn)換,得到最終結(jié)果oneTimeNum = 2(可能很多人和我一樣會奇怪結(jié)果為什么不是1)。我們從IL代碼中查看VB.NET中從Double—>Integer類型轉(zhuǎn)換的實(shí)質(zhì)。

函數(shù)F1對應(yīng)的IL代碼


??????從IL代碼可以看出,VB.NET中執(zhí)行類型轉(zhuǎn)換實(shí)際上是調(diào)用的函數(shù)[mscorlib]System.Math::Round(float64),MSDN中對這個(gè)函數(shù)的解釋:將雙精度浮點(diǎn)值舍入為最接近的整數(shù),如果參數(shù)為兩個(gè)整數(shù)的中值,這兩個(gè)整數(shù)一個(gè)為偶數(shù),另一個(gè)為奇數(shù),則返回偶數(shù)(也就是我們常說的“四舍六入五成雙”)。
??????現(xiàn)在,可以很好的解釋文章開始提出的問題了:由于輸入18時(shí),oneTimeNum的值為2,當(dāng)循環(huán)到第16次時(shí)i = 15,此時(shí)執(zhí)行list.GetRange(oneTimeNum * i, length)list.GetRange(30,2),已經(jīng)超出了list的長度范圍,所以會拋出異常。

??????4.C#和VB.NET的區(qū)別

??????1)C#中的除運(yùn)算"/"符相當(dāng)于VB.NET的整數(shù)除"/"運(yùn)算符;
????? 2)C#中從Double—>Integer類型轉(zhuǎn)換必須要采用顯示方式,且轉(zhuǎn)換規(guī)則為直接舍棄小數(shù)位。

????? 總結(jié)這次出現(xiàn)問題的根源是用C#語法去推斷VB.NET語法,因?yàn)榻佑|C#較早,而C#和VB.NET語法又大同小異,忽略了對VB.NET基本語法的學(xué)習(xí),以后應(yīng)多注意兩種語言的差別,盡量減少類似的錯(cuò)誤。還有一點(diǎn)需要注意,遇到問題的時(shí)候多查MSDN,似乎現(xiàn)在都習(xí)慣從網(wǎng)上尋求答案,但網(wǎng)上關(guān)于 VB.NET除運(yùn)算符的內(nèi)容并不多,找了半天,才發(fā)現(xiàn)MSDN上寫的很詳細(xì),我想查找資料的順序應(yīng)該是:MSDN—>CNBlogs找找看— >Google/Baidu。

Tag標(biāo)簽: C#,VB,運(yùn)算符,類型轉(zhuǎn)換

原文:http://www.cnblogs.com/freshman0216/archive/2008/08/27/1276991.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的小心VB.NET中的除运算符/和/的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。