2012-02-24 11 views
5

अगर मैं निम्नलिखित अभिव्यक्ति है:आदेश

c = (a) * (b) 

क्या C90 मानक उपसूचक 'एक' और 'बी' के आदेश मूल्यांकन के बारे में कहना है?

+8

[कुछ भी नहीं) (http://en.wikipedia.org/wiki/Unspecified_behavior) :) :) :) :) – dasblinkenlight

+0

होमवर्क सवालों के लिए होमवर्क टैग की आवश्यकता होती है। –

+2

@Robert: मुझे नहीं लगता कि कोई भी इसे अपने होमवर्क में पूछता है ... – Bruce

उत्तर

11

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

उदाहरण के लिए:

int a=5; 
int b = (a++) * (a++); //<== Don't do this!! 

आप सी के लिए अनुक्रम अंक की एक पूर्ण सूची चाहते हैं, आप एक more thorough reference here की जाँच कर सकते हैं।

+0

या, बेहतर, एक एसओ खोज। – smparkes

+2

@ ब्रूस: एएनएसआई सी ड्राफ्ट http://flash-gordon.me.uk/ansi.c.txt, अनुबंध ए.2 – Christoph

+0

देखें आपका उदाहरण वास्तव में गलत कोड दिखाता है, लेकिन मूल्यांकन आदेश के कारण नहीं। जाहिर है, यह महत्वहीन है कि पहले 'ए ++' का मूल्यांकन किया जाता है। – ugoren

3

* बाइनरी ऑपरेटर के संचालन का मूल्यांकन आदेश C90 में निर्दिष्ट नहीं है।

यहाँ C90 स्टैंडर्ड से प्रासंगिक पैरा (प्रश्न C90 के बारे में पूछा के रूप में) है:

(C90, 6.3) "के रूप में वाक्य रचना ने संकेत दिया है या नहीं तो बाद में निर्दिष्ट (सिवाय समारोह-कॉल के लिए ऑपरेटर(), & &, ||,:।, और अल्पविराम ऑपरेटर) subexpressions के मूल्यांकन के आदेश और जिस क्रम में साइड इफेक्ट जगह ले दोनों unspecitied रहे हैं "

* ऑपरेटर के लिए, यदि हम साइड-इफेक्ट ऑपरेंड के साथ उदाहरण लें:

c = f() * g(); 

कार्यान्वयन f() पहले या g() पहले कॉल कर सकते हैं:

a = f(); 
b = g(); 
c = a * b; 

या

a = g(); 
b = f(); 
c = a * b; 

दोनों वैध अनुवाद कर रहे हैं।