मूल्य का 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++
और बुरी चीजें होंगी:)