Bölüm 2.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
Çoktan Seçmeli · Derleme
Soru 3: Bytecode Taşınabilirliği
Windows'ta javac ile derlenen Merhaba.class dosyası Linux'a kopyalanıp java Merhaba ile çalıştırılıyor. Ne olur?
B: javac kaynak kodu işlemciye değil JVM'e özgü bytecode'a çevirir. Her platformdaki JVM bu bytecode'u yorumlar ya da JIT ile makine koduna çevirir: “bir kez yaz, her yerde çalıştır”. A ve C bytecode'u makine koduyla karıştırır.
Çıktı Sorusu · Veri Tipleri
Soru 4: 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 5: 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 · Değişkenler
Soru 6: Değer Atanmamış Dizgi
Yerel bir değişken için String s; System.out.println(s); yazılıyor. Ne olur?
C: Java, yerel değişkenin değer almadan okunmasına izin vermez; hata derlemede yakalanır. String s = null; yazılsaydı null, String s = ""; yazılsaydı boş satır yazılırdı: boş dizgi, null ve atanmamış üç farklı şeydir.
Çoktan Seçmeli · Tanımlayıcılar
Soru 7: 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 sözcük değildir. 2yas rakamla başlar, final anahtar sözcüktür, ad-soyad içindeki - çıkarma işlecidir.
Çoktan Seçmeli · Tanımlayıcılar
Soru 8: Anahtar Sözcük 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 sözcük değildir: int String = 3; derlenir (ama okuyanı şaşırtır, kullanılmamalıdır). goto ayrılmış ama kullanılmayan bir anahtar sözcük, double bir tip anahtar sözcüğü, null ise bir sabit değerdir; üçü de ad olamaz.
Çoktan Seçmeli · Dönüşüm
Soru 9: 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 10: 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 11: 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 · Dönüşüm
Soru 12: char ve Kod Değeri
Program hangi altı satırı yazdırır?
char c = 'a';
c += 2;
System.out.println(c);
System.out.println('a' + 2);
System.out.println((char) ('A' + 32));
System.out.println('9' - '0' + 1);
System.out.println("" + 'x' + 1);
System.out.println('x' + 1 + "");Cevabı göster
c 99 a 10 x1 121
c += 2: bileşik atama sonucu yinechar'a çevirir: 97 + 2 = 99 →'c'.'a' + 2:char + intişlemiintüretir: 99.'A' + 32= 97,(char)ile'a'. Büyük ve küçük harf arasındaki fark 32'dir.'9' - '0'= 57 − 48 = 9, artı 1: 10."" + 'x' + 1soldan sağa dizgi birleştirmedir:"x1";'x' + 1 + ""önce sayı toplar: 120 + 1 = 121.
Çoktan Seçmeli · Ondalık Hassaslık
Soru 13: 0.1 + 0.2 == 0.3
System.out.println(0.1 + 0.2 == 0.3); satırı için hangisi doğrudur?
A: 0.1 ikili tabanda 0.000110011…₂ diye sonsuz tekrar eder; 52 bitlik kesre sığdırılırken yuvarlanır. Toplam 0.30000000000000004 olur. Kod derlenir (C yanlış); Java'da 0.1 sabiti double'dır (D yanlış). Karşılaştırma için Math.abs(a - b) < 1e-9 kullanılır.
Çıktı Sorusu · İşleçler
Soru 14: İşleç Ö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 · İşleçler
Soru 15: 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 · İşleçler
Soru 16: 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 · İşleçler
Soru 17: Artırma ve Azaltma İzleme
Önek ve sonek işleçleri 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 · İşleçler
Soru 18: 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 · İşleçler
Soru 19: 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ı.
Çoktan Seçmeli · İşleçler
Soru 20: && ile ||
int x = 7; iken System.out.println(x > 5 && x < 7 || x == 7); ne yazdırır?
A: && önceliği ||'den yüksektir: (7 > 5 && 7 < 7) = false, ardından false || (7 == 7) = true. Karşılaştırmaların sonucu boolean'dır, sayı değil (D). Parantez yazmak okunurluğu artırır ama gerekli değildir (C).
Kod Yazma · İşleçler
Soru 21: 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 22: 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 23: 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.