Giá trị của s++
là giá trị ban đầu của s
, trước khi tăng, mức tăng xảy ra tại một thời điểm không xác định trước điểm chuỗi tiếp theo.
Do đó *s++
và *(s++)
là tương đương: cả hai đều quy định giá trị ban đầu của s
. Một biểu hiện tương đương khác là *(0, s++)
và không dành cho người yếu tim, đây là biểu hiện:0[s++]
Tuy nhiên, lưu ý rằng chức năng của bạn nên sử dụng loại size_t
cho i
và loại trả về của nó:
size_t str_len(const char *s) {
size_t i = 0;
while (*s++) {
i++;
}
/* s points after the null terminator */
return i;
}
Đây là một phiên bản có khả năng hiệu quả hơn với một mức tăng trên mỗi vòng lặp:
size_t str_len(const char *s) {
const char *s0 = s;
while (*s++) {
/* nothing */
}
return s - 1 - s0;
}
Đối với những người thắc mắc về các biểu thức kỳ lạ trong đoạn thứ hai:
0, s++
là một thể hiện của toán tử dấu phẩy ,
đánh giá phần bên trái của nó, sau đó phần bên phải của nó tạo thành giá trị của nó. do đó (0, s++)
tương đương với (s++)
.
0[s++]
tương đương (s++)[0]
và *(0 + s++)
hoặc *(s++ + 0)
đơn giản hóa như *(s++)
. Chuyển đổi con trỏ và biểu thức chỉ mục trong []
biểu thức không phổ biến và cũng không đặc biệt hữu ích nhưng phù hợp với tiêu chuẩn C.
, s++
và những điều tồi tệ sẽ xảy ra:)