Eskiden C'de döngü değişkenleri for döngüsü içinde tanımlanamıyordu:
int i = 0;
for (i = 0; i < 10; ++i) {
i döngü dışında tanımlandığı için döngü sonlandıktan sonra da geçerliliğini koruyordu ve hatalara neden olabiliyordu.
C++ döngü değişkenlerinin isim alanını for döngüsü ile kısıtlayan yeni yazımı getirdi:
for (int i = 0; i < 10; ++i) {
i'nin geçerli olduğu alanı kısıtladığı için yararlıdır. C++ ayrıca aynı döngüde birden fazla değişken tanımlamaya da olanak sağladı:
for (int i = 0, j = 10; i < 10; ++i, --j) {
Bunları C99 da benimsedi. Ancak, C ve C++'ta bir kısıtlama vardır: birden fazla değişken olduğunda hepsinin aynı türden olmaları şarttır. Dikkat ederseniz j için tür belirlenememiştir; o da int olmak zorundadır.
Yukarıdakiler aynen D için de geçerlidir. Üstüne, D'nin auto'su bu durumu biraz olsun kurtarır: D'te otomatik tür çıkarsama (buradakinin teknik ismi 'type inference') bulunduğundan, her değişken ayrı ayrı çıkarsanabilir. İşte hem int hem double:
for (auto i = 0, d = 0.5; i < 10; ++i, d /= 2) {
Güzel ama dahası var! :) Bu konuyu açmamın nedeni, D'deki for'un C ve C++'taki gibi aralarında noktalı virgül bulunan üç bölümden oluşmuyor olmasıymış! (Hmmm. Acaba C ve C++'ta da mı öyle değil? Onu da mı yanlış biliyorum? :) ) Bu açıdan bakınca D.ershane'de açıkça yanlış bilgi veriyorum. :( Düzelteceğim.
D'deki for deyiminin yazım kuralını
http://dlang.org/statement.html#ForStatement
adresinden alıyorum:
' for (Hazırlık Koşul ; İlerletme) KapsamDeyimi'
Dikkat ederseniz for parantezi için yalnızca bir tane noktalı virgül var! Yukarıdaki dört parçayı ilginç olanını sona alarak açalım:
-
Koşul: Bir mantıksal ifade. Döngü bu 'true' olduğu sürece devam eder.
-
İlerletme: Döngünün sonunda işletilen ve kavramsal olarak döngünün ilerlemesini sağlayan ifade.
-
KapsamDeyimi: İçinde tanımlanan isimler için yeni bir isim alanı belirleyen kod bloğu (tek deyim de olabilir)
-
Hazırlık: NoScopeNonEmptyStatement
Sonuncuyu daha derine gitmeden kabaca şöyle açıklayabiliriz: Ya isim alanı belirlemeyen bir kod bloğu, ya da boş olmayan bir deyim. (İşin ilginci, tek bir noktalı virgül bile boş olmayan deyim kabul ediliyor.) Burada en ilginç olan, kod bloğunun isim alanı belirlemiyor olması. Onun anlamı da, küme parantezleri bile yazılmış olsa, içindeki isimler for döngüsü boyunca kullanılabiliyorlar demek!
İşte örnek:
for ( { int i = 0; double d = 0.5; } i < 10; ++i, d /= 2) {
writefln("i: %s, d: %s", i, d);
}
i ve d küme parantezli bir alanda tanımlanmış bile olsalar, bütün for deyiminde kullanılabiliyorlar.
Bütün bölümler şunlar:
-
'for('
-
Hazırlık:
{ int i = 0; double d = 0.5; }
Dikkat ederseniz bunun sonrasında noktalı virgül bulunmuyor.
- Koşul:
i < 10
-
';' (Bu, yazım kuralı gereği var; koşula ait değil.)
-
İlerletme:
++i, d /= 2
-
')'
-
KapsamDeyimi:
{
writefln("i: %s, d: %s", i, d);
}
Bunu bugün öğrendim ve çok şaşırdım. Özellikle teknik açıdan for parentezi içinde iki noktalı virgül bulunmuyor olması şaşırtıcı.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]