2017-10-16 24 views
28

C11 §6.5.7 अनुच्छेद 5:"-1 >> 5;" है सी में अनिश्चित व्यवहार?

E1 >> E2 का परिणाम E1 सही-स्थानांतरित E2 बिट पदों है। यदि E1 एक अहस्ताक्षरित प्रकार है या यदि E1 एक हस्ताक्षरित प्रकार और एक गैर नकारात्मक मान होता है, परिणाम का मूल्य E1/2*^E2 की भागफल के अभिन्न अंग है। यदि E1 पर एक हस्ताक्षरित प्रकार और नकारात्मक मान है, परिणामी मान कार्यान्वयन-परिभाषित है।

लेकिन, viva64 संदर्भ दस्तावेज कहते हैं:

int B; 
B = -1 >> 5; // unspecified behavior 

मैं GCC पर इस कोड को भाग गया और यह हमेशा एक निर्गम -1 दे रहा है।

तो, मानक मान लें कि "E1 एक हस्ताक्षरित प्रकार और एक नकारात्मक मूल्य होता है, तो परिणामस्वरूप मूल्य कार्यान्वयन परिभाषित किया गया है", लेकिन उस दस्तावेज़ का कहना है कि -1>>5;अनिर्दिष्ट व्यवहार है।

तो, -1>>5; सी में अनिर्दिष्ट व्यवहार है? क्या सही है?

+17

तुम इतनी कोड चेकर्स उन्हें इसी तरह का इलाज, पोर्टेबल कोड, के बीच भेद कार्यान्वयन से परिभाषित और अनिर्दिष्ट बहुत महत्वपूर्ण नहीं है लिखने की कोशिश कर रहे हैं। – Barmar

+1

यह कार्यान्वयन-परिभाषित है। – chux

+0

@chux तो, वह दस्तावेज़ गलत है ?? – rsp

उत्तर

33

दोनों सही हैं। कार्यान्वयन परिभाषित व्यवहार एक विशेष प्रकार का अनिर्दिष्ट व्यवहार है।

the C standard की धारा 3.4.1 जो परिभाषित करता है "कार्यान्वयन से परिभाषित व्यवहार" हवाला देते हुए:

कार्यान्वयन से परिभाषित व्यवहार

अनिर्दिष्ट व्यवहार जहां प्रत्येक कार्यान्वयन दस्तावेजों कैसे पसंद किया जाता है

उदाहरण कार्यान्वयन से परिभाषित व्यवहार का एक उदाहरण टी है जब उच्च हस्ताक्षरित पूर्णांक को स्थानांतरित किया जाता है तो वह उच्च-आदेश बिट का प्रसार करता है।

खंड 3.4.4 से

"अनिर्दिष्ट व्यवहार" को परिभाषित करने:

अनिर्दिष्ट व्यवहार एक अनिर्दिष्ट मूल्य की

उपयोग या अन्य व्यवहार जहां इस अंतर्राष्ट्रीय मानक दो प्रदान करता है या अधिक संभावनाएं और लागू करता है जिस पर कोई और आवश्यकता नहीं है जिस पर किसी भी उदाहरण

उदाहरण अनिर्दिष्ट व्यवहार का एक उदाहरण वह क्रम है जिसमें किसी फ़ंक्शन के तर्कों का मूल्यांकन किया जाता है।

जीसीसी के लिए, आपको हमेशा वही उत्तर मिल जाएगा क्योंकि ऑपरेशन कार्यान्वित किया गया है।

पर हस्ताक्षर किए पूर्णांकों पर कुछ बिटवाइज़ आपरेशन के परिणामों (C90 6.3, C99 और सी 11 6.5): यह संकेत विस्तार

के माध्यम से नकारात्मक संख्या का सही पारी GCC documentation से लागू करता है। जहां से साइन बिट सर्वाधिक महत्व मूल्य थोड़ा ऊपर तुरंत माना जाता है दोनों हस्ताक्षर और मूल्य बिट्स सहित मूल्य, के प्रतिनिधित्व पर

बिटवाइज़ ऑपरेटर्स काम करते हैं। हस्ताक्षर >> साइन एक्सटेंशन द्वारा नकारात्मक संख्याओं पर कार्य करता है।

सी भाषा के लिए एक विस्तार के रूप में, जीसीसी अक्षांश C99 और सी 11 में दिया उपयोग नहीं करता है केवल हस्ताक्षर किए << के रूप में अपरिभाषित के कुछ पहलुओं के इलाज के लिए। हालांकि, -fsanitize=shift (और -fsanitize=undefined) ऐसे मामलों का निदान करेंगे। उन्हें निदान भी किया जाता है जहां स्थिर अभिव्यक्तियों की आवश्यकता होती है।

+1

यह बिल्कुल सही नहीं है: "कार्यान्वयन परिभाषित व्यवहार एक विशेष प्रकार का अनिर्दिष्ट व्यवहार है"। यदि कोई व्यवहार कार्यान्वयन-परिभाषित किया गया है, तो मानक यह निर्दिष्ट कर रहा है कि कार्यान्वयन को परिभाषित करना और दस्तावेज करना चाहिए, इसलिए यह निर्दिष्ट नहीं है। अनिर्दिष्ट व्यवहार उन परिस्थितियों के लिए है जहां कार्यान्वयन चुनने के लिए स्वतंत्र है लेकिन किसी व्यवहार को दस्तावेज करने या इसे सुसंगत बनाने की आवश्यकता नहीं है। –

+7

@ आर .. "कार्यान्वयन-परिभाषित व्यवहार" की परिभाषा को छोड़कर वास्तव में सटीक शब्द "अनिर्दिष्ट व्यवहार" का उपयोग करता है। मुझे लगता है कि प्रलेखन की आवश्यकता है जिसे "आगे की आवश्यकताएं चुना गया है" को लागू नहीं किया जाता है। – aschepler

+1

मैं "कार्यान्वयन-परिभाषित व्यवहार" की परिभाषा की व्याख्या करता हूं जिसे आपने "अनिर्दिष्ट व्यवहार" के अनन्य के रूप में उद्धृत किया है, यानी "अनिश्चित व्यवहार के लिए, बल्कि इस आवश्यकता के साथ"। आखिरकार, "अनिर्दिष्ट व्यवहार" की परिभाषा में "किसी और आवश्यकता को लागू नहीं किया गया है" शामिल है, हालांकि कार्यान्वयन-परिभाषित व्यवहार एक आवश्यकता को लागू करता है जो कार्यान्वयन दस्तावेज पसंद करता है, इसलिए यह "अनिर्दिष्ट व्यवहार" की परिभाषा को पूरा नहीं करता है –

12

"निर्दिष्ट व्यवहार" और "कार्यान्वयन परिभाषित" विरोधाभासी नहीं है। इसका मतलब यह है कि सी मानक निर्दिष्ट नहीं करता है कि क्या होने की आवश्यकता है, और विभिन्न कार्यान्वयन वे "सही" मान सकते हैं।

एक संकलक पर चल रहा है इसे कई बार और एक ही परिणाम हो रही है केवल इसका मतलब है कि विशेष संकलक-सा है। आप एक अलग संकलक पर अलग-अलग परिणाम प्राप्त कर सकते हैं।

+1

न तो शब्द दूसरे का उप-समूह है। यदि कोई कार्रवाई "अनिर्दिष्ट" व्यवहार का आह्वान करती है, तो विकल्पों के सीमित सेट (उदा।'x() + y()' व्यवहार करना चाहिए जैसे कि यह या तो 'x() 'का पूर्ण मूल्यांकन करता है और फिर' y() ', या पूरी तरह से' y() 'या फिर' x() 'का मूल्यांकन करता है; वे केवल दो विकल्प हैं)। यदि कोई कार्रवाई "कार्यान्वयन-परिभाषित" व्यवहार का आह्वान करती है, तो एक विशिष्ट व्यवहार को दस्तावेज करने के लिए कार्यान्वयन की आवश्यकता होती है, लेकिन जब तक वे इसे दस्तावेज़ करते हैं, तब तक वे जो कुछ भी पसंद करते हैं, उसके बारे में कुछ भी कर सकते हैं। – supercat

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