2015-07-24 6 views
5

यह व्यापक रूप से ज्ञात है (हालांकि व्यापक रूप से पर्याप्त नहीं है> <) कि सी और सी ++ उस क्रम को निर्दिष्ट नहीं करते हैं जिसमें फ़ंक्शन के पैरामीटर का मूल्यांकन किया जाता है। यही है, दो puts() नीचे रों किसी भी क्रम में हो सकता है, एक मनमाना संकलक विकल्प के रूप में:क्या फ़ंक्शन कॉल का "पैरामीटर" मानकों के सापेक्ष एक अनिर्दिष्ट आदेश में मूल्यांकन है?

#include <cstdio> 

int Function1() { 
    std::puts("Function1"); 
    return 1; 
} 

int Function2() { 
    std::puts("Function2"); 
    return 2; 
} 

int Add(int x, int y) { 
    return x + y; 
} 

int main() { 
    return Add(Function1(), Function2()); 
} 

बहरहाल, यह भी ., .*, -> या की बाईं ओर this के मूल्यांकन पर लागू होता है ->* ऑपरेटरों? दूसरे शब्दों में, puts() के नीचे का भी निर्दिष्ट नहीं है?

#include <cstdio> 

struct Struct { 
    Struct() { std::puts("Struct::Struct"); } 
    int Member(int x) const { return x * 2; } 
}; 

int Function() { 
    std::puts("Function"); 
    return 14; 
} 

int main() { 
    return Struct().Member(Function()); 
} 
+0

http://en.cppreference.com/w/cpp/language/eval_order के अनुसार, आदेश दोनों मामलों में _unspecified_ है। –

उत्तर

5
Struct().Member(Function()) 

यह जहां पोस्टफ़िक्स अभिव्यक्तिStruct().Member है और तर्क Function() है एक समारोह कॉल है। आम तौर पर, फ़ंक्शन कॉल में, पोस्टफिक्स-अभिव्यक्ति का मूल्यांकन तर्कों के मूल्यांकन के संबंध में अपूर्ण नहीं है।

इसलिए puts कॉल का क्रम वास्तव में निर्दिष्ट नहीं है।

यह पूरी तरह से अप्रासंगिक है कि फ़ंक्शन एक गैर स्थैतिक सदस्य कार्य है।

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