ค่าของs++เป็นค่าเดิมของsก่อนที่จะเพิ่มขึ้นการเพิ่มขึ้นที่เกิดขึ้นในเวลาที่ไม่ได้ระบุก่อนที่จุดลำดับถัดไป
ดังนั้น*s++และ*(s++)เทียบเท่า: พวกเขาทั้งสอง dereference sค่าเดิมของ การแสดงออกที่เท่าเทียมกันอีกประการหนึ่งคือ*(0, s++)และไม่ใช่สำหรับลมใจเช่นนี้0[s++]
โปรดทราบว่าฟังก์ชั่นของคุณควรใช้ type size_tfor iและ return type:
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++)การย้ายพอยน์เตอร์และนิพจน์ดัชนีใน[]นิพจน์นั้นไม่ธรรมดาหรือไม่มีประโยชน์อย่างยิ่ง แต่เป็นไปตามมาตรฐาน C
, s++สิ่งที่เลวร้ายออกไป:)