नीचे दिया गया कोड इस अंतर को दर्शाता है:क्या सी ++ में ऑपरेटर प्राथमिकता पॉइंटर्स और इटरेटर के लिए भिन्न है?
#include <iostream>
#include <string>
int main()
{
char s[] = "ABCD";
std::string str(s);
char *p = s;
while(*p) {
*p++ = tolower(*p); // <-- incr after assignment
}
std::cout << s << std::endl;
std::string::iterator it = str.begin(), end = str.end();
while(it != end) {
*it++ = tolower(*it); // <-- incr before assignment ?
}
std::cout << str << std::endl;
return 0;
}
यह आउटपुट उत्पन्न करता है:
abcd
bcd
अगर हम असाइनमेंट ऑपरेशन और वृद्धि ऑपरेटर को अलग करते हैं:
while(it != end) {
*it = tolower(*it); // <-- incr before assignment ?
it++;
}
आउटपुट की अपेक्षा की जाएगी।
मूल कोड के साथ क्या गलत है?
$ g++ --version
g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
यह अनिर्दिष्ट व्यवहार से भी बदतर है, मूल अभिव्यक्ति में अपरिभाषित व्यवहार है। Subxpressions का एक संभावित क्रम है जहां 'यह ++' मूल्यांकन किया जाता है (यानी 'इसे' लिखना 'इससे पहले' '' 'के लिए पैरामीटर मूल्यांकन में पढ़ा जाता है, जिसमें कोई हस्तक्षेप अनुक्रम बिंदु नहीं होता है। ऐसा हो सकता है कि असाइनमेंट ऑपरेटर फ़ंक्शन कॉल है या नहीं। किसी भी तरह से 5 [expr], पैरा 8 पुष्टि करता है कि यह अपरिभाषित व्यवहार है। –