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_t
untuk i
dan 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:)