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