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_tcho ivà 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:)