2014-10-27 98 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

相关问题