2014-10-27 267 views
0

我的問題是婁代碼的註釋:爲什麼發生運行時錯誤而不是編譯錯誤?

static void Main(string[] args) 
    { 
     int a = int.Parse(Console.ReadLine()); 
     int div1 = 5/a; // a isn't Unknown until Runtime, 
         // if a==0, Runtime error occurred. it's Ok! 

     a = 0; 
     int div2 = 10/a; // local variable a's Value is zero 
         // and not exist any sentence 
         // between "a=0;" and "int div2=10/a;" to change variable a, 
         // why Runtime Error occurred instead of Compile Error? 
    } 

預先感謝您的回答。 因爲英語是我的第二語言,所以我對英語差的寫作表示歉意。

+0

它仍然是一個運行時錯誤。編譯錯誤只會發生在已知類型的問題或語法錯誤。 – Deanna 2014-10-27 09:58:18

+1

讓編譯器檢查編譯時是否可能存在divzero問題沒有多大意義 - 編譯器邏輯將比編譯代碼複雜得多,想象如果您將代碼暫停在= 0和10/a改變另一個線程的值。編譯器也必須檢查這個 – Sebastian 2014-10-27 10:05:51

+0

編譯器不會嘗試運行代碼並查看會發生什麼。所以它不記住a == 0除以它,即使a只被分配了一行以上。如果a是複雜計算的結果呢?應該跟蹤什麼和不應該有什麼限制? – 2014-10-27 10:06:46

回答

0

原因只在運行時間變量a將被賦值爲0,所以除法將與DivideByZero異常失敗。

試試這樣做int div2 = 10/0;並且會看到編譯器在現場發出紅色波形錯誤。

這也將是相同的情況下,如果你聲明int aconstant像下面

constant int a = 0; 
int div2 = 10/a; 

這是因爲,在編譯時;編譯器只會將常數值替換爲與參考值相同的常量值,這與直接將其除以0。所以下面

int div2 = 10/a; 

該生產線將成爲

int div2 = 10/0; 
+0

此外,除以「0」的常量時,會得到相同的編譯錯誤。 – Rob 2014-10-27 11:14:11

+0

@Rob,那真正的原因編譯器會在編譯時進行替換。見編輯的答案。 – Rahul 2014-10-27 12:19:25

+0

謝謝拉胡爾,你已經定義了常數,但我的問題是別的。請再次閱讀問題。 – kokabi 2014-10-27 15:18:11

相關問題