2013-04-08 7 views
12

मुझे पता है कि यह परिचित लग रहा है लेकिन यह इंटर्न की भर्ती के लिए माइक्रोसॉफ्ट द्वारा परीक्षण में एक समस्या के रूप में मुझे लाया गया है। मुझे लगता है कि y=++y मानक अनुपालन नहीं है, लेकिन मुझे लगता है कि यह सुनिश्चित करना बेहतर होगा (सुनिश्चित नहीं है कि मैं उन लोगों से बेहतर हूं जो एमएस में इन परीक्षणों को लिखते हैं)। तो मैं आपकी सलाह पूछ रहा हूँ। क्या आपको लगता है कि इस तरह के भाव मानक-अनुरूप हैं और परिणामस्वरूप अपरिभाषित व्यवहार नहीं है?`y = ++ y`, क्या यह मानक अनुपालन है? [जो माइक्रोसॉफ्ट द्वारा एक परीक्षण में दिखाई देता है]

#include <stdio.h> 
int main(){ 
    int a = 10; 
    int b = 10; 
    a = ++a; //What ??? 
    b = b++; //What ??? 
    printf("%d %d\n",a,b); 
    return 0; 
} 

gcc जब -Wsequence-point साथ संकलित करने के लिए प्रयोग किया जाता है इसके बारे में शिकायत। (यह स्पष्ट रूप से कहा गया है न कि क्या यह एक सी या सी ++ विशिष्ट समस्या है।)

लेकिन केवल चार जवाब प्रदान की:

a) 10 10 
b) 11 10 
c) 10 11 
d) 11 11 

एक यद्यपि केवल एक उत्तर चुनें तक ही सीमित नहीं है (इसलिए शायद मैं चुनना चाहिए सभी चार?)

ठीक है, मेरी राय में, आत्म-वृद्धि और असाइनमेंट के बीच कोई अनुक्रम बिंदु नहीं है। तो यह विनिर्देश का उल्लंघन करता है। है ना?

+0

क्या आप अपना उत्तर सी ++ 03 या सी ++ 11 के संदर्भ में चाहते हैं? वे इस सामान के विभिन्न तरीकों से कारण हैं। –

+0

आप सही हैं। यह अपरिभाषित व्यवहार है। – Art

+0

हां, यह यूबी है, लेकिन मैं अभी भी बी उठाऊंगा) उत्तर के रूप में: पी –

उत्तर

9

वे सी ++ 11 के अनुसार दोनों अच्छी तरह से परिभाषित व्यवहार हैं। सी ++ 11 भी में अनुक्रम बिंदु नहीं है, इसलिए अनुक्रम-बिंदु से संबंधित चेतावनी स्पष्ट रूप से पुरानी है। असाइनमेंट ऑपरेटर अपने तर्कों पर अनुक्रमित करता है।

संपादित करें:

हर कोई इस बात से सहमत जबकि कर सकते हैं कि i = ++i अब अच्छी तरह से परिभाषित व्यवहार है, यह नहीं बल्कि i = i++ की definedness तय करने के लिए गैर तुच्छ है।Intuitively, मैं यह वर्णन करना चाहिए के रूप में अच्छी तरह से परिभाषित है, लेकिन मानक स्पष्ट रूप से कहा गया है कि

i = i++ + 1; 

यूबी है, और मैं + 1 यहाँ कोई फर्क नहीं दिखाई दे रही है।

संक्षेप में, यदि आप इस प्रश्न का उत्तर देना चाहते हैं, तो आपको निश्चित रूप से गैर-तुच्छ सी ++ 11 अनुक्रमण नियमों पर एक विशेषज्ञ होने की आवश्यकता होगी, जो ऐसा प्रतीत होता है कि मैं नहीं हूं, लेकिन ऐसा लगता है कि उत्तर "उपर्युक्त में से कोई नहीं है क्योंकि यूबी"।

+0

@DeadMG क्या आप एक अतिरिक्त प्रश्न का उत्तर दे सकते हैं, क्योंकि आपने मूल उत्तर दिया है: क्या परिणाम सी ++ 11 में '11 12' नहीं होना चाहिए? – lapk

+0

नहीं। यह क्यों होगा? और, एक और सवाल पूछो। – Puppy

+0

@DeadMG क्योंकि 'बी = 11; 'और' बी = बी ++;' 'बी' अभी भी' 11' के बराबर है, और हमारे पास पोस्ट-वृद्धि है जो 'print'' में' 12' के बराबर है। क्षमा करें, मुझे नहीं लगता था कि यह एक अलग सवाल के लायक था और मुझे समझ में नहीं आया कि मूल सूची में ऐसी कोई विकल्प क्यों नहीं थी ... शायद, मैं कुछ गलत समझ रहा हूं, बस स्पष्ट करने के लिए सोचा। – lapk

4

प्रति सी ++ 03 मानक के रूप में,
निम्न विवरण के दोनों अपरिभाषित व्यवहार में परिणाम:

:

a = ++a; 
b = b++; 

आप सही तरीके से कहा गया है, जी ++ चेतावनी नीचे बताते हैं चेतावनी: 'ए' पर ऑपरेशन अपरिभाषित हो सकता है [-उत्पादन-बिंदु]

ध्यान दें कि यूबी के मामले में, उत्तर (ए), (बी), (सी), (डी) से अलग कुछ भी हो सकता है।
आदर्श रूप से परीक्षण प्रश्न में "अपरिभाषित व्यवहार" के लिए एक विकल्प होना चाहिए। लेकिन अक्सर, जो व्यक्ति प्रश्न तैयार करता है वह बस एक्सवाईजेड कंपाइलर में संकलित होगा और इसे सबमिट करेगा।

यहां एक संबंधित एसओ पोस्ट है जो Undefined Behavior and Sequence Points समझाती है।

+0

+1 हालांकि मैं संकलक कार्यान्वयन की गुणवत्ता के बारे में शिकायत करता हूं अगर यह इस मामले में राक्षसों को मेरी नाक से बाहर निकलने के लिए कोड जारी करता है। हां, यह मानक-अनुरूप होगा, लेकिन यह अभी भी चूसना होगा। –

+1

'ए = ++ ए; 'सी ++ 11 में यूबी नहीं है। यह सी ++ 03 में यूबी है। –

+2

आप गलत हैं, क्योंकि C++ 11 इसे बदलता है। – Puppy

-4

मुझे लगता है कि यह डी है) क्योंकि ++ का अर्थ बढ़ता है और फिर ऑपरेशन निष्पादित करता है, इसलिए यह एक = 11 करने जैसा होगा। बी ++ का मतलब है ऑपरेशन करें और फिर वृद्धि करें, इसलिए आप बी = 10 असाइन करेंगे लेकिन फिर बी को बढ़ाया जाएगा यह मूल्य बी = 11 दे रहा है।

ठीक है शुद्धवादियों के लिए: इसका मतलब "कुछ और कुछ भी नहीं" है, लेकिन यह व्यवहार है। मैंने इसका परीक्षण किया (दृश्य सी ++ और जी ++ का उपयोग करके) और मेरा जवाब सही है = 11 और बी = 11।

+0

इसका मतलब यह नहीं है कि "कुछ * और फिर * कुछ"। –

+0

ठीक है, मुझे * अनुभवजन्य परिणाम * की आवश्यकता नहीं है। आजकल इस्तेमाल किए जाने वाले लगभग सभी लोकप्रिय कंपाइलर इस व्यवहार को प्रदर्शित करते हैं। लेकिन मैं जानना चाहता हूं कि यह ** आवश्यक है ** ऐसा करने के लिए या सिर्फ एक फ़ॉलबैक विधि जिसे या तो अपनाया जा सकता है या नहीं। – phoeagon

+2

अपरिभाषित व्यवहार "परीक्षण" करना असंभव है, क्योंकि यह अनिर्धारित है और प्रत्येक कार्यान्वयन जो भी वह चाहता है वह कर सकता है। (यह मूल प्रश्न btw परवाह किए बिना है) –

0

ए = ++ ए; बी = बी ++; इन परिचालनों को अनिर्धारित माना जाता है। प्रत्येक कंपाइलर अपनी इच्छा के अनुसार कर सकता है। संकलक पर आउटपुट भिन्न होता है परीक्षक ने सवाल तैयार किया।

संबंधित मुद्दे