2010-06-24 65 views
11

Tôi có vòng lặp cho phép tăng giá trị số nguyên cho đến khi vòng lặp hoàn tất. Vì vậy, nếu giới hạn n là một biến kép và biến tăng dần 'i' là một số nguyên, tôi được tăng lên vượt quá giới hạn của nó.Tăng giá trị số nguyên vượt quá giới hạn số nguyên của nó - C#

double total = 0; 
double number = hugetValue; 
for (int i = 1; i <= number; i++) 
{ 
    total = total + i; 
} 
return total; 

Điều gì sẽ xảy ra với 'i' nếu nó vượt quá khả năng của nó? Giá trị của i thay đổi như thế nào? Tôi sẽ nhận được một lỗi thời gian chạy?

Cảm ơn

TVQGVN

+1

Ngôn ngữ nào? – sharptooth

+0

Đã chỉnh sửa tiêu đề. – NLV

+1

Tôi đã thêm thẻ C# vào câu hỏi. Đối với một số người (có nghĩa là, ít nhất là đối với tôi) đó là hữu ích hơn. SO cho phép bạn lọc vào/ra dựa trên thẻ và bạn có thể nhận danh sách câu hỏi dựa trên thẻ. Hầu hết thời gian tôi chỉ xem xét các thẻ cụ thể mà tôi quan tâm và chỉ mỗi thẻ thường xuyên tôi nhận được danh sách các câu hỏi gần đây nhất bất kể thẻ. –

Trả lời

8

Tương tự như hành vi trong một số ý nghĩa của C trong đó int chỉ kết thúc tốt đẹp từ INT_MAX đến INT_MIN (mặc dù nó thực sự không xác định hành vi theo tiêu chuẩn ISO), C# cũng kết thúc tốt đẹp. Thử nghiệm nó trong VS2008 với:

int x = 2147483647; 
if (x+1 < x) { 
    MessageBox.Show("It wrapped..."); 
} 

sẽ dẫn đến việc đóng hộp thư.

Nếu hugetValue của bạn lớn hơn giá trị tối đa int, thì vòng lặp của bạn sẽ chạy vĩnh viễn vì điều này.

Ví dụ, nếu nó 2147483648, cũng giống như bạn nghĩ rằng bạn đang nhận được gần nó, int kết thúc tốt đẹp xung quanh từ 2147483647 trở lại -2147483648 và vòng lặp chỉ cần giữ trên đi.

+0

Tôi đã viết trong C#. Xin lỗi vì đã không nhắc đến điều đó. Tôi dint hiểu câu trả lời của bạn. – NLV

+0

@NLV: Một số thay cho C#. – leppie

+0

@NLV: Tôi đã chỉnh sửa câu hỏi để bao gồm thẻ C#. Lưu ý rằng trong nhiều câu hỏi ngôn ngữ là quan trọng (một số cho phép chuyển đổi có ý nghĩa, một số sẽ không cho phép nó tại thời gian biên dịch). Khi đặt câu hỏi, bạn càng cung cấp thêm thông tin - với điều kiện hợp lý-- thì càng tốt. –

3

Xin lỗi nếu điều này dường như thô lỗ, nhưng bạn sẽ tìm hiểu xa hơn bằng cách cố gắng này bản thân.

Đã chỉnh sửa: aha, vì vậy bạn đã thử và có kết quả không mong muốn. Như đã được giải thích ở nơi khác ngôn ngữ C-như có xu hướng lặng lẽ quấn số học số nguyên. Đó thực sự là một hành vi khá hợp lý nói chung nếu chi phí kiểm tra tràn là cao. Một khi bạn biết rằng điều này có thể xảy ra một mã một cách cẩn thận, đặc biệt là xem cho các loại xây dựng trong ví dụ của bạn.

+0

Mất nó theo đúng nghĩa. Tôi thực sự đã thử nó và bị mắc kẹt trong một vòng lặp vô hạn. Khi tôi gỡ lỗi nó, tôi thấy giá trị của i là âm. Tôi đã tự hỏi tại sao nó dint ném một lỗi và thay vào đó là tiếp tục vòng lặp. Có lý do gì không? – NLV

+0

Có hai vấn đề khác nhau ở đây, tại sao chuyển đổi mang lại số âm và tại sao trình biên dịch không phàn nàn về điều kiện của giá trị là số âm. Mới nhất là đơn giản hơn: bạn có thể sửa đổi biến vòng lặp bên trong vòng lặp và biến nó thành tiêu cực. Phát hiện nếu điều này xảy ra hay không là một vấn đề quá phức tạp đối với trình biên dịch, vì vậy nó chỉ giả định rằng bạn biết những gì bạn muốn (hoặc bạn sẽ tìm thấy đủ sớm khi bạn bị mắc kẹt trong vòng lặp vô hạn) –

2

Nếu bạn muốn ngoại lệ, hãy cung cấp tùy chọn biên dịch checked hoặc sử dụng cấu trúc checked được cung cấp trong C#.

+0

Chỉ cần trích dẫn một nguồn: http://msdn.microsoft.com/en-us/library/a569z7k8.aspx Về cơ bản tất cả các op được bỏ chọn, trừ khi bạn đang sử dụng hằng số trên cả hai mặt - chúng được kiểm tra tại thời gian biên dịch. –

Các vấn đề liên quan