C मानक में फंक्शन आर्गुमेंट्स का इवैल्यूएशन ऑर्डर **अनस्पेसिफाइड** (अनिर्दिष्ट) है। कंपाइलर किसी भी क्रम में इवैल्यूएट कर सकता है।
उदाहरण
#include <stdio.h>
void test_function(int x, int y, int z) {
printf("x = %d\n", x);
printf("y = %d\n", y);
printf("z = %d\n", z);
}
int main() {
int a = 10;
test_function(a++, a++, a++); // अनडिफाइंड बिहेवियर!
return 0;
}
संभावित आउटपुट (GCC, राइट-टू-लेफ्ट)
x = 12 y = 11 z = 10
महत्वपूर्ण चेतावनी
- यह अनडिफाइंड बिहेवियर (UB) है - C11 §6.5.2.2: "आर्गुमेंट्स का इवैल्यूएशन ऑर्डर अनस्पेसिफाइड है" और एक ही स्केलर ऑब्जेक्ट पर अनसीक्वेंस्ड साइड इफेक्ट्स UB हैं।
- ऊपर का आउटपुट केवल एक कंपाइलर/ऑप्टिमाइज़ेशन लेवल पर देखे गए व्यवहार को दर्शाता है।
- अलग कंपाइलर, ऑप्टिमाइज़ेशन लेवल, या आर्किटेक्चर अलग परिणाम दे सकता है।
सही कोड
int a = 10; int x = a++; int y = a++; int z = a++; test_function(x, y, z); // स्पष्ट, परिभाषित व्यवहार
C++17 सुधार
- C++17 में: फंक्शन आर्गुमेंट्स का इवैल्यूएशन **अनसीक्वेंस्डली इंडिटरमिनेटली सीक्वेंस्ड** है (लेकिन अभी भी अनस्पेसिफाइड ऑर्डर)।
- फिर भी, एक ही वेरिएबल पर मल्टीपल साइड इफेक्ट्स UB रहते हैं।
नियम
कभी भी एक ही स्टेटमेंट में एक ही वेरिएबल को एक से अधिक बार मॉडिफाई न करें जब तक कि सीक्वेंस पॉइंट्स (&&, ||, ?, :, , (कॉमा ऑपरेटर), ;) द्वारा सीक्वेंस्ड न हों।