मूल्य का s++मूल मूल्य है s, वेतन वृद्धि से पहले, वृद्धि अगले अनुक्रम बिंदु से पहले अनिर्दिष्ट समय पर होती है।
इसलिए *s++और *(s++)समतुल्य हैं: वे दोनों मूल मूल्य को कम करते हैं s। एक और समकक्ष अभिव्यक्ति है *(0, s++), दिल के बेहोश होने के लिए नहीं, यह एक है:0[s++]
ध्यान दें कि आपके फ़ंक्शन को इसके और इसके प्रकार size_tके प्रकार का उपयोग करना चाहिए i:
size_t str_len(const char *s) {
size_t i = 0;
while (*s++) {
i++;
}
/* s points after the null terminator */
return i;
}
यहां प्रति लूप एकल वेतन वृद्धि के साथ संभावित रूप से अधिक कुशल संस्करण है:
size_t str_len(const char *s) {
const char *s0 = s;
while (*s++) {
/* nothing */
}
return s - 1 - s0;
}
दूसरे पैराग्राफ में अजीब भावों के बारे में सोचने वालों के लिए:
0, s++अल्पविराम ऑपरेटर का एक उदाहरण है जो ,इसके बाएं हिस्से का मूल्यांकन करता है, फिर इसका दाहिना हिस्सा जो इसके मूल्य का गठन करता है। इसलिए (0, s++)के बराबर है (s++)।
0[s++]के बराबर है (s++)[0]और *(0 + s++)या *(s++ + 0)जो सरल है *(s++)। सूचक और इंडेक्स एक्सप्रेशन को भावों में []बदलना बहुत सामान्य नहीं है और न ही विशेष रूप से उपयोगी है, लेकिन सी मानक के अनुरूप है।
, s++और बुरी चीजें होंगी:)