Operatörler: /, % ve öncelik
Tam sayı bölmesi, kalan operatörü ve Java'nın işlem sırası. “What is printed?” sorularının yarısı buradan gelir.
Vizede en çok puan getiren konulardan biri. Soru tipi hep aynı: “What is printed?”. Kodu kafanda çalıştırıp çıktıyı yazacaksın. Aşağıdaki beş kuralı bilen biri bu soruları kaçırmaz:
- int / int = int. Ondalık kısım atılır, yuvarlama yok:
7 / 2→3. - Biri double ise sonuç double.
7.0 / 2→3.5. - % kalanı verir, sonucun işareti soldaki sayının işaretidir:
-7 % 2→-1. * / %önce,+ -sonra. Aynı seviyedekiler soldan sağa yapılır.- Parantez her şeyi ezer. Cast
(int)ise sadece hemen sağındaki değere uygulanır.
Aritmetik operatörler
Java’da beş aritmetik operatör var. Toplama, çıkarma ve çarpma bildiğin gibi çalışır. Sınavı belirleyen ikisi / ve %, çünkü sonuç tiplere göre değişir.
| Operatör | Anlamı | int örneği | double örneği |
|---|---|---|---|
+ | toplama | 7 + 2 → 9 | 7.0 + 2 → 9.0 |
- | çıkarma | 7 - 2 → 5 | 7.5 - 2 → 5.5 |
* | çarpma | 7 * 2 → 14 | 7 * 2.0 → 14.0 |
/ | bölme | 7 / 2 → 3 | 7 / 2.0 → 3.5 |
% | kalan (remainder) | 7 % 2 → 1 | 5.5 % 2 → 1.5 |
double bir sonuç ekrana basılırken tam sayı olsa bile .0 ile basılır: 9.0, 14.0. Çıktı sorusunda 9 mu 9.0 mı yazacağın puan farkıdır.
Bölme: tam sayı bölmesi
İki tarafı da int olan bölmede Java bölümü hesaplar ve virgülden sonrasını atar. Buna integer division denir. Yuvarlama yapmaz: 9 / 10 0,9 değil, 0.
System.out.println(7 / 2); // 3,5 → kesilir
System.out.println(9 / 10); // 0,9 → 0
System.out.println(19 / 5); // 3,8 → 3 (yuvarlasaydı 4 olurdu)
System.out.println(-7 / 2); // -3,5 → sıfıra doğru kesilir
System.out.println(10 / 5); // tam bölünüyor
3
0
3
-3
2
Negatiflerde dikkat: Java sıfıra doğru keser. -3,5 → -3 olur, -4 değil. Negatif sayıda da sadece ondalık kısmı silersin.
Tip yükseltme (type promotion)
Bölmenin iki tarafından biri double ise Java diğerini de double yapar ve gerçek bölme yapar. Önemli olan, bölme yapıldığı anda tiplerin ne olduğu.
System.out.println(7.0 / 2); // double / int
System.out.println(7 / 2.0); // int / double
System.out.println((double) 7 / 2); // cast ÖNCE: 7.0 / 2
System.out.println((double) (7 / 2)); // parantez ÖNCE: 7/2 = 3
double d = 7 / 2; // sağ taraf int bölme
System.out.println(d);
3.5
3.5
3.5
3.0
3.0
TUZAK · double değişkene atamak kurtarmaz.
double d = 7 / 2;satırında sonuç3.5değil3.0. Önce sağ taraf hesaplanır:7 / 2iki int, sonuç3. Ondalık zaten gitti; double’a atamak sadece.0ekler.
Sıfıra bölme
System.out.println(5.0 / 0); // double: çökmez
System.out.println(5 / 0); // int: program ÇÖKER
Infinity
Exception in thread "main" java.lang.ArithmeticException: / by zero
Kalan operatörü: %
a % b, a’yı b’ye böldüğünde artan sayıdır. Her zaman şu eşitlik doğrudur:
Hesaplarken “b’nin a’ya sığan en büyük katı ne?” diye düşün, a’dan çıkar. 17 % 5: 5’in 17’ye sığan en büyük katı 15, 17 − 15 = 2.
System.out.println(17 % 5); // 17 = 3*5 + 2
System.out.println(20 % 5); // tam bölünüyor
System.out.println(3 % 5); // küçük % büyük = kendisi
System.out.println(-7 % 2); // işaret SOLDAKİNİN
System.out.println(7 % -2); // soldaki pozitif
System.out.println(5.5 % 2); // double'da da çalışır
2
0
3
-1
1
1.5
TUZAK · küçük % büyük.
3 % 5çoğu kişinin2ya da0yazdığı soru. 5, 3’ün içine hiç sığmaz. Kalan 3’ün kendisi:3.
% ile yapılan hazır işler
| Ne istiyorsun? | Kod | Örnek |
|---|---|---|
| Çift mi? | n % 2 == 0 | 14 % 2 → 0 → çift |
| Tek mi? | n % 2 != 0 | -7 % 2 → -1 (== 1 yazarsan negatifte yanılırsın) |
| k’ya tam bölünür mü? | n % k == 0 | 21 % 7 → 0 |
| Son basamak | n % 10 | 1234 % 10 → 4 |
| Son basamağı at | n / 10 | 1234 / 10 → 123 |
| Onlar basamağı | n / 10 % 10 | 1234 / 10 % 10 → 3 |
| Saniye → dakika + saniye | s / 60, s % 60 | 125 sn → 2 dk 5 sn |
| 12’lik saatte döngü | (h + k) % 12 | saat 10 + 5 → 15 % 12 → 3 |
Basamak toplamı, basamak sayısı, sayıyı ters çevirme gibi metot sorularının hepsi bu iki satırlık kalıbın üzerine kurulu:
int n = 1234, sum = 0;
while (n > 0) {
sum += n % 10; // son basamağı al
n /= 10; // son basamağı at
}
System.out.println(sum);
10
Öncelik sırası
Bir ifadede birden fazla operatör varsa Java şu sırayla çalışır. Üstteki önce yapılır. Aynı satırdakiler soldan sağa yapılır; sadece atama = sağdan soladır.
| Sıra | Operatörler | Not |
|---|---|---|
| 1 | ( ) | Parantez her zaman ilk. |
| 2 | x++ x-- ++x --x -x ! (int) (double) | Tekli operatörler ve cast. Cast sadece hemen sağındakine uygulanır. |
| 3 | * / % | Üçü aynı seviyede, soldan sağa. |
| 4 | + - | String birleştirme + da burada. |
| 5 | < <= > >= | Karşılaştırma |
| 6 | == != | Eşitlik |
| 7 | && | VE |
| 8 | || | VEYA |
| 9 | = += -= *= /= %= | Atama, en son, sağdan sola |
TUZAK ·
* / %eşit seviyede. “Önce çarpma sonra bölme” diye bir kural yok.20 / 4 * 2soldan sağa:20 / 4 = 5,5 * 2 = 10.2.5yazan yanar.
Adım adım çözümler
Sınavda böyle çöz: her adımda sadece bir operatörü işle, ifadeyi yeniden yaz.
7 + 3 % 2 * 5
7 + 3 % 2 * 5 % ve * aynı seviye, soldaki önce
7 + 1 * 5
7 + 5
12
1 / 2 * 4.0 ile 4.0 * 1 / 2
1 / 2 * 4.0 → 0 * 4.0 → 0.0 (önce iki int bölündü)
4.0 * 1 / 2 → 4.0 / 2 → 2.0 (double ile başladı)
Aynı sayılar, farklı sıra, farklı sonuç: bölmenin yapıldığı anda tipler belirleyici.
(int) 7.9 / 2 ile (int) (7.9 / 2)
(int) 7.9 / 2 → 7 / 2 → 3 (cast sadece 7.9'a)
(int) (7.9 / 2) → (int) 3.95 → 3 (kesilir, yuvarlanmaz)
String ile +
+ iki sayı arasında toplama yapar. Taraflardan biri String olduğu an birleştirme yapar. Soldan sağa gittiği için sıra her şeyi değiştirir.
System.out.println(1 + 2 + "A"); // (1+2)=3, sonra "3"+"A"
System.out.println("A" + 1 + 2); // "A1", sonra "A12"
System.out.println("A" + (1 + 2)); // parantez önce
System.out.println("Sonuç: " + 5 * 2); // * önce
3A
A12
A3
Sonuç: 10
"x" + 5 - 2 ise derlenmez: önce "x5" olur, sonra String’den sayı çıkarılamaz.
Sık yapılan hatalar
| Yanlış düşünce | Doğrusu |
|---|---|
19 / 5 = 4 (yuvarlar) | 3, Java keser |
-7 / 2 = -4 | -3, sıfıra doğru kesilir |
3 % 5 = 2 | 3, küçük % büyük = kendisi |
-7 % 2 = 1 | -1, işaret soldakinden |
double d = 7 / 2; → 3.5 | 3.0, bölme int yapıldı |
(a + b + c) / 3 doğru ortalama | int’lerde ondalık kaybolur: / 3.0 yaz |
20 / 4 * 2 = 2.5 | 10, aynı seviye soldan sağa |
(double) (7 / 2) = 3.5 | 3.0, parantez içi önce int bölündü |
Tek sayı: n % 2 == 1 | Negatifte -1 çıkar; n % 2 != 0 yaz |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
What is printed?
System.out.println(17 / 5 + 17 % 5);Cevabı göster
17 / 5 = 3 (kesilir), 17 % 5 = 2, sonra 3 + 2 = 5.
What is printed?
System.out.println(2 + 3 * 4 % 5);Cevabı göster
* ve % aynı seviyede, soldan sağa: 3 * 4 = 12, 12 % 5 = 2. En son toplama: 2 + 2 = 4.
What is printed?
double d = 9 / 2;
System.out.println(d);Cevabı göster
Sağ taraf iki int: 9 / 2 = 4. double'a atanınca 4.0 olur. Atama, kaybolan ondalığı geri getirmez.
What is printed?
System.out.println((double) 9 / 2);Cevabı göster
Cast önce 9'a uygulanır: 9.0 / 2 → double bölme → 4.5.
What is printed?
System.out.println(-9 % 4);Cevabı göster
9 = 2·4 + 1. Kalanın işareti soldaki sayıdan (-9) gelir: -1.
What is printed?
System.out.println(10 - 6 / 4 * 2);Cevabı göster
6 / 4 = 1 (kesilir), 1 * 2 = 2, 10 - 2 = 8.
What is printed?
System.out.println(1 + 2 + "3" + 4 + 5);Cevabı göster
Soldan sağa: 1 + 2 = 3 (sayı). 3 + "3" = "33" (artık String). "33" + 4 = "334", + 5 = "3345".
What is printed?
int n = 4567;
System.out.println(n / 10 % 10);Cevabı göster
Soldan sağa: 4567 / 10 = 456, 456 % 10 = 6. Onlar basamağını verir.
What is printed?
System.out.println(7 / 2 * 2.0);Cevabı göster
7 / 2 = 3 (iki int). Sonra 3 * 2.0 = 6.0 (double).
What is printed?
System.out.println((int) 8.9 / 2 + 8 % 3);Cevabı göster
(int) 8.9 = 8, 8 / 2 = 4. 8 % 3 = 2. 4 + 2 = 6.
What is the value of a at the end?
int a = 7;
a %= 4;
a *= 3;
a /= 2;Cevabı göster
7 % 4 = 3, 3 * 3 = 9, 9 / 2 = 4 (kesilir).
The code below is meant to print the average. What does it print, and how do you fix it?
int a = 5, b = 2, c = 4;
double avg = (a + b + c) / 3;
System.out.println(avg);Cevabı göster
11 / 3 = 3 (int bölme), double'a atanınca 3.0. Doğrusu / 3.0 ya da (double) (a + b + c) / 3; o zaman 3.6666666666666665 basar.
Doğrulama: Tüm kod örnekleri ve cevaplar JDK ile çalıştırıldı (java T.java).