數據通常是用0、1、2、3、4、5、6、7、8、9這些數來表示,由這些數的不同組合表示現實生活中各種各樣的數據。在我們的教育中,0給我們的第一直覺就是沒有。那麼0真的隻是代表沒有的意思嗎?作為程序員,你可不能這麼理解哦~通過觀察,我們可以發現
例如溫度的0℃,并不代表沒有溫度,時間0點不代表沒有時間。
我們來看一個小故事:
在數學王國裡,胖子0與瘦子1常常為了誰大而争執不休。瞧!今天,這兩個小冤家狹路相逢,彼此之間又展開了一場舌戰。
瘦子1搶先發言:“哼!胖胖的0,你有什麼了不起?就像100,如果沒有我這個瘦子1,你這兩個胖0有什麼用?”
胖子0不服氣了:“你也甭在我面前耍威風,想想看,要是沒有我,你就隻是一個光杆呢?”
0并不表示什麼都沒有。
數的大小與所處的位置有關系。
程序中的0
在電子技術中,0一般表示低電平,1為高電平。在邏輯計算中,0一般表示邏輯假(False),1為邏輯真(True)。
在數值運算中,0與平常數學中0的含義相同。
在程序中,數據0有什麼含義呢?
1.未賦值的變量為0?
在不同的程序設計語言中,對于未賦值變量的處理不一樣。
對于Basic類的程序語言,如QB(QuickBasic,簡環QB)、VB(VisualBasic,簡稱VB),如果數值型變量未賦初值,則其初始值為0。例如,有以下VB程序代碼:
Private Sub Test
Dim i As Integer
MsgbOX "變量 i=" & i, ,"變量初始值"
End Sub
在以上VB代碼中,聲明了變量i,但未對其進行賦值。
雖然未進行變量賦值初始化,但VB編譯器會自動将這類數值型變量初始化為0。因此,執行以上代碼将顯示如圖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開發環境中仔細觀察代碼,可看到在MsgBox函數中的變量i下方有一個波浪線,将鼠标指針指向變量i,可看到如圖1-5所示的提示信息,提示變量i在賦值前被使用。
圖1-5
對于C語言系列的程序設計語言(如C、C 、C#等),程序員就沒那麼幸運了,未初始化的變量編譯器并不會将其初始化為0,
而且不同編譯系統可能會采用不同的處理方式。例如,有如下的C#程序:
以上的C#程序是沒辦法編譯通過的。在VisualStudio開發環境中可以看到變量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環境中編寫以下C語言程序:
int main()
{
int i;
print("變量 i=%d",i);
getch();
return 0;
}
編譯時不會提示錯誤,運行時則将顯示類似圖1-7所示的結果。
圖1-7
雖然在程序中沒有初始化變量i,但變量i卻有一個值(圖1-7中顯示的是1976933940,下次運行該程序時可能又是另一個值),這是為什麼呢?原來,在ANSIC中定義變量時,編譯器将給該變量分配内存,但并不會将分配的内存初始化為0。這樣,原來該内存區域中保存的是什麼值,新指定的變量也就具有了什麼值。在圖1-7所示結果中,給變量i分配的内存中的值正好為1976933940,所以變量i也就具有了這個值。
2.數值0的類型轉換
程序中經常會用到數據類型的轉換,如将數值類型轉換為字符串類型、将數值類型轉換為布爾類型等。
将數值0轉換為字符串0,這種轉換很好理解,其顯示的内容都是相同的0,隻有在進行數值運算時才能體現出不同。
數值0轉換為布爾類型是什麼值呢?
在ANSIC中沒有專門設置布爾類型,在進行邏輯運算時,将0值作為布爾值False,将非0值作為布爾值True。在C#中,定義了Boolean類型,數值0轉換為Boolean類型時得到的結果為False,非0值轉換為Boolean類型時得到的結果為True。
3.除以0異常
我們在小學就學過:0可以做被除數,但不可以做除數。在程序中,當除數為0時,将出現異常。例如,有以下C代碼:
int main()
{
int Dividend,Divisor,Result;
Dividend = 8;
Divisor = 0;
Result = Dividend / Divisor;
printf("%d/%d=%d",Dividend,Divisor,Result );
getch();
return 0;
}
當執行以上代碼時,由于除數Divisor為0,将産生一個嚴重的錯誤,導緻程序不能繼續運行,如圖1-8所示。
圖1-8
在程序執行中如果遇到這種異常,将導緻程序中斷,但這不是我們所希望的。
一個好的程序員應該考慮并處理程序中可能發生的各種異常,并捕獲這些異常,然後給用戶顯示出一個友好的錯誤提示信息。不過,ANSI
C中并沒有提供異常捕獲機制,
因此需要程序員根據程序執行過程,主動去判斷除數,以避免産生這種嚴重異常。例如,
可将以上代碼修改為以下形式:
int main()
{
int Dividend,Divisor,Result;
Dividend = 8;
Divisor = 0;
if(Divisor==0){
printf("除數不能為0!");
}else{
result = Dividend / Divisor;
printf("%d/%d=%d",Dividend,Divisor,Result);
}
getch();
return 0;
}
編譯執行以上程序,将得到如圖1-9所示的結果,提示了“除數不能為0!”,程序并沒有進入嚴重異常狀态。
圖1-9
在異常捕獲方面,C 、C#就要方便得多。例如,C#定義了很多異常(也包括Divide By ZeroException異常),我們在程序中可以使用try…catch結構來捕獲這些異常并進行處理。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!