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

Bölüm 2.2: Söz Dizimi Kuralları · Çalışma Soruları
DerlemeVeri tipleriTanımlayıcılarAtama ve dönüşümİşleçlerKontrol deyimleri
Sercan KÜLCÜ · Giresun Üniversitesi · Bilgisayar Mühendisliği

Ç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

Ç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 += 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 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 yine char'a çevirir: 97 + 2 = 99 → 'c'.
  • 'a' + 2: char + int işlemi int ü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' + 1 soldan 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 - 3 soldan: 3. 20 / 4 * 2 soldan: 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% 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 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'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.

Son

Bölüm 2.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.