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_t
için i
ve 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:)