2010-09-25 19 views
6
#include <iostream> 
using namespace std; 

void f(int x, int y){ 

     cout << "x is " << x << endl; 
     cout << "y is " << y << endl; 
} 



int main(){ 

     int i = 7; 
     f(i--,i--); 
     cout << i << endl<< endl; 
} 

में घटती हम कार्यक्रम की उम्मीद मुद्रित करने के लिएपोस्ट और पूर्व वेतन वृद्धि, C++

लेकिन कार्यक्रम मुद्रित "x 6 \ ny 7 \ है" x 7 \ ny 6 \ नी 5 है कि " एनआई 5 "

उत्तर

11

f(i--,i--);Undefined Behaviour को आमंत्रित करता है। ऐसे कोड मत लिखो।

संपादित: ऊपर अभिव्यक्ति में

कॉमा , वर्तमान Comma operator नहीं है। यह केवल तर्कों को अलग करने के लिए एक विभाजक है (और जो अनुक्रम बिंदु नहीं है।)

इसके अलावा किसी फ़ंक्शन के तर्कों के मूल्यांकन का क्रम निर्दिष्ट नहीं है लेकिन अभिव्यक्ति अपरिभाषित व्यवहार का आह्वान करती है क्योंकि आप i को दो बार संशोधित करने का प्रयास कर रहे हैं दो अनुक्रम अंक।

उफ मैं थक गया हूँ। :(

+0

पूरी तरह से सहमत हैं। {12, 10} एक ही कथन में दो बार क्रिएट ऑपरेटर का उपयोग करना बहुत बुरा है। – Benoit

+1

@Downvoter: उत्तर बिल्कुल सही है। कृपया अपना डाउनवोट समझाएं। –

+0

@ स्विसस्टैक: ',' फ़ंक्शन कॉल में मौजूद 'अल्पविराम ऑपरेटर' नहीं है, यह केवल एक विभाजक है और यह अनुक्रम बिंदु नहीं है। –

2

यह आपको बताता है कि पैरामीटर का मूल्यांकन दाएं से बाएं से किया जा रहा है, उम्मीद के अनुसार बाएं से दाएं नहीं। यह कॉलिंग सम्मेलन या अन्यथा के कारण हो सकता है, लेकिन यह आमतौर पर एक बुरा विचार होगा फ़ंक्शन पैरामीटर मूल्यांकन के क्रम पर भरोसा करने के लिए।

+0

यह कॉलिंग सम्मेलन है, तर्क दाएं से बाएं धक्का दिया जाता है स्टैक पर – Aillyn

+0

@ ऐलीन: WRONG। वे हो सकते हैं कि यह आपके कंपाइलर के लिए कैसे काम करता है लेकिन यह वास्तव में मानक में परिभाषित नहीं है। कौन कहता है कि पैरामीटर कॉल के लिए स्टैक पर पैरामीटर भी लगाए जाते हैं। (यदि यह सी था तो आप अधिक सही हो सकते हैं लेकिन यह सी ++ है और एबीआई अनिर्धारित है (जानबूझकर))। –

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