Değeri, artıştan önce, artışın bir sonraki dizi noktasından önce belirtilmemiş bir zamanda gerçekleştiği s++orijinal değerdir s.
Bu nedenle *s++ve *(s++)eşdeğerdir: her ikisi de orijinal değerinin atılmasını gerektirir s. Başka bir eşdeğer ifade, *(0, s++)kalbin zayıflığı için değil, şu şekildedir:0[s++]
Fonksiyonun türünü kullanması gerektiğini ancak unutmayın size_tiçin ive döndürme türü:
size_t str_len(const char *s) {
size_t i = 0;
while (*s++) {
i++;
}
/* s points after the null terminator */
return i;
}
İşte döngü başına tek bir artışla potansiyel olarak daha verimli bir sürüm:
size_t str_len(const char *s) {
const char *s0 = s;
while (*s++) {
/* nothing */
}
return s - 1 - s0;
}
İkinci paragraftaki garip ifadeleri merak edenler için:
0, s++virgül operatörünün ,sol kısmını, ardından değerini oluşturan sağ kısmını değerlendiren bir örneğidir . dolayısıyla (0, s++)eşittir (s++).
0[s++]eşdeğerdir (s++)[0]ve *(0 + s++)ya *(s++ + 0)kadar basitleştirmek olan *(s++). İmlecin ve indeks ifadelerinin ifadelerde aktarılması []çok yaygın veya özellikle yararlı değildir, ancak C standardına uygundur.
, s++ve kötü şeyler olacak:)