0的故事

2018-08-04 19:41 更新
數(shù)據(jù)通常是用0、1、2、3、4、5、6、7、8、9這些數(shù)來(lái)表示,由這些數(shù)的不同組合表示現(xiàn)實(shí)生活中各種各樣的數(shù)據(jù)。在我們的教育中,0給我們的第一直覺(jué)就是沒(méi)有。那么0真的只是代表沒(méi)有的意思嗎?作為程序員,你可不能這么理解哦~

通過(guò)觀察,我們可以發(fā)現(xiàn)


例如溫度的0℃,并不代表沒(méi)有溫度,時(shí)間0點(diǎn)不代表沒(méi)有時(shí)間。


我們來(lái)看一個(gè)小故事:

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


從以上故事可看出以下兩點(diǎn):

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

程序中的0

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

1.未賦值的變量為0?

在不同的程序設(shè)計(jì)語(yǔ)言中,對(duì)于未賦值變量的處理不一樣。
對(duì)于Basic類的程序語(yǔ)言,如QB(QuickBasic,簡(jiǎn)環(huán)QB)、VB(VisualBasic,簡(jiǎn)稱VB),如果數(shù)值型變量未賦初值,則其初始值為0。例如,有以下VB程序代碼:
Private Sub Test
	Dim i As Integer
	MsgbOX "變量 i=" & i, ,"變量初始值"
End Sub


在以上VB代碼中,聲明了變量i,但未對(duì)其進(jìn)行賦值。
雖然未進(jìn)行變量賦值初始化,但VB編譯器會(huì)自動(dòng)將這類數(shù)值型變量初始化為0。因此,執(zhí)行以上代碼將顯示如圖1-3所示的對(duì)話框。
圖1-3
對(duì)程序員來(lái)說(shuō),VB對(duì)變量進(jìn)行初始化的方式很討人喜歡,變量聲明后就可以使用。但是,在.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

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

圖1-4

其實(shí),在VisualStudio開(kāi)發(fā)環(huán)境中仔細(xì)觀察代碼,可看到在MsgBox函數(shù)中的變量i下方有一個(gè)波浪線,將鼠標(biāo)指針指向變量i,可看到如圖1-5所示的提示信息,提示變量i在賦值前被使用。
圖1-5
對(duì)于C語(yǔ)言系列的程序設(shè)計(jì)語(yǔ)言(如C、C++、C#等),程序員就沒(méi)那么幸運(yùn)了,未初始化的變量編譯器并不會(huì)將其初始化為0,
而且不同編譯系統(tǒng)可能會(huì)采用不同的處理方式。例如,有如下的C#程序:
以上的C#程序是沒(méi)辦法編譯通過(guò)的。在VisualStudio開(kāi)發(fā)環(huán)境中可以看到變量i下方有一條波浪線,將鼠標(biāo)指針移到變量i上,可看到如圖1-6所示的錯(cuò)誤提示信息,提示使用了未賦值的局部變量i。
圖1-6
要想得到如圖1-3所示的對(duì)話框,在C#中必須將變量i進(jìn)行初始化,給變量賦值為0,修改后的代碼如下:
private void buttonl Click(object sender, EventArgs e)
{
	int i=0;
	MessageBox.Show(string.Format("變量 i={0}", i),"變量初始值");
}


而在Dev-CPP環(huán)境中編寫(xiě)以下C語(yǔ)言程序:
int main()
{
	int i;
	print("變量 i=%d",i);
	getch();
	return 0;
}


編譯時(shí)不會(huì)提示錯(cuò)誤,運(yùn)行時(shí)則將顯示類似圖1-7所示的結(jié)果。
圖1-7
雖然在程序中沒(méi)有初始化變量i,但變量i卻有一個(gè)值(圖1-7中顯示的是1976933940,下次運(yùn)行該程序時(shí)可能又是另一個(gè)值),這是為什么呢?原來(lái),在ANSIC中定義變量時(shí),編譯器將給該變量分配內(nèi)存,但并不會(huì)將分配的內(nèi)存初始化為0。這樣,原來(lái)該內(nèi)存區(qū)域中保存的是什么值,新指定的變量也就具有了什么值。在圖1-7所示結(jié)果中,給變量i分配的內(nèi)存中的值正好為1976933940,所以變量i也就具有了這個(gè)值。

2.?dāng)?shù)值0的類型轉(zhuǎn)換

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

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

在ANSIC中沒(méi)有專門(mén)設(shè)置布爾類型,在進(jìn)行邏輯運(yùn)算時(shí),將0值作為布爾值False,將非0值作為布爾值True。在C#中,定義了Boolean類型,數(shù)值0轉(zhuǎn)換為Boolean類型時(shí)得到的結(jié)果為False,非0值轉(zhuǎn)換為Boolean類型時(shí)得到的結(jié)果為T(mén)rue。

3.除以0異常

我們?cè)谛W(xué)就學(xué)過(guò):0可以做被除數(shù),但不可以做除數(shù)。在程序中,當(dāng)除數(shù)為0時(shí),將出現(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í),由于除數(shù)Divisor為0,將產(chǎn)生一個(gè)嚴(yán)重的錯(cuò)誤,導(dǎo)致程序不能繼續(xù)運(yùn)行,如圖1-8所示。
圖1-8
在程序執(zhí)行中如果遇到這種異常,將導(dǎo)致程序中斷,但這不是我們所希望的。
一個(gè)好的程序員應(yīng)該考慮并處理程序中可能發(fā)生的各種異常,并捕獲這些異常,然后給用戶顯示出一個(gè)友好的錯(cuò)誤提示信息。不過(guò),ANSI
C中并沒(méi)有提供異常捕獲機(jī)制,
因此需要程序員根據(jù)程序執(zhí)行過(guò)程,主動(dòng)去判斷除數(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!”,程序并沒(méi)有進(jìn)入嚴(yán)重異常狀態(tài)。
圖1-9
在異常捕獲方面,C++、C#就要方便得多。例如,C#定義了很多異常(也包括Divide By ZeroException異常),我們?cè)诔绦蛑锌梢允褂胻ry…catch結(jié)構(gòu)來(lái)捕獲這些異常并進(jìn)行處理。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)