หมายเลขใดที่จะผิดพลาดของฟังก์ชันนี้


10

ค่าใดของ x และ y ที่จะทำให้เกิดปัญหากับคอมไพเลอร์ C บางตัว?

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

ตั้งแต่ทางลัดของโอเปอเรเตอร์ตัวที่สามของ C ฉันจะบอกว่าไม่มีใคร คำถามนี้ดูเหมือนจะไม่เหมาะกับรูปแบบสำหรับไซต์นี้ซึ่งมุ่งเน้นไปที่การไขปริศนาโปรแกรมและการตีกอล์ฟ คำถามที่พบบ่อยสำหรับรายละเอียดcodegolf.stackexchange.com/faq
Steven Rumbalski

นี่ไม่ใช่รหัสกอล์ฟ แต่เป็นปริศนา มีคำตอบและมันก็แค่ตัวเลขสองสามตัว
ugoren

ฉันยืนแก้ไขแล้ว
Steven Rumbalski

2
ที่จริงแล้วตัดสินโดยหนังสือ K&R ฟังก์ชั่นนี้จะต้องไม่ผิดพลาดจริงๆ แต่ตามมาตรฐาน ANSI C พฤติกรรมในกรณีขัดข้องโดยเฉพาะนั้นไม่ได้กำหนดไว้และด้วยคอมไพเลอร์ x86 มันจึงขัดข้อง
ugoren

1
@dmckee หากคุณตอบคำถามถูกคุณเป็นผู้ชนะ cretirion อะไรที่ชัดเจนและมีวัตถุประสงค์มากขึ้น? มีเพียงหนึ่งคำตอบ (หรือคุณมีตัวอย่างอื่น?)
ugoren

คำตอบ:


7

-2147483648 (INT_MIN) และ -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: ข้อยกเว้นจุดลอยตัว. /a.out


จริง แม้ว่านี่จะเป็นคำเตือนเพราะ 2147483648 ไม่ใช่จำนวนเต็มที่ถูกต้อง
ugoren

1
ใช่นั่นคือสาเหตุที่ฉันใช้ INT_MIN หลังจากนั้นเพื่อใช้ int ที่ถูกต้อง ฉันเดาว่าเหตุผลคือ 2147483648 ไม่ใช่ int ที่ถูกต้องเนื่องจาก INT_MAX คือ 2 ^ 31-1 พร้อม int 32- บิต
eregon

อา. ส่วนประกอบสองอย่าง ฉันคิดถึงสิ่งนั้น
Steven Rumbalski

ใช่ควรรวบรวมอย่างสะอาดด้วย INT_MIN (ซึ่งคือ -2147483648)
ugoren

3

คำตอบที่เหมาะสมจะได้รับแล้ว แต่ฉันทันทีคิดเกี่ยวกับไมโครซอฟท์ Pex

Pex จะสร้างชุดการทดสอบโดยอัตโนมัติพร้อมการครอบคลุมโค้ดสูง จากตัวแก้ไขรหัส Visual Studio Pex ค้นหาค่าอินพุตและเอาต์พุตที่น่าสนใจสำหรับวิธีการของคุณซึ่งคุณสามารถบันทึกเป็นชุดทดสอบขนาดเล็กที่มีการครอบคลุมโค้ดสูง Microsoft Pex เป็น Add-in ของ Visual Studio สำหรับการทดสอบแอปพลิเคชัน. NET Framework

หลังจากเพิ่มตัวต่อในไซต์แซนด์บ็อกซ์มันจะพบคำตอบในไม่กี่วินาทีเช่นเดียวกับคำตอบ eregons (คลิกถาม pex)

หมายเหตุ: ใช้ใน C # แต่ภาษานั้นไม่เกี่ยวข้องเลย

  • x: int.MinValue
  • y: -1
  • ข้อยกเว้น: OverflowException
  • ข้อความ: การดำเนินการทางคณิตศาสตร์ส่งผลให้เกิดโอเวอร์โฟลว์

1
ดี มันไม่ได้ดุร้ายเพราะมันจะไม่จบภายในไม่กี่วินาที ฉันเดาว่ามีใครบางคนใน MS ตระหนักดีว่าตัวเลขประมาณ 0 และ MAX_INT นั้นน่าสนใจเสมอ
ugoren

หวังว่ามันจะฉลาดกว่านี้อีกเล็กน้อย มันอาจจะดู(x/y)และรู้ว่าINT_MIN, -1, 0ฯลฯ เป็นทุกกรณีปัญหาสำหรับแสดงออกและพยายามที่จะทำวิศวกรรมย้อนกลับวิธีการผลิตค่าเหล่านั้นในช่วงเวลาของการประเมินผลการ
Clueless
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.