इस विषय पर निम्नलिखित विषय की अगली कड़ी पर विचार करें:
पिछली किस्त
अपरिभाषित व्यवहार और अनुक्रम बिंदु
आइए इस मज़ेदार और जटिल अभिव्यक्ति को फिर से देखें (इटैलिक किए गए वाक्यांश उपरोक्त विषय * मुस्कान * से लिए गए हैं):
i += ++i;
हम कहते हैं कि यह अपरिभाषित व्यवहार को आमंत्रित करता है। मुझे लगता है कि जब यह कहते हैं, हम परोक्ष कि मान प्रकार का i
बिल्ट-इन प्रकारों में से एक है।
क्या होगा यदि प्रकार के i
उपयोगकर्ता-निर्धारित प्रकार है? इसका प्रकार कहें Index
जो इस पोस्ट में बाद में परिभाषित किया गया है (नीचे देखें)। क्या यह अभी भी अपरिभाषित व्यवहार को लागू करेगा?
यदि हाँ, तो क्यों? क्या यह लेखन के बराबर नहीं है i.operator+=(i.operator++());
या यहां तक कि वाक्य-रचना भी सरल है i.add(i.inc());
? या, क्या वे भी अपरिभाषित व्यवहार करते हैं?
यदि नहीं, तो क्यों नहीं? आखिरकार, ऑब्जेक्ट लगातार अनुक्रम बिंदुओं के बीच दो बारi
संशोधित हो जाता है । कृपया अंगूठे के नियम को याद रखें: एक अभिव्यक्ति लगातार "अनुक्रम बिंदुओं के बीच केवल एक बार एक वस्तु के मूल्य को संशोधित कर सकती है । और यदि एक अभिव्यक्ति है, तो उसे अपरिभाषित व्यवहार को आमंत्रित करना चाहिए। यदि ऐसा है, तो इसके समकक्षों और अपरिभाषित व्यवहार को भी आमंत्रित करना चाहिए। असत्य लगता है! (जहाँ तक मैं समझता हूँ)i += ++i
i.operator+=(i.operator++());
i.add(i.inc());
या, शुरू करने के लिए i += ++i
एक अभिव्यक्ति नहीं है ? यदि हां, तो यह क्या है और अभिव्यक्ति की परिभाषा क्या है ?
यदि यह एक अभिव्यक्ति है, और एक ही समय में, इसका व्यवहार भी अच्छी तरह से परिभाषित है, तो इसका मतलब है कि किसी अभिव्यक्ति से जुड़े अनुक्रम बिंदुओं की संख्या अभिव्यक्ति में शामिल ऑपरेंड के प्रकार पर निर्भर करती है । क्या मैं सही हूं (आंशिक रूप से भी)?
वैसे, इस अभिव्यक्ति के बारे में कैसे?
//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the subscript operator!
a[++i] = i; //Taken from the previous topic. But here type of `i` is Index.
आपको अपनी प्रतिक्रिया में भी इस पर विचार करना चाहिए (यदि आप इसके व्यवहार को जानते हैं)। :-)
है
++++++i;
C ++ 03 में अच्छी तरह से परिभाषित? आखिरकार, यह यह है,
((i.operator++()).operator++()).operator++();
class Index
{
int state;
public:
Index(int s) : state(s) {}
Index& operator++()
{
state++;
return *this;
}
Index& operator+=(const Index & index)
{
state+= index.state;
return *this;
}
operator int()
{
return state;
}
Index & add(const Index & index)
{
state += index.state;
return *this;
}
Index & inc()
{
state++;
return *this;
}
};