<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    C#每天一學(xué)之checked&unchecked

    checked和unchecked操作符用于整型算術(shù)運(yùn)算時(shí)控制當(dāng)前環(huán)境中的溢出檢查。下列運(yùn)算參與了checked和unchecked檢查(操作數(shù)均為整數(shù)):

    1)  預(yù)定義的++和―― 一元運(yùn)算符。

    2)  預(yù)定義的-一元運(yùn)算符。

    3)  預(yù)定義的+、-、×、/等二元操作符。

    4)  從一種整型到另一種整型的顯示數(shù)據(jù)轉(zhuǎn)換。

     

    (一)使用checked

    若運(yùn)算是常量表達(dá)式,則產(chǎn)生編譯錯(cuò)誤:The operation overflows at complie time in checked mode.

    若運(yùn)算是非常量表達(dá)式,則運(yùn)行時(shí)會(huì)拋出一個(gè)溢出異常:OverFlowException異常。

    checked 的用法可以是checked(//運(yùn)算代碼),也可以是checked{//運(yùn)算代碼},一般都是小量的代碼。

    先看下面代碼:

                Byte b = 100;

                b 
    += 200;

                Console.WriteLine(b.ToString());

     結(jié)果并不是我們預(yù)想的輸出300,輸出是44。假設(shè)我們用于計(jì)算那是多么的危險(xiǎn),上述代碼編譯時(shí)編譯器并沒有告訴程序員運(yùn)算溢出。而是偷偷的干了壞事...

    下面我們加上checked,看效果如何:

                byte b = 200;
                
    checked
                { 
                    b 
    += 200;
                }
                Console.WriteLine( b.ToString());

    可以看到程序并沒有輸出,而是在運(yùn)行時(shí)拋出OverflowException,干了try catch的事情,告訴程序員說運(yùn)算溢出了,趕快修bug。在運(yùn)行時(shí)才拋出異常,在測試中帶來些許麻煩,那么如何在程序編譯時(shí)就拋出錯(cuò)誤呢,事實(shí)上編譯時(shí)是不能確定運(yùn)算結(jié)果的,也就是說運(yùn)算結(jié)果是在運(yùn)行是才能確定,所以只有在運(yùn)行時(shí)checked才做運(yùn)算溢出檢查。但是下列代碼是編譯不通過的(地球人都知道)

                byte b;
                
    checked
                {
                    b 
    = 256;
                }
                Console.WriteLine( b.ToString());

    輸出錯(cuò)誤 Constant value '300' cannot be converted to a 'byte' ,byte的范圍是0~255嘛,編譯當(dāng)然報(bào)錯(cuò)。

    需要指出的是,看下面代碼:

    Byte b = 100;
    = (Byte)checked(b + 200);//不拋出System.OverflowException異常信息

    這里解釋一下,因?yàn)?b+ 200 的結(jié)果是int32,checked是對int32的檢查當(dāng)然沒有運(yùn)算溢出,但是再將結(jié)果轉(zhuǎn)換成byte時(shí)沒有checked,所以返回值會(huì)被截掉不符合目標(biāo)類型的高位,輸出不正確的結(jié)果。

     

    (二)使用unchecked

    無論運(yùn)算是否是常量表達(dá)式,都沒有編譯錯(cuò)誤或是運(yùn)行時(shí)異常發(fā)生,只是返回值被截掉不符合目標(biāo)類型的高位,用法類似checked。

    參考資料:

    [1]C#中的checked、unchecked操作符http://www.knowsky.com/301786.html

    [2]基元類型和Checked、UnChecked操作符的使用 http://www.cnblogs.com/noviceliu/archive/2009/03/11/1408461.html

    作者: 王德田 發(fā)表于 2011-02-28 18:01 原文鏈接

    評論: 0 查看評論 發(fā)表評論


    最新新聞:
    · Firefox 4 將是 Mozilla 最后一個(gè)大發(fā)行版(2011-03-01 17:06)
    · 凡客V+商城月均銷售額過6000萬(2011-03-01 16:33)
    · 未來,很好玩 —— 談下一代掌機(jī)(2011-03-01 16:31)
    · Red Hat改變內(nèi)核源代碼打包方式(2011-03-01 16:29)
    · 分析預(yù)計(jì)Facebook今年廣告營收將接近22億美元(2011-03-01 16:25)

    編輯推薦:在西方的程序員眼里,東方的程序員是什么樣的?

    網(wǎng)站導(dǎo)航:博客園首頁  我的園子  新聞  閃存  小組  博問  知識庫

    posted on 2011-02-28 18:01 sanmao 閱讀(182) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     

    常用鏈接

    留言簿(5)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日韩视频免费在线| 免费人妻无码不卡中文字幕系| 污视频网站免费观看| 四虎影视久久久免费 | 亚洲avav天堂av在线不卡| 亚洲欧洲日韩国产综合在线二区| 99人中文字幕亚洲区| 亚洲乱码在线观看| 美女被艹免费视频| 香蕉免费一级视频在线观看| 99久在线国内在线播放免费观看| 黄网站色在线视频免费观看| 国产真人无遮挡作爱免费视频| 亚洲精品无码专区久久同性男| 国产成人精品日本亚洲网站| 亚洲人成在线影院| 亚洲欧洲精品成人久久曰| 免费精品国自产拍在线播放| 一级毛片成人免费看免费不卡| 91免费精品国自产拍在线不卡| 四虎AV永久在线精品免费观看| 亚洲精品tv久久久久久久久| 亚洲国产亚洲综合在线尤物| 日韩欧美亚洲国产精品字幕久久久 | 亚洲人成网站在线观看播放| 亚洲精品**中文毛片| 国产成人综合亚洲绿色| 国产免费一区二区三区在线观看| 9久9久女女免费精品视频在线观看 | 全免费一级午夜毛片| 亚洲热妇无码AV在线播放| 亚洲国产日韩在线| 一级毛片a免费播放王色| 中文字幕视频免费| 四虎影视在线永久免费观看| 亚洲ⅴ国产v天堂a无码二区| 亚洲av纯肉无码精品动漫| a在线视频免费观看| 午夜爱爱免费视频| 色噜噜综合亚洲av中文无码| 国产精品亚洲专一区二区三区|