2014-09-22 12 views
8

एक दोस्त ने मुझसे कहता है कि बाद:`सी == सी ++ 'अपरिभाषित व्यवहार है?

int C = anything; 

C == C++ मूल्य true होगा। यह एक मजाक के रूप में है, दावा किया गया है कि "सी ++ के समान नहीं है"।

हालांकि, == एक अनुक्रम बिंदु नहीं है, इसलिए मैं तर्क देता हूं कि यह वास्तव में अपरिभाषित व्यवहार है। कार्यक्रम पहले C++ का मूल्यांकन कर सकता है, ताकि C > C++ और C == C++ दोनों अनिर्धारित हैं। हालांकि, C >= C++ हमेशा सत्य के रूप में मूल्यांकन करेगा। वही, ज़ाहिर है, जब ऑपरेंड फ़्लिप होते हैं तो सत्य होता है (C++ <= C हमेशा सत्य होता है और बाकी सब कुछ अपरिभाषित होता है)।

क्या यह विश्लेषण सही है?

+5

सभी 'सी == सी ++', 'सी> = सी ++', आदि, अनिर्धारित हैं। –

+0

[इसे आज़माएं] (http://ideone.com/eknvOx) दिखाता है कि कम से कम विशिष्ट कंपाइलर संस्करण और सेटिंग्स के साथ आइडिया वर्तमान में उपयोग कर रहा है, परिणाम गलत साबित होता है। – user2357112

+0

चेतावनी इसे स्पष्ट बताती है: http://coliru.stacked-crooked.com/a/1125dd5ddf7c41f9 – Csq

उत्तर

13

सभी मामलों undefined behavior और अप्रत्याशित परिणाम के लिए नेतृत्व: में संकलन

#include <iostream> 

int main() 
{ 
    int C = 0; 
    if (C == C++) { 
    ... 

का परिणाम है।

draft C++11 standard हमें बताता है कि जब तक अन्यथा ऑपरेंड के मूल्यांकन के आदेश में कहा गया है unsequenced हैं और अगर एक ही अदिश वस्तु unseqeucend साइड इफेक्ट से हम व्यवहार अपरिभाषित है के द्वारा और अधिक है कि एक बार संशोधित किया गया है। यह भी अपरिभाषित है अगर हमें ऑब्जेक्ट को संशोधित करने की आवश्यकता है और ऑब्जेक्ट के मान को किसी अन्य ऑपरेंड के लिए गणना करना है। यह मसौदा सी ++ 11 मानक खंड 1.9

अपवाद का उल्लेख नहीं, अलग-अलग ऑपरेटरों की और व्यक्तिगत अभिव्यक्ति के subexpressions की ऑपरेंड के मूल्यांकन unsequenced हैं में शामिल है। [ नोट: एक अभिव्यक्ति में जिसे प्रोग्राम के निष्पादन के दौरान एक से अधिक बार मूल्यांकन किया गया है, इसके परिणामस्वरूप अपने उप-अभिव्यक्तियों के मूल्यांकनों को अलग-अलग मूल्यांकनों में लगातार निष्पादित करने की आवश्यकता नहीं है। -जेंड नोट] ऑपरेटर के परिणाम ऑपरेटर के संचालन के मूल्य गणना के मान गणना के समक्ष अनुक्रमित हैं। यदि स्केलर ऑब्जेक्ट पर साइड इफेक्ट समान स्केलर ऑब्जेक्ट या किसी अन्य स्केलर ऑब्जेक्ट के मान का उपयोग करके मूल्य गणना के किसी भी दुष्प्रभाव के विपरीत नहीं है, तो व्यवहार अपरिभाषित है।

न तो समानता ऑपरेटर या वर्गों 5.9संबंधपरक ऑपरेटरों और 5.10समानता ऑपरेटरों में संबंधपरक ऑपरेटर ऑपरेंड के लिए एक अनुक्रमण निर्दिष्ट करें।

warning: unsequenced modification and access to 'C' [-Wunsequenced] 
    if(C == C++) 
     ~ ^

यह भी सी ++ 03 के साथ में अपरिभाषित व्यवहार है:

clang भी इस मामले के लिए एक चेतावनी प्रदान करता है, यह डिफ़ॉल्ट रूप से की तरह दिखता है, लेकिन यह निम्न (see it live) करने के लिए कुछ इसी तरह होना चाहिए अनुक्रमित संबंधों की अवधारणा का उपयोग नहीं किया लेकिन केवल sequence points। मसौदा सी ++ 03 मानक के प्रासंगिक अनुभागों होगा Chapter 5भाव जो कहते हैं:

जहां बताया गया है, अलग-अलग ऑपरेटरों और व्यक्तिगत अभिव्यक्ति के subexpressions की ऑपरेंड के मूल्यांकन के आदेश को छोड़कर, और व्यवस्था जिसमें साइड इफेक्ट्स होते हैं, अनिर्दिष्ट है .7) के बीच पिछले और अगले अनुक्रम बिंदु एक स्केलर ऑब्जेक्ट को मान को अभिव्यक्ति के मूल्यांकन द्वारा सबसे अधिक बार संशोधित किया जाएगा। इसके अलावा, पूर्व मान को संग्रहीत करने के लिए केवल मान निर्धारित करने के लिए उपयोग किया जाएगा। इस पैराग्राफ की आवश्यकताओं को पूर्ण अभिव्यक्ति के उप-अभिव्यक्तियों के प्रत्येक स्वीकार्य क्रम के लिए से मुलाकात की जाएगी; अन्यथा व्यवहार अपरिभाषित है।

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

1

आप सही हैं। यहां तक ​​कि संकलक तो कहते हैं:

main.cpp: In function 'int main()': 
main.cpp:6:17: warning: operation on 'C' may be undefined [-Wsequence-point] 
    if (C == C++) { 
       ^

(Coliru)

+0

यह एक संकलक (और सेटिंग्स के समूह) के लिए सच हो सकता है। मानक में कोई आवश्यकता नहीं है कि संकलक इसका निदान करते हैं। और कई कंपाइलर्स नहीं करते हैं। – Peter

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