Bölüm 2: Söz Dizimi Kuralları
Ç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(Systembüyük harfle yazılır) vecannot find symbol … variable Sayi(sayi≠Sayi).- Dosya
Selam.javaadı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 += 2dönüşümü kendisi yapar). Integer.MAX_VALUE + 1iki int arasında hesaplanır ve önce taşar; long değişkene ancak taşmış sonuç atanır.1Liş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 - 3soldan: 3.20 / 4 * 2soldan: 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 | % 400 | artik |
|---|---|---|---|---|
| 1900 | 0 | 0 | 300 | false |
| 2000 | 0 | 0 | 0 | true |
| 2024 | 0 | 24 | 24 | true |
| 2023 | 3 | 23 | 23 | false |
&&, ||'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'ler | eklenen | puan |
|---|---|---|---|
| 1 | case 1 → (break yok) case 2 | 1 + 10 | 11 |
| 2 | case 2 → break | 10 | 21 |
| 3 | default | 100 | 121 |
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);