Những số nào sẽ phá vỡ chức năng này?


10

Giá trị nào của x và y sẽ gây ra sự cố với một số trình biên dịch C?

int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}

Vì các phím tắt toán tử tạm thời của C, tôi sẽ nói không có gì. Câu hỏi này dường như không phù hợp với định dạng cho trang web này, vốn tập trung vào các câu đố chương trình và mã golf. Xem faq để biết chi tiết codegolf.stackexchange.com/faq .
Steven Rumbalski

Đây không phải là mã golf, nhưng là một câu đố. Có một câu trả lời, và đó chỉ là một vài con số.
ugoren

Tôi đứng sửa.
Steven Rumbalski

2
Trên thực tế, đánh giá bởi cuốn sách K & R, chức năng này thực sự không bao giờ bị sụp đổ. Nhưng theo tiêu chuẩn ANSI C, hành vi trong trường hợp sự cố cụ thể không được xác định và với trình biên dịch x86, nó gặp sự cố.
xấu xí

1
@dmckee, Nếu bạn trả lời đúng, bạn là người chiến thắng. Những gì cretirion có thể rõ ràng và khách quan hơn? Chỉ có một câu trả lời (hoặc bạn có một ví dụ khác không?)
ugoren

Câu trả lời:


7

-2147483648 (INT_MIN) và -1

#include <stdio.h>
#include <limits.h>
int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}
int main() {
    int r = f(INT_MIN, -1);
    printf("%d\n", r);
    return 0;
}

$ gcc -Wall Division.c && ./a.out # => zsh: ngoại lệ điểm nổi ./a.out


Thật. Mặc dù điều này sẽ đưa ra cảnh báo, bởi vì 2147483648 không phải là số nguyên hợp lệ.
xấu xí

1
Có, đó là lý do tại sao tôi sử dụng INT_MIN sau đó, để sử dụng số nguyên hợp lệ. Tôi đoán lý do là 2147483648 không phải là int hợp lệ, vì INT_MAX là 2 ^ 31-1 với int 32 bit.
eregon

Ah. Bổ sung của hai. Tôi bỏ lỡ điều đó.
Steven Rumbalski

Có, nó nên biên dịch sạch với INT_MIN (đó là -2147483648).
xấu xí

3

Câu trả lời đúng đã được đưa ra, nhưng tôi nghĩ ngay đến Microsoft Pex .

Pex tự động tạo ra các bộ thử nghiệm với độ bao phủ mã cao. Ngay từ trình chỉnh sửa mã Visual Studio, Pex tìm thấy các giá trị đầu vào-đầu ra thú vị của các phương thức của bạn, mà bạn có thể lưu dưới dạng một bộ thử nghiệm nhỏ với độ bao phủ mã cao. Microsoft Pex là một bổ trợ Visual Studio để thử nghiệm các ứng dụng .NET Framework

Sau khi thêm câu đố của bạn vào trang web hộp cát, nó sẽ tìm thấy câu trả lời trong vài giây, giống như câu trả lời của eregons. (bấm hỏi pex)

Lưu ý: nó thực hiện bằng C #, nhưng ngôn ngữ không thực sự phù hợp.

  • x: int.MinValue
  • y: -1
  • Ngoại lệ: OverflowException
  • Thông báo: Hoạt động số học dẫn đến tràn.

1
Đẹp. Nó chắc chắn không vũ phu, bởi vì nó sẽ không kết thúc sau vài giây. Tôi đoán ai đó trong MS nhận ra rằng các số khoảng 0 và MAX_INT luôn thú vị.
ugoren

Hy vọng rằng nó thông minh hơn một chút. Nó có thể nhìn vào (x/y)và biết rằng INT_MIN, -1, 0vv là tất cả các trường hợp vấn đề đối với biểu hiện đó, và cố gắng thiết kế đối chiếu một cách để tạo ra những giá trị tại thời điểm đánh giá.
Cluless
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.