SEN1001 · 2. hafta · Introduction to Java Applications /Elementary Programming

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.

integer divisionremainder (modulus)operator precedenceassociativitytype promotioncasting

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:

  1. int / int = int. Ondalık kısım atılır, yuvarlama yok: 7 / 2 → 3.
  2. Biri double ise sonuç double. 7.0 / 2 → 3.5.
  3. % kalanı verir, sonucun işareti soldaki sayının işaretidir: -7 % 2 → -1.
  4. * / % önce, + - sonra. Aynı seviyedekiler soldan sağa yapılır.
  5. 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örAnlamıint örneğidouble örneği
+toplama7 + 2 → 97.0 + 2 → 9.0
-çıkarma7 - 2 → 57.5 - 2 → 5.5
*çarpma7 * 2 → 147 * 2.0 → 14.0
/bölme7 / 2 → 37 / 2.0 → 3.5
%kalan (remainder)7 % 2 → 15.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.5 değil 3.0. Önce sağ taraf hesaplanır: 7 / 2 iki int, sonuç 3. Ondalık zaten gitti; double’a atamak sadece .0 ekler.

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:

a=(a/b)⋅b+(a % b)o¨rnek: 17=3⋅5+2a = (a / b)\cdot b + (a \,\%\, b) \qquad \text{örnek: } 17 = 3\cdot 5 + 2

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şinin 2 ya da 0 yazdığı 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 == 014 % 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 == 021 % 7 → 0
Son basamakn % 101234 % 10 → 4
Son basamağı atn / 101234 / 10 → 123
Onlar basamağın / 10 % 101234 / 10 % 10 → 3
Saniye → dakika + saniyes / 60, s % 60125 sn → 2 dk 5 sn
12’lik saatte döngü(h + k) % 12saat 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ıraOperatörlerNot
1( )Parantez her zaman ilk.
2x++ 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 * 2 soldan sağa: 20 / 4 = 5, 5 * 2 = 10. 2.5 yazan 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üşünceDoğrusu
19 / 5 = 4 (yuvarlar)3, Java keser
-7 / 2 = -4-3, sıfıra doğru kesilir
3 % 5 = 23, küçük % büyük = kendisi
-7 % 2 = 1-1, işaret soldakinden
double d = 7 / 2; → 3.53.0, bölme int yapıldı
(a + b + c) / 3 doğru ortalamaint’lerde ondalık kaybolur: / 3.0 yaz
20 / 4 * 2 = 2.510, aynı seviye soldan sağa
(double) (7 / 2) = 3.53.0, parantez içi önce int bölündü
Tek sayı: n % 2 == 1Negatifte -1 çıkar; n % 2 != 0 yaz

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

What is printed?

System.out.println(17 / 5 + 17 % 5);
Cevabı göster
5

17 / 5 = 3 (kesilir), 17 % 5 = 2, sonra 3 + 2 = 5.

Soru 2orta

What is printed?

System.out.println(2 + 3 * 4 % 5);
Cevabı göster
4

* ve % aynı seviyede, soldan sağa: 3 * 4 = 12, 12 % 5 = 2. En son toplama: 2 + 2 = 4.

Soru 3orta

What is printed?

double d = 9 / 2;
System.out.println(d);
Cevabı göster
4.0

Sağ taraf iki int: 9 / 2 = 4. double'a atanınca 4.0 olur. Atama, kaybolan ondalığı geri getirmez.

Soru 4kolay

What is printed?

System.out.println((double) 9 / 2);
Cevabı göster
4.5

Cast önce 9'a uygulanır: 9.0 / 2 → double bölme → 4.5.

Soru 5orta

What is printed?

System.out.println(-9 % 4);
Cevabı göster
-1

9 = 2·4 + 1. Kalanın işareti soldaki sayıdan (-9) gelir: -1.

Soru 6orta

What is printed?

System.out.println(10 - 6 / 4 * 2);
Cevabı göster
8

6 / 4 = 1 (kesilir), 1 * 2 = 2, 10 - 2 = 8.

Soru 7zor

What is printed?

System.out.println(1 + 2 + "3" + 4 + 5);
Cevabı göster
3345

Soldan sağa: 1 + 2 = 3 (sayı). 3 + "3" = "33" (artık String). "33" + 4 = "334", + 5 = "3345".

Soru 8orta

What is printed?

int n = 4567;
System.out.println(n / 10 % 10);
Cevabı göster
6

Soldan sağa: 4567 / 10 = 456, 456 % 10 = 6. Onlar basamağını verir.

Soru 9orta

What is printed?

System.out.println(7 / 2 * 2.0);
Cevabı göster
6.0

7 / 2 = 3 (iki int). Sonra 3 * 2.0 = 6.0 (double).

Soru 10zor

What is printed?

System.out.println((int) 8.9 / 2 + 8 % 3);
Cevabı göster
6

(int) 8.9 = 8, 8 / 2 = 4. 8 % 3 = 2. 4 + 2 = 6.

Soru 11orta

What is the value of a at the end?

int a = 7;
a %= 4;
a *= 3;
a /= 2;
Cevabı göster
4

7 % 4 = 3, 3 * 3 = 9, 9 / 2 = 4 (kesilir).

Soru 12zor

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
3.0

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).

Deftere not kartı

int / int → int, KESİLİR (yuvarlamaz) 7/2=3 -7/2=-3 9/10=0 biri double → double 7.0/2=3.5 7/2.0=3.5 double d = 7/2; → 3.0 (bölme önce int yapıldı) (double)7/2=3.5 ama (double)(7/2)=3.0 (int)7.9 = 7 (keser) (int)7.9/2 = 3 % kalan: 17%5=2 3%5=3 20%5=0 -7%2=-1 (işaret soldan) son basamak n%10 at n/10 onlar n/10%10 çift n%2==0 ÖNCELİK: () → ++ -- ! cast → * / % → + - → < > → == != → && → || → = aynı seviye SOLDAN SAĞA: 20/4*2=10 7+3%2*5=12 "A"+1+2="A12" 1+2+"A"="3A" "A"+(1+2)="A3" 5/0 → ArithmeticException 5.0/0 → Infinity