Sorunuzun cevabını vermeden önce, (i++) ve (++i) arasındaki farkı açıklamak istiyorum. Bu iki operatör de i değişkeninin değerini 1 artırır, ancak aralarında bir fark vardır. (i++) operatörü, i’nin değerini artırmadan önce i’nin orijinal değerini döndürür. Buna sonrası artırma denir. (++i) operatörü ise, i’nin değerini artırdıktan sonra i’nin yeni değerini döndürür. Buna öncesi artırma denir. Örneğin:
int i = 5;
int j = i++; // i'nin değeri 6 olur ama j'nin değeri 5 olur.
int k = ++i; // i'nin değeri 7 olur ve k'nın değeri de 7 olur.
Bu fark, i değişkeninin başka bir ifadeyle birlikte kullanıldığı durumlarda önemli olabilir. Örneğin, i = i + (++i) ifadesinde, i’nin değeri önce 1 artırılır, sonra i ile toplanır ve sonuç i’ye atanır. Bu durumda, i’nin son değeri i’nin başlangıç değerinin iki katı artı 1 olur. Ama i = i + (i++) ifadesinde, i’nin değeri önce i ile toplanır, sonra 1 artırılır ve sonuç i’ye atanır. Bu durumda, i’nin son değeri i’nin başlangıç değerinin bir fazlası olur.
Şimdi sorunuza gelelim. for( int i=2;i<68;i=i + (++i)) döngüsü, i değişkeninin değerini her adımda 1 artırmak yerine, i’nin değerini 1 artırıp, sonra i ile toplayarak artırır. Bu da i’nin değerinin çok hızlı büyümesine neden olur. Bu döngüde, i’nin değeri sırasıyla şöyle olur:
i = 2 // ilk değer
i = 5 // i = 2 + (++i), burada ++i = 3
i = 11 // i = 5 + (++i), burada ++i = 6
i = 23 // i = 11 + (++i), burada ++i = 12
i = 47 // i = 23 + (++i), burada ++i = 24
i = 95 // i = 47 + (++i), burada ++i = 48
Gördüğünüz gibi, i’nin değeri 68’den büyük olduğu için, döngü sadece 5 kez çalışır. Bu 5 değerden sadece 2 tanesi çift sayıdır: 2 ve 47. Dolayısıyla, bu döngü ekrana 2 adet çift sayı basar.