Değişkenler, primitive tipler ve printf
Değişken tanımlama, sekiz primitive tip, char aritmetiği, casting ve printf ile biçimli çıktı. Çıktı sorularında 7 ile 7.0 farkını buradan öğrenirsin.
Değişkenler programın hafızası. Her değişkenin bir tipi var ve tip, hem ne saklayabileceğini hem de ekrana nasıl basılacağını belirler. Çıktı sorularında 7 yerine 7.0 yazmak ya da 'A' + 1 sonucunu B sanmak, bu sayfadaki kuralları bilmemekten gelir.
Altın kurallar:
- Tip önce, ad sonra:
int age = 19;. Tip bir kez yazılır, sonra sadece adı kullanırsın. - Ondalıklı sayı literali double’dır.
2.5double,2.5ffloat. - Küçükten büyüğe otomatik, büyükten küçüğe cast: int → double kendiliğinden olur, double → int için
(int)gerekir. - char aslında bir sayı.
'A' + 1int verir: 66. - printf’te
%.2fyuvarlar,(int)cast keser.
Değişken tanımlama ve atama
int age; // tanımlama (declaration)
age = 19; // atama (assignment)
int goals = 3, assists = 5; // tanım + ilk değer (initialization)
double gpa = 3.25;
char grade = 'B';
boolean passed = true;
System.out.println(age + " " + goals + " " + assists + " " + gpa + " " + grade + " " + passed);
age = age + 1; // sağ taraf önce hesaplanır, sonra age'e yazılır
System.out.println(age);
19 3 5 3.25 B true
20
= matematikteki eşitlik değil, atamadır: sağdaki değeri hesapla, soldaki kutuya koy. Bu yüzden age = age + 1 anlamlıdır: eski değeri al, bir ekle, geri yaz.
Değişken adı kuralları: harf, rakam, _ ve $ içerebilir, rakamla başlayamaz, int ya da class gibi ayrılmış kelime (keyword) olamaz. Gelenek olarak küçük harfle başlar ve kelimeler büyük harfle birleşir: totalScore, studentCount (camelCase).
TUZAK · değer atanmamış değişken.
int count;deyip hiç değer vermedenSystem.out.println(count);yazarsan derlenmez:variable count might not have been initialized. Metot içindeki yerel değişkenlerin varsayılan (default) değeri yoktur.
Sekiz primitive tip
Java’da sekiz temel (primitive) tip var. Sınavda en çok int, double, char ve boolean geçer; diğerlerinin varlığını ve sırasını bilmen yeter.
| Tip | Boyut | Ne saklar | Örnek literal | Aralık |
|---|---|---|---|---|
byte | 1 byte | küçük tam sayı | 100 | -128 … 127 |
short | 2 byte | tam sayı | 3000 | -32768 … 32767 |
int | 4 byte | tam sayı (varsayılan) | 42 | -2147483648 … 2147483647 |
long | 8 byte | büyük tam sayı | 3000000000L | yaklaşık ±9.2 × 10^18 |
float | 4 byte | ondalıklı (az hassas) | 2.5f | |
double | 8 byte | ondalıklı (varsayılan) | 2.5 | |
char | 2 byte | tek karakter | 'A' | 0 … 65535 |
boolean | doğru/yanlış | true, false |
Aralıklar Java’nın kendi sabitlerinden alındı:
System.out.println(Byte.MIN_VALUE + " " + Byte.MAX_VALUE);
System.out.println(Integer.MIN_VALUE + " " + Integer.MAX_VALUE);
System.out.println(Long.MAX_VALUE);
-128 127
-2147483648 2147483647
9223372036854775807
String primitive değildir. Bir sınıftır (class), çift tırnakla yazılır: "Ali". char tek tırnakla ve tek karakterdir: 'A'. 'Ali' derlenmez.
Taşma (overflow)
int’in sınırını aşarsan Java hata vermez, sayı öbür uçtan geri gelir:
int m = Integer.MAX_VALUE;
m = m + 1;
System.out.println(m);
-2147483648
char bir sayıdır
Her karakterin bir kodu var (Unicode). Ezber için üç tane yeter: 'A' = 65, 'a' = 97, '0' = 48. char ile aritmetik yapınca sonuç int olur.
char c = 'A';
System.out.println(c + 1); // char + int = int
System.out.println((char) (c + 1)); // tekrar char'a çevir
System.out.println('a' + 'b'); // 97 + 98, iki sayı
System.out.println("" + 'a' + 'b'); // önce String, sonra birleştirme
char c2 = 'A';
c2++; // ++ char olarak kalır
System.out.println(c2);
System.out.println((int) '0');
66
B
195
ab
B
48
TUZAK · iki char toplamı.
'a' + 'b'sonucuabdeğil,195.+iki tarafta da String yoksa toplama yapar. Birleştirme istiyorsan başa""koy.
Tip dönüşümü ve casting
Genişletme (widening conversion): küçük tipten büyüğe otomatik olur, veri kaybı yoktur. Sıra: byte → short → int → long → float → double.
Daraltma (narrowing conversion): büyükten küçüğe. Veri kaybı olabileceği için derleyici zorla ister: cast yazarsın. Cast ondalık kısmı keser (truncate), yuvarlamaz.
int i = 7;
double dd = i; // widening, otomatik
System.out.println(dd);
double x = 9.99;
int t = (int) x; // narrowing, cast şart
System.out.println(t);
System.out.println((int) -3.7); // sıfıra doğru keser
System.out.println((int) 3.7 + (int) 2.6); // 3 + 2
System.out.println((int) (3.7 + 2.6)); // (int) 6.3
System.out.println(Math.round(3.7)); // yuvarlama böyle yapılır
7.0
9
-3
5
6
4
Cast yazmazsan:
int x = 2.5 * 2;
float f = 1.5;
Narrow.java:3: error: incompatible types: possible lossy conversion from double to int
int x = 2.5 * 2;
^
Narrow.java:4: error: incompatible types: possible lossy conversion from double to float
float f = 1.5;
^
2 errors
2.5 * 2 = 5.0 olsa bile tipi double’dır; derleyici değere değil tipe bakar.
printf ile biçimli çıktı
System.out.printf bir biçim metni (format string) alır, içindeki % ile başlayan belirteçlerin (format specifier) yerine argümanları sırayla koyar. println gibi otomatik satır atlamaz; satır sonu için %n (ya da \n) yazarsın.
| Belirteç | Ne için | Örnek | Çıktı |
|---|---|---|---|
%d | int, long | printf("%d", 42) | 42 |
%f | double (6 basamak) | printf("%f", 2.5) | 2.500000 |
%.2f | double, 2 basamak | printf("%.2f", 78.456) | 78.46 |
%s | String | printf("%s", "Ali") | Ali |
%c | char | printf("%c", 'Z') | Z |
%b | boolean | printf("%b", false) | false |
%5d | genişlik 5, sağa yaslı | printf("[%5d]", 42) | [ 42] |
%-5d | genişlik 5, sola yaslı | printf("[%-5d]", 42) | [42 ] |
%8.2f | genişlik 8, 2 basamak | printf("[%8.2f]", 3.14159) | [ 3.14] |
String name = "Deniz";
int score = 87;
double avg = 78.456;
System.out.printf("%s scored %d points%n", name, score);
System.out.printf("Average: %.2f%n", avg);
System.out.printf("Average: %.1f%n", avg);
Deniz scored 87 points
Average: 78.46
Average: 78.5
TUZAK ·
%.2fyuvarlar, cast keser.printf("%.1f", 78.456)→78.5. Ama(int) 78.9→78. İkisini karıştırma.
İPUCU · Türkçe bilgisayarda virgül. printf sistemin yerel ayarını (locale) kullanır. Türkçe ayarlı bir bilgisayarda
%.2fsonucu78,46diye virgülle basılabilir. Sınavda İngilizce kabul edilir: nokta yaz.
Çözümlü örnek: takas (swap)
İki değişkenin değerini değiştirmek için üçüncü bir kutu gerekir. Yoksa biri kaybolur.
int a = 3, b = 8;
int temp = a; // a'nın değerini sakla
a = b;
b = temp;
System.out.println(a + " " + b);
8 3
a b temp
başlangıç 3 8 -
temp = a 3 8 3
a = b 8 8 3
b = temp 8 3 3
Sık yapılan hatalar
| Yanlış düşünce | Doğrusu |
|---|---|
String primitive bir tiptir | Sınıftır; primitive’ler 8 tane, hepsi küçük harf |
char c = "A"; | char tek tırnak: 'A' |
'A' + 1 → B | 66; B için (char) ('A' + 1) |
(int) 9.99 → 10 | 9, cast keser |
int x = 5.0; derlenir, değer tam | Derlenmez; tip double |
float f = 1.5; | 1.5f yazılmalı |
MAX_VALUE + 1 hata verir | Sessizce MIN_VALUE olur |
| printf satır atlar | Atlamaz; %n ekle |
printf("%d", 2.5) | %d sadece tam sayı; double için %f |
a = b; b = a; takas eder | İkisi de b olur; temp kullan |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
What is printed?
int p = 5;
int q = p;
p = 10;
System.out.println(p + " " + q);Cevabı göster
q = p satırında p'nin o anki değeri (5) q'ya kopyalanır. Sonra p'yi değiştirmek q'yu etkilemez. Primitive değişkenler birbirine bağlı değildir.
What is printed?
System.out.printf("%d-%d%n", 7, 3);Cevabı göster
printf biçim metnini (format string) aynen yazar, %d gördüğü yere sırayla argümanları koyar: önce 7, sonra 3. - sıradan bir karakter. %n satır sonu.
What is printed?
System.out.printf("Total: %.2f%n", 12.0 / 7);Cevabı göster
12.0 / 7 = 1.7142857... %.2f virgülden sonra 2 basamak gösterir ve yuvarlar: 1.714 → 1.71.
What is printed?
System.out.printf("[%4d][%-4d]%n", 7, 7);Cevabı göster
%4d sayıyı 4 karakterlik alana sağa yaslı yazar: 3 boşluk + 7. %-4d eksi işaretiyle sola yaslar: 7 + 3 boşluk. Köşeli parantezler sadece boşlukları görebilmek için.
What is printed?
char ch = 'C';
System.out.println(ch + 2);
System.out.println((char) (ch + 2));Cevabı göster
E
'C' karakterinin kodu 67. char + int işleminin sonucu int: 67 + 2 = 69, ekrana sayı basılır. İkinci satırda 69 tekrar char'a çevrilir: 69 = 'E'.
What is printed?
System.out.println('x' + "y" + 'z');
System.out.println('x' + 'y' + "z");Cevabı göster
241z
Birinci satır: 'x' + "y" → String "xy", sonra + 'z' → "xyz". İkinci satırda soldan sağa ilk işlem iki char: 'x' (120) + 'y' (121) = 241, sayı toplamı. Sonra 241 + "z" = "241z".
What is printed?
double v = 5.9;
int w = (int) v * 2;
int w2 = (int) (v * 2);
System.out.println(w + " " + w2);Cevabı göster
Cast sadece hemen sağındakine uygulanır. (int) v = 5 (kesilir), 5 * 2 = 10. İkincide önce parantez: 5.9 * 2 = 11.8, sonra (int) → 11.
What is printed?
int r = 2147483647;
r++;
System.out.println(r);Cevabı göster
2147483647 int'in en büyük değeri (Integer.MAX_VALUE). Bir artırınca taşma (overflow) olur ve değer en küçük int'e, -2147483648'e döner. Java hata vermez, sessizce sarar.
What is printed?
int k = 4;
double z = k / 8;
double z2 = k / 8.0;
System.out.println(z + " " + z2);Cevabı göster
k / 8 iki int: 4 / 8 = 0, double'a atanınca 0.0. k / 8.0 double bölme: 0.5.
Which lines cause a compile-time error?
int a = 2.5 * 2; // line 1
double b = 7; // line 2
float c = 1.5; // line 3
long d = 100; // line 4Cevabı göster
Satır 1: 2.5 * 2 double, int'e otomatik atanamaz (possible lossy conversion from double to int). Satır 3: 1.5 literali double'dır, float'a sığmaz; 1.5f yazılmalı. Satır 2 ve 4 genişletme (widening): int → double ve int → long otomatik ve güvenli.
The code below is meant to swap s1 and s2. What is printed, and what is the fix?
int s1 = 1, s2 = 2;
s1 = s2;
s2 = s1;
System.out.println(s1 + " " + s2);Cevabı göster
s1 = s2 ile s1'in eski değeri (1) kaybolur, ikisi de 2 olur. Sonra s2 = s1 yine 2. Doğru takas için geçici değişken (temp) gerekir: int temp = s1; s1 = s2; s2 = temp; → 2 1.
What is printed?
System.out.printf("%s is %d years old and has a %.1f GPA%n", "Ali", 20, 3.456);Cevabı göster
Argümanlar sırayla yerleşir: %s ← "Ali", %d ← 20, %.1f ← 3.456 tek basamağa yuvarlanır: 3.5. Argüman sayısı ve tipleri belirteçlerle (specifier) uyuşmalı; %d yerine double verirsen program çalışırken hata verir.
Doğrulama: Tüm kod parçaları JDK 26 ile çalıştırıldı (verify/SEN1001/W02a.java). Derleme hataları verify/SEN1001/err/Narrow.java ve Uninit.java javac ile derlenerek alındı. printf çıktıları en_US yerel ayarında (locale) alındı.