2010-07-16 37 views
6

Tại sao trong C# là Ví dụ A hợp lệ, có thể biên dịch và sẽ chỉ bao bọc trong khi các ví dụ B sẽ không biên dịch?ngoại lệ số học trong C#

Một

int val = 0; 
val = val + Int32.MaxValue +2; 

hoặc

int val = Int32.MaxValue; 
val++; 

B

int val = 0; 
val = 2147483647 + 1; 

hoặc

int val = 0; 
int val = Int32.MaxValue + 1; 

tôi biết theo mặc định, ngoại lệ số học không được kiểm tra theo mặc định trừ khi bạn làm như vậy bằng cách sử dụng phương thức đã chọn, khối hoặc thuộc tính trong cấu hình. Câu hỏi của tôi liên quan nhiều hơn đến trình biên dịch sau đó làm thế nào một ngoại lệ số học xảy ra.

+1

Tôi nghĩ rằng bạn đã bỏ lỡ các vấn đề trong khi đăng câu hỏi. Điều gì xảy ra sau "Câu hỏi của tôi liên quan nhiều hơn đến __________"? – bits

+0

@bits yes Tôi đã cổ vũ –

Trả lời

16

Ví dụ B của bạn là constant-folded lúc biên dịch, cho biết trình biên dịch được đảm bảo tràn.

Bởi vì ví dụ A của bạn sử dụng biến, biểu thức không thể (hoàn toàn) được xếp liên tục, do đó trình biên dịch không thể đảm bảo rằng các giá trị sẽ dẫn đến tràn.

Ví dụ ...

int val = 0; 
// some other thread changes `val` to -5... 
val = val + Int32.MaxValue +2; // no overflow 

Tuy nhiên, nếu bạn biết rằng val sẽ không thay đổi, và gán từ 0 đến một const int:

const int startval = 0; 
int val = startval + Int32.MaxValue + 2; 

Bạn có thể nhận compile- của bạn kiểm tra tràn thời gian trở lại vì giá trị có thể được xác định hoàn toàn và do đó được cố định gấp.

1

Nó chỉ đơn giản là phải làm với những hạn chế của việc kiểm tra thời gian biên dịch. Những thứ nhất định chỉ có thể được biết khi chạy.

3

Tôi biết rằng trường hợp ngoại lệ số học không được kiểm tra theo mặc định trừ khi bạn rõ ràng làm như vậy bằng cách sử dụng kiểm tra phương pháp, khối hoặc thuộc tính trong cấu hình

Bạn không biết rằng vì tuyên bố đó là không chính xác. Và trên thực tế bạn biết nó là không chính xác bởi vì bạn đã cung cấp một trường hợp mà tuyên bố của bạn được chứng minh là sai!

tôi giới thiệu bạn đến phần 7.6.12 của # đặc điểm kỹ thuật C, một phần trong số đó tôi sinh sản vào đây để thuận tiện cho bạn:

Đối với biểu thức không đổi (biểu thức được đánh giá ở thời gian chạy) mà không được bao bọc bởi bất kỳ toán tử hoặc kiểm soát nào được kiểm tra hoặc bỏ chọn, ngữ cảnh kiểm tra tràn mặc định được bỏ chọn trừ khi các yếu tố bên ngoài (chẳng hạn như chuyển mạch trình biên dịch và cấu hình môi trường thực thi).

Đối với cụm từ không đổi (biểu thức có thể được đánh giá đầy đủ tại thời gian biên dịch), ngữ cảnh kiểm tra tràn mặc định luôn được chọn.Trừ khi một biểu thức liên tục được đặt rõ ràng trong một bối cảnh không được kiểm soát, các luồng tràn xảy ra trong quá trình đánh giá thời gian biên dịch của biểu thức luôn gây ra các lỗi biên dịch thời gian.

Xem thông số kỹ thuật để biết thêm chi tiết.

+0

Công bằng Đủ tuyên bố nên nói "khi chạy" –