कौन से नंबर इस फंक्शन को क्रैश करेंगे?


10

X और y के कौन से मान कुछ C संकलक के साथ दुर्घटना का कारण बनेंगे?

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

चूंकि C के टर्नरी ऑपरेटर शॉर्टकट हैं, मैं कहूंगा कि कोई भी नहीं होगा। यह सवाल इस साइट के लिए प्रारूप को फिट नहीं करता है, जो कार्यक्रम पहेली और कोड गोल्फ पर केंद्रित है। विवरण के लिए faq देखें codegolf.stackexchange.com/faq
स्टीवन रंबलस्की

यह कोड गोल्फ नहीं है, लेकिन एक पहेली है। एक उत्तर है, और यह केवल कुछ संख्या है।
बदसूरत

मुझे सही साबित होना है।
स्टीवन रंबलस्की

2
दरअसल, K & R पुस्तक को देखते हुए, यह फ़ंक्शन वास्तव में कभी भी क्रैश नहीं होना चाहिए। लेकिन एएनएसआई सी मानक द्वारा, विशेष दुर्घटनाग्रस्त मामले में व्यवहार अपरिभाषित है, और x86 संकलक के साथ यह दुर्घटनाग्रस्त हो जाता है।
बदसूरत

1
यदि आप सही जवाब देते हैं, तो आप विजेता हैं। क्या क्रिटिरियन अधिक स्पष्ट और उद्देश्यपूर्ण हो सकता है? केवल एक ही उत्तर है (या क्या आपके पास एक और उदाहरण है?)
१२'१२ पर १०:१०

जवाबों:


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 एक वैध पूर्णांक नहीं है।
बदसूरत

1
हां, इसीलिए मैंने INT_MIN का इस्तेमाल किया, एक वैध इंट का उपयोग करने के लिए। मुझे लगता है कि इसका कारण 2147483648 है, जो वैध नहीं है, क्योंकि INT_MAX 2 ^ 31-1 है जिसमें 32-बिट इंट है।
ेरेगॉन

आह। दो का अनुपूरण। मैंने यह खो दिया।
स्टीवन रंबलस्की

हां, इसे INT_MIN (जो -2147483648 है) के साथ सफाई से संकलित करना चाहिए।
बदसूरत

3

सही उत्तर पहले से ही दिया गया है, लेकिन मैंने तुरंत Microsoft Pex के बारे में सोचा ।

Pex स्वचालित रूप से उच्च कोड कवरेज के साथ टेस्ट सूट बनाता है। विज़ुअल स्टूडियो कोड संपादक से राइट, Pex को आपके तरीकों के दिलचस्प इनपुट-आउटपुट मान मिलते हैं, जिन्हें आप एक छोटे टेस्ट सूट के रूप में अन्य कोड कवरेज के साथ बचा सकते हैं। Microsoft Pex .NET फ्रेमवर्क अनुप्रयोगों के परीक्षण के लिए एक विजुअल स्टूडियो ऐड-इन है

सैंडबॉक्स साइट में अपनी पहेली को जोड़ने के बाद , यह कुछ ही सेकंड में जवाब पाता है, वही eregons उत्तर। (pex से पूछें क्लिक करें)

नोट: यह इसे C # में करता है, लेकिन भाषा वास्तव में प्रासंगिक नहीं है।

  • x: int.MinValue
  • y: -1
  • अपवाद: अतिप्रवाह। अपवाद
  • संदेश: अंकगणितीय ऑपरेशन के परिणामस्वरूप अतिप्रवाह हुआ।

1
अच्छा लगा। यह निश्चित रूप से जानवर को मजबूर नहीं करता है, क्योंकि यह कुछ सेकंड में समाप्त नहीं होगा। मुझे लगता है कि एमएस में किसी को एहसास हुआ कि 0 और MAX_INT के आसपास की संख्या हमेशा दिलचस्प होती है।
बदसूरत

उम्मीद है कि यह उससे थोड़ा अधिक चतुर है। यह देख सकते हैं (x/y)और जानते हैं कि INT_MIN, आदि -1, 0उस अभिव्यक्ति के लिए सभी समस्या के मामले हैं, और मूल्यांकन के समय उन मूल्यों का उत्पादन करने के लिए एक तरह से इंजीनियर को उलटने की कोशिश करते हैं।
क्लूलेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.