數(shù)據(jù)通常是用0、1、2、3、4、5、6、7、8、9這些數(shù)來表示,由這些數(shù)的不同組合表示現(xiàn)實生活中各種各樣的數(shù)據(jù)。在我們的教育中,0給我們的第一直覺就是沒有。那么0真的只是代表沒有的意思嗎?作為程序員,你可不能這么理解哦~
通過觀察,我們可以發(fā)現(xiàn)
例如溫度的0℃,并不代表沒有溫度,時間0點不代表沒有時間。
我們來看一個小故事:
在數(shù)學(xué)王國里,胖子0與瘦子1常常為了誰大而爭執(zhí)不休。
瞧!今天,這兩個小冤家狹路相逢,彼此之間又展開了一場舌戰(zhàn)。
瘦子1搶先發(fā)言:“哼!胖胖的0,你有什么了不起?就像100,如果沒有我這個瘦子1,你這兩個胖0有什么用?”
胖子0不服氣了:“你也甭在我面前耍威風(fēng),想想看,要是沒有我,你就只是一個光桿呢?”
“喲!”1不甘示弱,“你再神氣也不過是表示什么也沒有,看!1+0還不等于我本身,你哪點兒派得上用場啦?”
“去!1×0結(jié)果也還不是我,你1不也同樣沒用!”0針鋒相對。
“你……”1頓了頓,隨機應(yīng)變道,“不管怎么說,你0就是表示什么也沒有!”
“這就是你見識少了?!?不慌不忙地說,“你看,日常生活中,氣溫0度,難道是沒有溫度嗎?再比如,直尺上沒有我作為起點,哪有你1呢?”
“再怎么比,我始終比你大。”1信心十足地說。
聽了這話,0更顯得理直氣壯地說:“嘿嘿,你的大小還得我說了算,我站你左邊,你就成0.1,我站你右邊你就是10。怎么樣?
我可讓你放大10倍,也可讓你縮小10倍!”
眼看著胖子0與瘦子1爭得臉紅耳赤,誰也不讓誰,
一旁觀戰(zhàn)的其他數(shù)字們都十分著急。
這時,9靈機一動,上前做了個暫停的手勢:“你倆都別爭了,瞧你們,1、0有哪個數(shù)比我大?”
“這……”胖子0、瘦子1啞口無言。
這時,9才心平氣和地說:“1、0,其實,只要你們站在一塊,不就比我大了嗎?”
1、0面面相覷,半晌才搔搔頭笑了。“這才對嘛!把自己的位置放正,就能起到應(yīng)有的作用”。9語重心長地說。
從以上故事可看出以下兩點:
- 0并不表示什么都沒有。
- 數(shù)的大小與所處的位置有關(guān)系。
程序中的0
在電子技術(shù)中,0一般表示低電平,1為高電平。在邏輯計算中,0一般表示邏輯假(False),1為邏輯真(True)。
在數(shù)值運算中,0與平常數(shù)學(xué)中0的含義相同。
在程序中,數(shù)據(jù)0有什么含義呢?
1.未賦值的變量為0?
在不同的程序設(shè)計語言中,對于未賦值變量的處理不一樣。
對于Basic類的程序語言,如QB(QuickBasic,簡環(huán)QB)、VB(VisualBasic,簡稱VB),如果數(shù)值型變量未賦初值,則其初始值為0。例如,有以下VB程序代碼:Private Sub Test
Dim i As Integer
MsgbOX "變量 i=" & i, ,"變量初始值"
End Sub
在以上VB代碼中,聲明了變量i,但未對其進行賦值。
雖然未進行變量賦值初始化,但VB編譯器會自動將這類數(shù)值型變量初始化為0。因此,執(zhí)行以上代碼將顯示如圖1-3所示的對話框。
圖1-3
對程序員來說,VB對變量進行初始化的方式很討人喜歡,變量聲明后就可以使用。但是,在.NetFramework中,其處理方式又不相同,例如,以下是VB.
NET中的代碼:
Private Sub Buttonl_Click(sender As System.Object,e As System.EventArgs)
_
Handles Buttonl.Click
Dim i
MSgBox("變量 i=" & i,,"變量初始值")
End Sub
以上代碼并不會出錯,但運行后得到的結(jié)果如圖1-4所示。
從這個結(jié)果可看出,在VB.NET中,
如果變量使用之前未進行初始化,這時其值為空(并不為0)。
其實,在VisualStudio開發(fā)環(huán)境中仔細觀察代碼,可看到在MsgBox函數(shù)中的變量i下方有一個波浪線,將鼠標(biāo)指針指向變量i,可看到如圖1-5所示的提示信息,提示變量i在賦值前被使用。
圖1-5
對于C語言系列的程序設(shè)計語言(如C、C++、C#等),程序員就沒那么幸運了,未初始化的變量編譯器并不會將其初始化為0,
而且不同編譯系統(tǒng)可能會采用不同的處理方式。例如,有如下的C#程序:
以上的C#程序是沒辦法編譯通過的。在VisualStudio開發(fā)環(huán)境中可以看到變量i下方有一條波浪線,將鼠標(biāo)指針移到變量i上,可看到如圖1-6所示的錯誤提示信息,提示使用了未賦值的局部變量i。
圖1-6
要想得到如圖1-3所示的對話框,在C#中必須將變量i進行初始化,給變量賦值為0,修改后的代碼如下:
private void buttonl Click(object sender, EventArgs e)
{
int i=0;
MessageBox.Show(string.Format("變量 i={0}", i),"變量初始值");
}
而在Dev-CPP環(huán)境中編寫以下C語言程序:
int main()
{
int i;
print("變量 i=%d",i);
getch();
return 0;
}
編譯時不會提示錯誤,運行時則將顯示類似圖1-7所示的結(jié)果。
圖1-7
雖然在程序中沒有初始化變量i,但變量i卻有一個值(圖1-7中顯示的是1976933940,下次運行該程序時可能又是另一個值),這是為什么呢?原來,在ANSIC中定義變量時,編譯器將給該變量分配內(nèi)存,但并不會將分配的內(nèi)存初始化為0。這樣,原來該內(nèi)存區(qū)域中保存的是什么值,新指定的變量也就具有了什么值。在圖1-7所示結(jié)果中,給變量i分配的內(nèi)存中的值正好為1976933940,所以變量i也就具有了這個值。
2.?dāng)?shù)值0的類型轉(zhuǎn)換
程序中經(jīng)常會用到數(shù)據(jù)類型的轉(zhuǎn)換,如將數(shù)值類型轉(zhuǎn)換為字符串類型、將數(shù)值類型轉(zhuǎn)換為布爾類型等。
將數(shù)值0轉(zhuǎn)換為字符串0,這種轉(zhuǎn)換很好理解,其顯示的內(nèi)容都是相同的0,只有在進行數(shù)值運算時才能體現(xiàn)出不同。
數(shù)值0轉(zhuǎn)換為布爾類型是什么值呢?
在ANSIC中沒有專門設(shè)置布爾類型,在進行邏輯運算時,將0值作為布爾值False,將非0值作為布爾值True。在C#中,定義了Boolean類型,數(shù)值0轉(zhuǎn)換為Boolean類型時得到的結(jié)果為False,非0值轉(zhuǎn)換為Boolean類型時得到的結(jié)果為True。
3.除以0異常
我們在小學(xué)就學(xué)過:0可以做被除數(shù),但不可以做除數(shù)。在程序中,當(dāng)除數(shù)為0時,將出現(xiàn)異常。例如,有以下C代碼:int main()
{
int Dividend,Divisor,Result;
Dividend = 8;
Divisor = 0;
Result = Dividend / Divisor;
printf("%d/%d=%d",Dividend,Divisor,Result );
getch();
return 0;
}
當(dāng)執(zhí)行以上代碼時,由于除數(shù)Divisor為0,將產(chǎn)生一個嚴(yán)重的錯誤,導(dǎo)致程序不能繼續(xù)運行,如圖1-8所示。
圖1-8
在程序執(zhí)行中如果遇到這種異常,將導(dǎo)致程序中斷,但這不是我們所希望的。
一個好的程序員應(yīng)該考慮并處理程序中可能發(fā)生的各種異常,并捕獲這些異常,然后給用戶顯示出一個友好的錯誤提示信息。不過,ANSI
C中并沒有提供異常捕獲機制,
因此需要程序員根據(jù)程序執(zhí)行過程,主動去判斷除數(shù),以避免產(chǎn)生這種嚴(yán)重異常。例如,
可將以上代碼修改為以下形式:
int main()
{
int Dividend,Divisor,Result;
Dividend = 8;
Divisor = 0;
if(Divisor==0){
printf("除數(shù)不能為0!");
}else{
result = Dividend / Divisor;
printf("%d/%d=%d",Dividend,Divisor,Result);
}
getch();
return 0;
}
編譯執(zhí)行以上程序,將得到如圖1-9所示的結(jié)果,提示了“除數(shù)不能為0!”,程序并沒有進入嚴(yán)重異常狀態(tài)。
圖1-9
在異常捕獲方面,C++、C#就要方便得多。例如,C#定義了很多異常(也包括Divide By ZeroException異常),我們在程序中可以使用try…catch結(jié)構(gòu)來捕獲這些異常并進行處理。
更多建議: