Bölüm 2: Söz Dizimi Kuralları

Bölüm 2: Söz Dizimi Kuralları · Çalışma Soruları
DerlemeVeri tipleriTanımlayıcılarAtama ve dönüşümOperatörlerKontrol akışı
Sercan KÜLCÜ

Çoktan Seçmeli · Derleme

Soru 1: javac Ne Üretir?

javac MerhabaDunya.java komutu hatasız tamamlandığında ne olur?

B: javac kaynak kodu işlemcinin makine diline değil, JVM'in bytecode'una çevirir ve .class dosyasına yazar. Programı çalıştıran ayrı bir komuttur: java MerhabaDunya. Aynı .class her platformdaki JVM'de çalıştığı için her işletim sistemi için yeniden derlemek gerekmez.

Hata Bulma · Derleme

Soru 2: Derleme Hataları

Kod selam.java adlı dosyaya kaydedilip javac selam.java ile derleniyor. Koddaki hataları bulun. Derleyici hepsini aynı anda mı bildirir? Düzeltilmiş program ne yazdırır?

public class Selam {
    public static void main(String[] args) {
        int sayi = 5
        system.out.println("Sayı: " + Sayi);
    }
}
Cevabı göster
  • 3. satır: ; eksik → error: ';' expected. Bu bir söz dizimi hatasıdır; javac ilk denemede yalnızca bunu bildirir, çünkü kod çözümlenemeden ad ve tip denetimine geçilmez.
  • ; eklenince üç hata daha görünür: class Selam is public, should be declared in a file named Selam.java (dosya adı sınıf adıyla birebir aynı olmalı), package system does not exist (System büyük harfle yazılır) ve cannot find symbol … variable Sayi (sayi ≠ Sayi).
  • Dosya Selam.java adıyla kaydedilip üç düzeltme yapılınca çıktı: Sayı: 5

Çıktı Sorusu · Veri Tipleri

Soru 3: Taşma

Program ne yazdırır? l1 ile l2 neden farklı?

int a = Integer.MAX_VALUE;
a++;
System.out.println(a);
byte b = (byte) (100 + 100);
System.out.println(b);
short s = 32767;
s += 2;
System.out.println(s);
long l1 = Integer.MAX_VALUE + 1;
long l2 = Integer.MAX_VALUE + 1L;
System.out.println(l1 + " " + l2);
Cevabı göster
-2147483648
-56
-32767
-2147483648 2147483648
  • Sınırı aşan değer hata vermez, aralığın öbür ucuna sarar: 2147483647 + 1 → −2147483648.
  • 200, byte aralığına (−128 … 127) sığmaz: 200 − 256 = −56. 32767 + 2 short için 32769 − 65536 = −32767 (s += 2 dönüşümü kendisi yapar).
  • Integer.MAX_VALUE + 1 iki int arasında hesaplanır ve önce taşar; long değişkene ancak taşmış sonuç atanır. 1L işlemi baştan long yapar.

Çoktan Seçmeli · Veri Tipleri

Soru 4: Hangi Bildirim Derlenir?

Aşağıdaki bildirimlerden hangisi derlenir?

D: char → int genişletmesi otomatiktir; kod 65 olur. 3.14 bir double sabitidir, float'a ancak 3.14f ile yazılır. 8000000000 int aralığını aşar; long sabiti için L soneki gerekir. boolean yalnızca true ya da false alır, 0 ile 1 kullanılamaz.

Çoktan Seçmeli · Tanımlayıcılar

Soru 5: Geçerli Tanımlayıcılar

Hangi satırdaki adların hepsi geçerli birer tanımlayıcıdır?

A: Tanımlayıcı harf, _ ya da $ ile başlar; harf, rakam, _ ve $ içerir. Class büyük C ile yazıldığı için anahtar kelime değildir. 2yas rakamla başlar, final anahtar kelimedir, ad-soyad içindeki - çıkarma operatörüdür.

Çoktan Seçmeli · Tanımlayıcılar

Soru 6: Anahtar Kelime mi?

Aşağıdakilerden hangisi int ___ = 3; bildiriminde değişken adı olarak kullanılabilir?

C: String bir sınıf adıdır, anahtar kelime değildir: int String = 3; derlenir (ama okuyanı şaşırtır, kullanılmamalıdır). goto ayrılmış ama kullanılmayan bir anahtar kelime, double bir tip anahtar kelimesi, null ise bir sabit değerdir; üçü de ad olamaz.

Çoktan Seçmeli · Dönüşüm

Soru 7: Tam Sayı Bölmesi

double ort = (3 + 4) / 2; satırından sonra ort değişkeninin değeri nedir?

D: (3 + 4) / 2 iki int arasındadır: tam sayı bölmesi 3 verir, kesir atılır. Sonuç atama sırasında double'a genişletilir: 3.0. int → double genişletmesi otomatik olduğundan kod derlenir. 3.5 için (3 + 4) / 2.0 yazılmalıdır.

Adım Adım Çalıştırma · Dönüşüm

Soru 8: Atama ve Dönüşüm İzleme

Her satırdan sonra değişkenlerin değerini izleyin. Program ne yazdırır?

İki int değişken.

x / y iki int: tam sayı bölmesi 3. Sonuç atamada double'a genişler → 3.0.

(double) yalnızca x'e uygulanır (tekli dönüşümün önceliği yüksek): 7.0 / 2 = 3.5.

Bileşik atama: x = x + (y * 3) = 7 + 6 = 13. Sağ taraf önce hesaplanır.

13 % 4 = 1.

(int) 3.99 → 3, (int) -2.5 → −2: kesir atılır, yuvarlanmaz. 3 + (−2) = 1.

double değerler .0 ile yazılır.

int x = 7;
int y = 2;
double d = x / y;
double e = (double) x / y;
x += y * 3;
x %= 4;
int z = (int) 3.99 + (int) -2.5;
System.out.println(d + " " + e + " " + x + " " + z);

Çıktı Sorusu · Dönüşüm

Soru 9: char ve int

Her satır ne yazdırır? ('A' = 65, 'a' = 97, '0' = 48)

char c = 'A';
System.out.println(c + 2);
System.out.println((char) (c + 2));
System.out.println("" + c + 2);
System.out.println('a' - 'A');
char d = 'x';
d++;
System.out.println(d);
System.out.println((int) '0' + 1);
Cevabı göster
67
C
A2
32
y
49
  • c + 2: char işleme girince int'e yükseltilir → 67. Karakter için (char) gerekir → C.
  • "" + c + 2: soldan sağa önce String oluşur, sonra hep birleştirme: "A2".
  • Büyük ve küçük harf arasındaki fark 32. d++ char üzerinde çalışır ve tipini korur: x → y.
  • (int) '0' + 1 = 48 + 1 = 49 (rakam karakterinin kodu, rakamın kendisi değil).

Çıktı Sorusu · Operatörler

Soru 10: İşlem Önceliği

Her satır ne yazdırır? Hesap sırasını gösterin.

int a = 7, b = 2;
System.out.println(a / b * b + a % b);
System.out.println(1 + 2 + "3" + 4 * 5);
System.out.println(-17 / 5 + " " + -17 % 5);
System.out.println(10 - 4 - 3 + " " + 20 / 4 * 2);
System.out.println(a > b && b > 3 || a == 7);
Cevabı göster
7
3320
-3 -2
3 10
true
  • 7 / 2 * 2 + 7 % 2 = 3 * 2 + 1 = 7: /, *, % eşit öncelikli, soldan sağa.
  • 4 * 5 önce: 20. Sonra soldan sağa: 1 + 2 = 3, "3" + "3" = "33", "33" + 20 = "3320".
  • Tam sayı bölmesi sıfıra doğru keser: −17 / 5 = −3; kalanın işareti bölünenin işaretidir: −2.
  • 10 - 4 - 3 soldan: 3. 20 / 4 * 2 soldan: 10.
  • &&, ||'dan önce gelir: (true && false) || true = true.

Kod Yazma · Operatörler

Soru 11: Saniyeyi Saate Çevirmek

Kullanıcıdan saniye cinsinden bir tam sayı alıp karşılığını saat:dakika:saniye biçiminde yazdıran kodu / ve % ile yazın (1 saat = 3600 saniye, 1 dakika = 60 saniye). 7510 ve 3599 için ne yazdırır?

Cevabı göster
Scanner giris = new Scanner(System.in);
int saniye = giris.nextInt();
int saat = saniye / 3600;
int dakika = saniye % 3600 / 60;
int kalan = saniye % 60;
System.out.println(saat + ":" + dakika + ":" + kalan);
  • 7510: 7510 / 3600 = 2, 7510 % 3600 = 310, 310 / 60 = 5, 7510 % 60 = 10 → 2:5:10.
  • 3599 → 0:59:59.
  • % ile / aynı önceliktedir ve soldan sağa işlenir: saniye % 3600 / 60 = (saniye % 3600) / 60.
  • İki basamaklı biçim için System.out.printf("%d:%02d:%02d%n", saat, dakika, kalan); → 2:05:10.

Adım Adım Çalıştırma · Operatörler

Soru 12: Bileşik Atama İzleme

Sonek artırma ve bileşik atamalar art arda. Her satırdan sonra değişkenleri izleyin. Program ne yazdırır?

İki int değişken.

Sağ taraf eski değerlerle hesaplanır: 5 + 6 = 11, sonra x'e yazılır.

Sonek x++: z'ye eski değer 11 atanır, sonra x 12 olur.

y -= 4 → y = 6 − 4 = 2.

x *= y → x = 12 · 2 = 24.

x /= 4 → 24 / 4 = 6 (tam sayı bölmesi; kalan olsaydı atılırdı). Beş satır yazıldı.

int x = 5;
int y = 6;
x = x + y;
System.out.println("x: " + x + " y: " + y);
int z = x++;
System.out.println("x: " + x + " z: " + z);
y -= 4;
System.out.println("x: " + x + " y: " + y);
x *= y;
System.out.println("x: " + x + " y: " + y);
x /= 4;
System.out.println("x: " + x + " y: " + y);

Adım Adım Çalıştırma · Operatörler

Soru 13: Artırma ve Azaltma İzleme

Önek ve sonek operatörleri aynı ifadede. İşlenenler soldan sağa hesaplanır. Program ne yazdırır?

i 3 ile başlar.

Sol işlenen i++: ifadeye eski değer 3 girer, sonra i 4 olur.

Sağ işlenen ++i: önce i 5 olur, ifadeye yeni değer 5 girer. j = 3 + 5 = 8.

i--: ifadeye 5 girer, sonra i 4 olur.

--i: önce i 3 olur, ifadeye 3 girer. k = 5 − 3 = 2.

İki artırma ve iki azaltma birbirini götürdü: i yine 3.

int i = 3;
int j = i++ + ++i;
int k = i-- - --i;
System.out.println(i + " " + j + " " + k);

Çoktan Seçmeli · Operatörler

Soru 14: Sonek ve Bileşik Atama

Program ne yazdırır?

int a = 5;
boolean b = a == a++;
char c = 'A';
c += 2;
System.out.println(b + " " + a + " " + c);

C: == işlenenleri soldan sağa hesaplar: sol taraf 5, sağdaki a++ de eski değeri 5 verir ve sonra a 6 olur; 5 == 5 → true. c += 2 bileşik atama olduğu için sonucu char'a kendisi dönüştürür: 'A' + 2 → 'C'. c = c + 2; yazılsaydı int sonuç char'a atanamaz, derlenmezdi.

Çoktan Seçmeli · Operatörler

Soru 15: Kısa Devre

Program ne yazdırır?

int s = 0;
boolean p = (s > 0) && (++s > 0);
boolean q = (s == 0) || (++s > 0);
boolean r = (s == 0) && (++s > 0);
System.out.print(s + " " + p);
System.out.println(" " + q + " " + r);

C: p: sol taraf false olduğu için && sağ tarafı hiç hesaplamaz, s 0 kalır. q: sol taraf true olduğu için || sağa bakmaz. r: sol taraf true, sonuç henüz belli değil; sağ taraf hesaplanır, ++s ile s 1 olur ve 1 > 0 true. Üç ++s'ten yalnızca biri çalıştı.

Kod Yazma · Operatörler

Soru 16: Artık Yıl İfadesi

int yil verildiğinde, yılın artık yıl olup olmadığını tek bir boolean ifadeyle hesaplayan satırı yazın. Kural: 4'e bölünen ama 100'e bölünmeyen yıllar ve 400'e bölünen yıllar artıktır. 1900, 2000, 2024 ve 2023 için sonuç nedir?

Cevabı göster
boolean artik =
    (yil % 4 == 0 && yil % 100 != 0)
    || yil % 400 == 0;
yil% 4% 100% 400artik
190000300false
2000000true
202402424true
202332323false

&&, ||'dan önce geldiği için parantezler zorunlu değildir; ama okunurluğu artırır. Çift sayı testi gibi bölünebilirlik de % … == 0 ile sınanır.

Çoktan Seçmeli · Kontrol Akışı

Soru 17: Noktalı Virgül ve Parantez

Girintiye aldanmayın. Program ne yazdırır?

int x = 7;
if (x > 10);
{
    System.out.print("A");
}
if (x > 10)
    System.out.print("B");
    System.out.print("C");

A: İlk if'in gövdesi tek başına ; (boş deyim); süslü parantezli blok koşuldan bağımsızdır ve her zaman çalışır: A. Parantezsiz ikinci if'e yalnızca ilk deyim bağlıdır; B atlanır, C her durumda yazılır. Girinti Java için anlamsızdır.

Çıktı Sorusu · Kontrol Akışı

Soru 18: switch İçinde Aşağı Düşme

Döngü her turda switch'e giriyor. Program ne yazdırır? Hangi turda kaç puan eklenir?

int puan = 0;
for (int k = 1; k <= 3; k++) {
    switch (k) {
        case 1:
            puan += 1;
        case 2:
            puan += 10;
            break;
        default:
            puan += 100;
    }
}
System.out.println(puan);
Cevabı göster

Çıktı: 121

kçalışan case'lereklenenpuan
1case 1 → (break yok) case 21 + 1011
2case 2 → break1021
3default100121

break, döngüden değil yalnızca switch'ten çıkar; döngü sürer.

Çoktan Seçmeli · Kontrol Akışı

Soru 19: do-while Kaç Tur?

Program ne yazdırır?

int k = 10, sayac = 0;
do {
    k -= 4;
    sayac++;
} while (k > 0);
System.out.println(k + " " + sayac);

B: k: 10 → 6 → 2 → −2. Koşul her turun sonunda sınanır: 6 > 0 ve 2 > 0 doğru, −2 > 0 yanlış. Gövde 3 kez çalışır ve k sınırın altına iner.

Adım Adım Çalıştırma · Kontrol Akışı

Soru 20: break ve continue İzleme

Aynı döngüde continue ve break. Program ne yazdırır? Döngü kaçıncı turda biter?

Toplam 0 ile başlar.

i = 1: 3'e bölünmez, toplam 10'u aşmamış → toplam = 1.

i = 2 → toplam = 3.

i = 3: continue. Turun kalanı atlanır, i++ ile sonraki tura geçilir.

i = 4 → toplam = 7.

i = 5: kontrol eklemeden önce yapıldı (7 > 10 yanlış) → toplam = 12.

i = 6: continue.

i = 7: 12 > 10 → break. 7 eklenmez; 8, 9, 10 hiç denenmez.

Döngü i değişkeniyle birlikte bitti.

int toplam = 0;
for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) continue;
    if (toplam > 10) break;
    toplam += i;
}
System.out.println(toplam);

Son

Bölüm 2: Söz Dizimi Kuralları: Çalışma Soruları
Konu anlatımı: söz dizimi kuralları sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.