Nilai s++adalah nilai asli dari s, sebelum kenaikan, kenaikan terjadi pada waktu yang tidak ditentukan sebelum titik urutan berikutnya.
Karenanya *s++dan *(s++)setara: mereka berdua dereferensi nilai asli s. Ungkapan lain yang sepadan adalah *(0, s++)dan, bukan untuk orang yang lemah hati, seperti ini:0[s++]
Perhatikan bahwa fungsi Anda harus menggunakan tipe size_tuntuk idan tipe pengembaliannya:
size_t str_len(const char *s) {
size_t i = 0;
while (*s++) {
i++;
}
/* s points after the null terminator */
return i;
}
Berikut adalah versi yang berpotensi lebih efisien dengan kenaikan satu per loop:
size_t str_len(const char *s) {
const char *s0 = s;
while (*s++) {
/* nothing */
}
return s - 1 - s0;
}
Bagi mereka yang bertanya-tanya tentang ekspresi aneh di paragraf kedua:
0, s++adalah turunan dari operator koma ,yang mengevaluasi bagian kirinya, kemudian bagian kanannya yang merupakan nilainya. karenanya (0, s++)setara dengan (s++).
0[s++]sama dengan (s++)[0]dan *(0 + s++)atau *(s++ + 0)yang disederhanakan sebagai *(s++). Transposing pointer dan ekspresi indeks dalam []ekspresi tidak sangat umum atau sangat berguna tetapi sesuai dengan standar C.
, s++hal-hal buruk yang akan terjadi:)