Tembel İşleçler
Tembel değerlendirmeler işlemlerin gerçekten gerekli oldukları zamana kadar geciktirilmeleri anlamına gelir. İngilizcesi "lazy evaluation" olan tembel değerlendirmeler bazı programlama dillerinin de temel olanakları arasındadır.
İşlemlerin gerekene kadar geciktirilmeleri doğal olarak hız kazancı sağlayabilir çünkü belki de gerekmeyecek olan bir işlem için baştan zaman harcanmamış olur. Öte yandan, bir önceki bölümde de gördüğümüz gibi, lazy
parametrelerin her erişildiklerinde tekrar hesaplanıyor olmaları zaman kaybına da neden olabilir.
Tembel değerlendirmelere yakın olan bir kavram, işleçlere verilen ifadelerin duruma göre hiç işletilmiyor olmalarıdır. Bu kavramı daha önce gördüğümüz aşağıdaki işleçlerden tanıyorsunuz:
-
||
(veya) işleci: İkinci ifade ancak birincisifalse
olduğunda işletilir.if (birİfade() || belkiDeİşletilmeyecekOlanİfade()) { // ... }
Eğer
birİfade()
'nin sonucutrue
ise, sonucun datrue
olacağı daha ikinci ifade işletilmeden bellidir. O durumda ikinci ifade işletilmez. -
&&
(ve) işleci: İkinci ifade ancak birincisitrue
olduğunda işletilir.if (birİfade() && belkiDeİşletilmeyecekOlanİfade()) { // ... }
Eğer
birİfade()
'nin sonucufalse
ise, sonucun dafalse
olacağı daha ikinci ifade işletilmeden bellidir. O durumda ikinci ifade işletilmez. -
?:
işleci (üçlü işleç): Koşultrue
olduğunda birinci ifade,false
olduğunda ikinci ifade işletilir.int i = birKoşul() ? yaBuİfade() : yaDaBuİfade();
birKoşul()
'un sonucuna göre ifadelerden yalnızca birisi işletilir.
Bu işleçlerdeki tembellik yalnızca hız kazancıyla ilgili değildir. İfadelerden birisinin işletilmesi duruma göre hatalı olabilir.
Örneğin, aşağıdaki baş harfi A ise koşulu dizginin boş olma olasılığı varsa hatalıdır:
dstring s; // ... if (s[0] == 'A') { // ... }
s
'nin sıfır indeksli elemanına erişmeden önce öyle bir elemanın varlığından emin olmak gerekir. Bu yüzden aşağıdaki koşul yukarıdaki denetimi &&
işlecinin sağ tarafına almakta ve böylece o denetimi ancak dizgi dolu olduğunda işletmektedir:
if ((s.length >= 1) && (s[0] == 'A')) { // ... }
Tembel değerlendirmeler ilerideki bölümlerde göreceğimiz işlev göstergeleri, temsilciler, ve aralıklarla da sağlanabilir.