0的故事

2018-08-04 19:41 更新
數(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ù)學王國里,胖子0與瘦子1常常為了誰大而爭執(zhí)不休。瞧!今天,這兩個小冤家狹路相逢,彼此之間又展開了一場舌戰(zhàn)。
瘦子1搶先發(fā)言:“哼!胖胖的0,你有什么了不起?就像100,如果沒有我這個瘦子1,你這兩個胖0有什么用?”
胖子0不服氣了:“你也甭在我面前耍威風,想想看,要是沒有我,你就只是一個光桿呢?”
“喲!”1不甘示弱,“你再神氣也不過是表示什么也沒有,看!1+0還不等于我本身,你哪點兒派得上用場啦?”
“去!1×0結果也還不是我,你1不也同樣沒用!”0針鋒相對。
“你……”1頓了頓,隨機應變道,“不管怎么說,你0就是表示什么也沒有!”
“這就是你見識少了?!?不慌不忙地說,“你看,日常生活中,氣溫0度,難道是沒有溫度嗎?再比如,直尺上沒有我作為起點,哪有你1呢?”
“再怎么比,我始終比你大?!?信心十足地說。
聽了這話,0更顯得理直氣壯地說:“嘿嘿,你的大小還得我說了算,我站你左邊,你就成0.1,我站你右邊你就是10。怎么樣?
我可讓你放大10倍,也可讓你縮小10倍!”
眼看著胖子0與瘦子1爭得臉紅耳赤,誰也不讓誰,
一旁觀戰(zhàn)的其他數(shù)字們都十分著急。
這時,9靈機一動,上前做了個暫停的手勢:“你倆都別爭了,瞧你們,1、0有哪個數(shù)比我大?”
“這……”胖子0、瘦子1啞口無言。
這時,9才心平氣和地說:“1、0,其實,只要你們站在一塊,不就比我大了嗎?”
1、0面面相覷,半晌才搔搔頭笑了。“這才對嘛!把自己的位置放正,就能起到應有的作用”。9語重心長地說。


從以上故事可看出以下兩點:

  • 0并不表示什么都沒有。
  • 數(shù)的大小與所處的位置有關系。

程序中的0

在電子技術中,0一般表示低電平,1為高電平。在邏輯計算中,0一般表示邏輯假(False),1為邏輯真(True)。
在數(shù)值運算中,0與平常數(shù)學中0的含義相同。
在程序中,數(shù)據(jù)0有什么含義呢?

1.未賦值的變量為0?

在不同的程序設計語言中,對于未賦值變量的處理不一樣。
對于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

以上代碼并不會出錯,但運行后得到的結果如圖1-4所示。
從這個結果可看出,在VB.NET中,
如果變量使用之前未進行初始化,這時其值為空(并不為0)。

圖1-4

其實,在VisualStudio開發(fā)環(huán)境中仔細觀察代碼,可看到在MsgBox函數(shù)中的變量i下方有一個波浪線,將鼠標指針指向變量i,可看到如圖1-5所示的提示信息,提示變量i在賦值前被使用。
圖1-5
對于C語言系列的程序設計語言(如C、C++、C#等),程序員就沒那么幸運了,未初始化的變量編譯器并不會將其初始化為0,
而且不同編譯系統(tǒng)可能會采用不同的處理方式。例如,有如下的C#程序:
以上的C#程序是沒辦法編譯通過的。在VisualStudio開發(fā)環(huán)境中可以看到變量i下方有一條波浪線,將鼠標指針移到變量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所示的結果。
圖1-7
雖然在程序中沒有初始化變量i,但變量i卻有一個值(圖1-7中顯示的是1976933940,下次運行該程序時可能又是另一個值),這是為什么呢?原來,在ANSIC中定義變量時,編譯器將給該變量分配內(nèi)存,但并不會將分配的內(nèi)存初始化為0。這樣,原來該內(nèi)存區(qū)域中保存的是什么值,新指定的變量也就具有了什么值。在圖1-7所示結果中,給變量i分配的內(nèi)存中的值正好為1976933940,所以變量i也就具有了這個值。

2.數(shù)值0的類型轉換

程序中經(jīng)常會用到數(shù)據(jù)類型的轉換,如將數(shù)值類型轉換為字符串類型、將數(shù)值類型轉換為布爾類型等。

將數(shù)值0轉換為字符串0,這種轉換很好理解,其顯示的內(nèi)容都是相同的0,只有在進行數(shù)值運算時才能體現(xiàn)出不同。
數(shù)值0轉換為布爾類型是什么值呢?

在ANSIC中沒有專門設置布爾類型,在進行邏輯運算時,將0值作為布爾值False,將非0值作為布爾值True。在C#中,定義了Boolean類型,數(shù)值0轉換為Boolean類型時得到的結果為False,非0值轉換為Boolean類型時得到的結果為True。

3.除以0異常

我們在小學就學過:0可以做被除數(shù),但不可以做除數(shù)。在程序中,當除數(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;
}


當執(zhí)行以上代碼時,由于除數(shù)Divisor為0,將產(chǎn)生一個嚴重的錯誤,導致程序不能繼續(xù)運行,如圖1-8所示。
圖1-8
在程序執(zhí)行中如果遇到這種異常,將導致程序中斷,但這不是我們所希望的。
一個好的程序員應該考慮并處理程序中可能發(fā)生的各種異常,并捕獲這些異常,然后給用戶顯示出一個友好的錯誤提示信息。不過,ANSI
C中并沒有提供異常捕獲機制,
因此需要程序員根據(jù)程序執(zhí)行過程,主動去判斷除數(shù),以避免產(chǎ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所示的結果,提示了“除數(shù)不能為0!”,程序并沒有進入嚴重異常狀態(tài)。
圖1-9
在異常捕獲方面,C++、C#就要方便得多。例如,C#定義了很多異常(也包括Divide By ZeroException異常),我們在程序中可以使用try…catch結構來捕獲這些異常并進行處理。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號