Bölüm 6: Değişkenler, Veri Tipleri ve İşleçler

Bilgisayar ve Programlamaya Giriş
DeğişkenTipDönüşümİşleçGirdi/Çıktı
Sercan KÜLCÜ · Giresun Üniversitesi

Giriş

Öğrenme Çıktıları

Değişken

Değişken bildirmek, ilk değer vermek ve güncellemek.

Tip

İlkel tipleri ve değer aralıklarını seçmek.

İfadeler

Atama, dönüşüm ve işleçleri doğru kullanmak.

Girdi/Çıktı

Scanner ile girdi almak, printf ile biçimli çıktı üretmek.

Veri

Değişkenler

20yasad (tanımlayıcı)değer(değişebilir)tip: int → 32 bitlik yer ayrılırint yas = 20;
  • Değişken, belirli tipteki bir değere bellekte ayrılmış adlı bir kutudur.
  • Bildirim tip ve adı; ilk değer verme başlangıç değerini belirtir.
  • Tip, kutunun boyutunu ve içine konabilecek değerleri belirler.
  • Yerel değişken kullanılmadan önce kesin olarak değer almış olmalıdır.

Veri

Temel Tip Grupları

GrupÖrnekKullanım
Tam sayıbyte, short, int, longSayma ve ayrık değer
Kayan noktalıfloat, doubleÖlçüm ve yaklaşık hesap
KaraktercharTek UTF-16 kod birimi
Mantıksalbooleantrue / false
ReferansString, dizi, sınıfNesneye referans
Java tipleriİlkel (8 tip)ReferansTam sayıbyte shortint longKayan noktalıfloat doubleKaraktercharMantıksalbooleanStringdizisınıfdeğişken nesnenin kendisini değil,ona referansı tutardeğer doğrudan değişkenin kutusunda durur

Veri Tipleri

İlkel Veri Tipleri

TipYaklaşık kullanımÖrnek
byte / shortKüçük tam sayılarbyte seviye = 7;
intGenel tam sayıint adet = 42;
longBüyük tam sayılong nufus = 8_000_000L;
floatKayan noktalı, düşük hassasiyetfloat oran = 1.5F;
doubleGenel kayan noktalı sayıdouble fiyat = 19.90;
char / booleanKarakter ve mantıkchar not='A';

Veri Tipleri

Tip Boyutları (bit)

016324864bit sayısıbyte8-128 … 127short16-32.768 … 32.767char160 … 65.535int32≈ ±2,1 milyarlong64≈ ±9,2 × 10¹⁸float32≈ 7 anlamlı basamakdouble64≈ 15–16 anlamlı basamakbooleantrue / false — boyutu JVM'e bağlı

Vurgulu: varsayılan seçimler (int, double). 1 bayt = 8 bit; boyutlar her platformda aynıdır.

Veri Tipleri

Tam Sayı Tipi Seçimi

  • int çoğu tam sayı hesabı için varsayılan seçimdir; long sabitleri L sonekiyle yazılır.
  • Aralığı aşan tam sayı işlemi taşar: Java hata vermez, değer sessizce öbür uca sarar.
  • Integer.MAX_VALUE + 1 → -2147483648.
  • Büyük değerler bekleniyorsa baştan long seçilir.
12701111111+ 100000001−12810000000işaret bitibyte (8 bit) örneği

Veri · Kodu adım adım çalıştır

Taşma: Integer.MAX_VALUE + 1

işaret biti ↓x01111111111111111111111111111111int: 32 bit. En büyük değer 2.147.483.647 (2³¹ − 1)

Integer.MAX_VALUE: işaret biti 0, diğer 31 bitin hepsi 1. int için ulaşılabilecek en büyük sayı.

x01111111111111111111111111111111+ 100000000000000000000000000000001x10000000000000000000000000000000x = −2.147.483.648 (en küçük int)

x++ ile 1 eklenir: bitler taşar ve işaret biti 1 olur. Sonuç hata değil, −2147483648: sayı çember gibi başa sarar.

işaret biti ↓b01111111byte: 8 bit. Aralık −128 … 127

byte 8 bitliktir: en büyük değeri 127 (0111 1111).

b01111111+ 100000001b10000000b = −128 (en küçük byte)

b++ ile 127 + 1: bitler 1000 0000 olur → −128. Aynı sarma, sadece daha küçük kutuda.

Bellek (değişkenler)x-2147483648intb-128byte

Çıktı: -2147483648 -128. İki değişken de en büyük değerden en küçüğe sardı.

Java taşmada hata vermez, sessizce sarar!Math.addExact(x, 1)→ ArithmeticException: integer overflow

Taşma ne derleme hatası ne de çalışma zamanı hatasıdır. Taşma istenmiyorsa Math.addExact gibi metotlar istisna fırlatır.

int x = Integer.MAX_VALUE;
x++;
byte b = 127;
b++;
System.out.println(x + " " + b);

Veri

Sınır Sabitleri ve Math.addExact

SabitDeğer
Integer.MIN_VALUE-2147483648
Integer.MAX_VALUE2147483647
Long.MIN_VALUE-9223372036854775808
Long.MAX_VALUE9223372036854775807
int x = Integer.MAX_VALUE;
System.out.println(x + 1);
// -2147483648 (sessiz taşma)
System.out.println(
    Math.addExact(x, 1));
// ArithmeticException:
// integer overflow
  • Sabitler elle yazılmaz: Integer.MAX_VALUE hem okunaklıdır hem hatasızdır.
  • Math.addExact taşmayı yakalar: int için integer overflow, long için long overflow iletisiyle istisna fırlatır.
  • Math.abs(Integer.MIN_VALUE) de taşar ve yine -2147483648 verir.

Veri Tipleri

Kayan Noktalı Sayılar

  • double çoğu yaklaşık hesap için varsayılan tiptir; float sabiti F soneki ister.
  • İkili kayan nokta bazı ondalık değerleri (0.1 gibi) tam temsil edemez.
  • Para gibi kesin ondalık hesaplarda uygun sınıf (BigDecimal) ve yuvarlama kuralı seçilmelidir.
0.10.10000000000000000555…0.20.20000000000000001110…bellekte saklanan en yakın ikili değer0.1 + 0.2 → 0.30000000000000004bu yüzden double değerler == ile karşılaştırılmaz

Veri Tipleri · Kodu adım adım çalıştır

Kayan Noktalı Sayı Karşılaştırma

0.1 ve 0.2 ikili tabanda tam gösterilemez; toplam 0.3 değil, ona çok yakın bir değerdir.

Yazdırınca küçük hata görünür: 0.30000000000000004.

a == 0.3 → false. Aynı sonuç 0.1 + 0.2 == 0.3 için de geçerlidir. Kayan noktalı sayılar == ile karşılaştırılmaz.

Fark yaklaşık 5.55E-17 olduğu için Math.abs(a - 0.3) < 1e-9 → true. Fark küçük bir eşikle (epsilon) sınanır.

double a = 0.1 + 0.2;
System.out.println(a);
System.out.println(a == 0.3);
System.out.println(Math.abs(a - 0.3) < 1e-9);

Veri Tipleri

char ve boolean

  • char tek tırnakla yazılır; bir UTF-16 kod birimini (sayı olarak) saklar: 'A' = 65.
  • String çift tırnakla yazılan bir nesnedir; değişken nesneye referans tutar. char ile aynı tip değildir.
  • boolean yalnızca true veya false değerini alır; 0/1 ile yer değiştirmez.
char harf = 'A';'A'= 65 (Unicode)0000000001000001String metin = "A";String nesnesi"A"referansboolean aktif = true;trueyalnızca true / false

Veri · Kodu adım adım çalıştır

char Aritmetiği: Harfler Sayıdır

Unicode kod noktaları'A'65'B'66'C'67'D'68▲ c

c = 'A'. char aslında bir sayıdır: 'A' için Unicode kod noktası 65.

Unicode kod noktaları'A'65'B'66'C'67'D'68▲ c

c++ kod noktasını 1 artırır: 65 → 66, yani c = 'B'. Tip hâlâ char.

Unicode kod noktaları'A'65'B'66'C'67'D'68▲ c▲ k = 67c + 1: c int'e yükselir, 66 + 1 = 67 (int)

c + 1 ifadesi int olur (66 + 1 = 67). k bir int olduğundan 67 sayısını tutar, harf değil.

Unicode kod noktaları'A'65'B'66'C'67'D'68▲ c▲ d(char)(c + 1): 67 tekrar char'a çevrilir → 'C'

Sonucu harf olarak saklamak için (char) dönüşümü gerekir: d = 'C'. Dönüşüm olmazsa char d = c + 1; derlenmez.

Bellek (değişkenler)c'B'chark67intd'C'char

Çıktı: B 67 C. char yazdırılırken harf, int yazdırılırken sayı görünür.

char c = 'A';
c++;
int k = c + 1;
char d = (char)(c + 1);
System.out.println(c + " " + k + " " + d);

Değişkenler

Tanımlayıcı Kuralları

KuralGeçerliGeçersiz
Harf, _ veya $ ile başlarogrenci11ogrenci
Boşluk içermeztoplamPuantoplam puan
Anahtar sözcük değildirsinifNoclass
Tek alt çizgi ad olamaz_deger_
Büyük-küçük harfe duyarlıpuan ve PuanAynı değişken sanmak

Değişkenler

Adlandırma

  • Değişken ve metot adlarında lowerCamelCase kullanılır.
  • Sınıf adları UpperCamelCase biçimindedir.
  • Sabitler genellikle BÜYÜK_HARF_VE_ALT_ÇİZGİ ile adlandırılır.
  • Ad, değerin rolünü açıklamalıdır: x yerine toplamPuan.
lowerCamelCasedeğişken ve metottoplamPuanint toplamPuan = 0;UpperCamelCasesınıfOgrenciKaydiclass OgrenciKaydi { }BÜYÜK_HARFsabit (final)MAKSIMUM_PUANfinal int MAKSIMUM_PUAN = 100;Rolü anlat:x✗→toplamPuan✓Kelime sınırını büyük harf (ya da sabitte _) gösterir.

Değişkenler

Bildirim ve İlk Değer

int yas;          // bildirim
yas = 20;        // atama
double ortalama = 82.5; // birlikte
final int MAKSIMUM = 100; // sabit
1 · bildirimyas?tip: intdeğer yok: okunamaz2 · atamayas20tip: intartık okunabilir3 · bildirim + ilk değerortalama82.5tip: doubletek satırda4 · sabitMAKSIMUM100tip: final intyeniden atanamazsonra
  • Yerel değişken okunmadan önce değer almalıdır.
  • final değişkene yalnızca bir kez atama yapılır.

Değişkenler · Kodu adım adım çalıştır

Değişkenler Bellekte Adım Adım

Bellek (değişkenler)yas?int

Bildirim: int tipinde yas kutusu ayrılır ama değeri yok. Bu hâliyle okunursa derleyici hata verir.

Bellek (değişkenler)yas20int

İlk atama: sağdaki 20 değeri yas kutusuna yazılır.

Bellek (değişkenler)yas20intİfadeyas + 120 + 1→ 21

Önce sağ taraf hesaplanır: yas + 1 → 20 + 1 → 21. Kutu henüz değişmedi.

Bellek (değişkenler)yas21int

Sonuç aynı kutuya yazılır: eski 20 silinir, yas = 21.

Bellek (değişkenler)yas21intortalama82.5double

double tipinde ortalama bildirilir ve aynı deyimde 82.5 atanır.

Bellek (değişkenler)yas21intortalama82.5doubleİfadeortalama + 582.5 + 5→ 87.5

ortalama += 5, ortalama = ortalama + 5 demektir: 82.5 + 5 → 87.5.

Bellek (değişkenler)yas21intortalama87.5double

Kutu güncellenir: ortalama = 87.5.

Bellek (değişkenler)yas21intortalama87.5doubleMAKSIMUM100final int

final sabit: 100 bir kez atanır. MAKSIMUM = 200; yazılsaydı derleme hatası olurdu.

Bellek (değişkenler)yas21intortalama87.5doubleMAKSIMUM100final int

yas kutusu okunur ve 21 yazdırılır. Okuma değeri değiştirmez.

Bellek (değişkenler)yas21intortalama87.5doubleMAKSIMUM100final int

ortalama okunur: 87.5. Son durum: 3 kutu, 2 satır çıktı.

int yas;                  // bildirim
yas = 20;                 // ilk atama
yas = yas + 1;            // güncelleme
double ortalama = 82.5;   // bildirim + ilk değer
ortalama += 5;            // bileşik atama
final int MAKSIMUM = 100; // sabit
System.out.println(yas);
System.out.println(ortalama);

Veri

Atama ve Güncelleme

  • Atama işleci = önce sağ tarafı hesaplar, sonra değeri soldaki değişkene yazar.
  • Yeni değer değişkenin tipiyle uyumlu olmalıdır.
  • Bileşik atama mevcut değeri kullanarak günceller: toplam += fiyat ≡ toplam = toplam + fiyat.
toplam50intfiyat20inttoplam += fiyat;

Başlangıç: toplam = 50, fiyat = 20.

toplam50intfiyat20inttoplam + fiyat → 50 + 20 → 70

Önce iki kutu okunur ve sağ taraf hesaplanır.

toplam70intfiyat20inttoplam ← 70

Sonuç soldaki kutuya yazılır: toplam = 70. fiyat değişmez.

Dönüşüm

Atama Uyumluluğu

byteshortintlongfloatdoublegenişletme (otomatik): soldan sağachardaraltma: açık dönüşüm gerekir → int x = (int) 9.8; // 9long → float: aralık genişler, basamak kaybı olabilir
  • Dar tipten geniş tipe dönüşüm (genişletme) otomatik yapılır: double d = 7;
  • Daraltma bilgi kaybı riski taşıdığı için açık dönüşüm (cast) ister.
  • Dönüşüm kaynak değişkeni değiştirmez; yalnızca üretilen sonucu etkiler.

Dönüşüm

Tip Dönüşümü

int adet = 7;
double genis = adet;       // 7.0
double oran = 9.8;
int dar = (int) oran;      // 9
int bolum = 5 / 2;         // 2
double dogru = 5.0 / 2;    // 2.5
Genişletme (otomatik)7int · 32 bitkayıpsız7.0double · 64 bitdouble genis = adet;Daraltma (açık dönüşüm)9.8double(int)9int.8 atılır (yuvarlanmaz)
  • double değerini int'e çevirmek kesir bölümünü atar.
  • İşlemden sonra yapılan dönüşüm kaybolan kesri geri getirmez.

Dönüşüm · Kodu adım adım çalıştır

Tip Dönüşümü Adım Adım

Bellek (değişkenler)adet7intadet ← 7

adet: int kutusu (32 bit), değer 7.

Bellek (değişkenler)adet7intgenis7.0double(int) 7  →  (double) 7.0

Genişletme: int değer double kutuya otomatik dönüşür: 7 → 7.0. Bilgi kaybı yok.

Bellek (değişkenler)adet7intgenis7.0doubleoran9.8doubleoran ← 9.8

oran: double kutusu (64 bit), değer 9.8.

Bellek (değişkenler)adet7intgenis7.0doubleoran9.8doubledar9int(int) 9.8  →  9   (kesir atıldı)

Daraltma: (int) açıkça yazılmalı. Kesir atılır (yuvarlanmaz): 9.8 → 9. oran hâlâ 9.8.

Bellek (değişkenler)adet7intgenis7.0doubleoran9.8doubledar9intbolum2intint / int  →  5 / 2  →  2

5 ve 2 ikisi de int → tam sayı bölmesi: 5 / 2 = 2, kalan atılır.

Bellek (değişkenler)adet7intgenis7.0doubleoran9.8doubledar9intbolum2intdogru2.5doubledouble / int  →  5.0 / 2.0  →  2.5

5.0 double olduğu için 2 de 2.0'a genişler: 5.0 / 2.0 = 2.5.

int adet = 7;
double genis = adet;       // 7.0
double oran = 9.8;
int dar = (int) oran;      // 9
int bolum = 5 / 2;         // 2
double dogru = 5.0 / 2;    // 2.5

Dönüşüm

Dönüşümlerde Taşma ve Kesme

İfadeSonuçNeden
(byte) 200-56sadece alt 8 bit kalır: 200 - 256
(int) 3000000000L-1294967296long → int: üst bitler atılır
(int) 3.93ondalık kısım kesilir, yuvarlanmaz
(int) -2.7-2sıfıra doğru kesilir
(int) 3.9e102147483647double → int: int sınırında sıkışır
Math.round(3.9)4en yakın tam sayı (long döner)
Math.round(-2.7)-3en yakın tam sayı
Math.round(3.9e10)39000000000long olduğu için sığar

Yuvarlamak için Math.round, int istiyorsan (int) Math.round(x). Daraltma dönüşümü hata vermez; veri sessizce kaybolur.

Dönüşüm · Kodu adım adım çalıştır

5 / 2 ile 5.0 / 2

5int/2intint / int → int

İki işlenen de int → tam sayı bölmesi: bölüm alınır, kesir atılır.

5int/2int→2int

Sonuç 2 (int) yazdırılır.

5.0double/2intint işlenen double'a genişler

Bir işlenen double → diğeri de double'a yükseltilir (2 → 2.0). Kayan noktalı bölme yapılır.

5.0double/2int→2.5double

Sonuç 2.5 (double) yazdırılır.

5int/2.0doubleint işlenen double'a genişler

Bir işlenen double → diğeri de double'a yükseltilir (5 → 5.0). Kayan noktalı bölme yapılır.

5int/2.0double→2.5double

Sonuç 2.5 (double) yazdırılır.

(double)5int→5.0double

Tip dönüşümü /'dan önce gelir: (double) 5 → 5.0.

5.0double/2intint işlenen double'a genişler

Bir işlenen double → diğeri de double'a yükseltilir (2 → 2.0). Kayan noktalı bölme yapılır.

5.0double/2int→2.5double

Sonuç 2.5 (double) yazdırılır.

5int/2int→2int

Parantez içi önce: 5 / 2, ikisi de int → tam sayı bölmesi = 2. Kesir burada kaybolur.

(double)2int→2.0double

Sonra (double) 2 → 2.0. Kaybolan .5 geri gelmez.

(double)2int→2.0double

2.0 yazdırılır: işlemden sonra yapılan dönüşüm kesri kurtarmaz.

5int%2intint % int → int

İki işlenen de int → kalan: 5 = 2·2 + 1.

5int%2int→1int

Sonuç 1 (int) yazdırılır.

System.out.println(5 / 2);
System.out.println(5.0 / 2);
System.out.println(5 / 2.0);
System.out.println((double) 5 / 2);
System.out.println((double) (5 / 2));
System.out.println(5 % 2);

Dönüşüm

Tip Yükseltme Sırası

byte8 bitshort16 bitint32 bitlong64 bitfloat32 bitdouble64 bitchar16 bit (işaretsiz)Oklar yönünde dönüşüm otomatiktir · ters yönde açık (tip) dönüşümü gerekirlong → float: kesinlik kaybı olabilir
  • Karma ifadede küçük tip, büyük tipe otomatik yükselir: int + double → double.
  • byte, short, char işlemde önce int olur; bu yüzden b + 1 bir int'tir.
  • Okun tersi (daraltma) için açık (tür) dönüşümü gerekir.

İşleçler

Aritmetik İşleçler

İşleçAnlamÖrnek
+ -Toplama / çıkarmaa + b
* /Çarpma / bölmea * b
%Kalansayi % 2
++ --Bir artır / azalti++
+= -=Bileşik atamatoplam += değer
1. grup2. grup3. grupartan17 / 5 = 317 % 5 = 2

İşleçler

Sıfıra Bölme ve Özel Değerler

İfadeSonuçAçıklama
1 / 0ArithmeticException: / by zerotam sayı bölmesinde sıfıra bölme çalışma zamanı hatasıdır
1.0 / 0Infinityondalıkta hata yok: sonsuz
-1.0 / 0-Infinityeksi sonsuz
0.0 / 0NaNNot a Number: tanımsız sonuç
NaN == NaNfalseNaN kendine bile eşit değildir
NaN != NaNtrueNaN kontrolü için Double.isNaN(x)
-7 % 3-1kalanın işareti bölünenin işaretidir
5.5 % 21.5% kayan noktalı sayılarda da çalışır

Tam sayıda 1 / 0 programı durdurur; ondalıkta Infinity ve NaN sessizce üretilir ve sonraki işlemlere taşınır.

İşleçler · Kodu adım adım çalıştır

Artırma ve Azaltma: i++ ile ++i

Bellek (değişkenler)i5inta?intb?int

i = 5.

Bellek (değişkenler)i5inta5intb?intİfadei++değer 5, sonra i + 1

Sonek i++: ifadenin değeri i'nin eski değeridir → a = 5.

Bellek (değişkenler)i6inta5intb?int

Ardından i artırılır: i = 6.

Bellek (değişkenler)i7inta5intb?intİfade++ii = 7

Önek ++i: önce i artırılır → i = 7.

Bellek (değişkenler)i7inta5intb7int

İfadenin değeri yeni değerdir → b = 7.

Bellek (değişkenler)i6inta5intb7int

i-- tek başına bir deyim: önek/sonek farkı önemsiz → i = 6.

Bellek (değişkenler)i6inta5intb7int

Çıktı: 6 5 7. ++ ve -- tek başına bir deyim olarak kullanıldığında kod daha kolay okunur.

int i = 5;
int a = i++;   // önce kullan, sonra artır
int b = ++i;   // önce artır, sonra kullan
i--;
System.out.println(i + " " + a + " " + b);

İşleçler · Kodu adım adım çalıştır

Bileşik Atama Örtük Dönüşüm Yapar

Bellek (değişkenler)b10byte

b = 10: 8 bitlik byte kutusu.

b += 5 ≡ b = (byte)(b + 5)b + 5int ifadesi10 + 5 = 15int(byte) 15byte'a daralt

b += 5 derleyicide b = (byte)(b + 5) olur: toplama int ile yapılır, sonuç otomatik byte'a daraltılır → b = 15.

Bellek (değişkenler)b15bytei5int

i = 5 (int).

i += 3.7 ≡ i = (int)(i + 3.7)i + 3.7double ifadesi5 + 3.7 = 8.7double(int) 8.7kesir atılır

i += 3.7 de örtük bir dönüşüm yapar: 8.7 hesaplanır, (int) ile kesir atılır → i = 8 (yuvarlama yok).

b = b + 5;b + 5 → int (byte + int = int)error: incompatible types: possible lossy conversion from int to byte

Bileşik atama olmadan b = b + 5; derlenmez: b + 5 int olur ve int → byte dönüşümü örtük yapılmaz. Bu satır yorum olarak duruyor.

Bellek (değişkenler)b15bytei8int

Çıktı: 15 8.

byte b = 10;
b += 5;
int i = 5;
i += 3.7;
// b = b + 5;   // derlenmez: int → byte
System.out.println(b + " " + i);

İşleçler

Karşılaştırma ve Mantık

İşleçAnlamÖrnek
== !=Eşit / farklıa == b
< <= > >=Sıra karşılaştırmasınot >= 60
&&İki koşul da doğruyas >= 18 && belgeVar
||En az biri doğruhaftaSonu || tatil
!Mantıksal değil!aktif
pqp && qp || q
falsefalsefalsefalse
falsetruefalsetrue
truefalsefalsetrue
truetruetruetrue

Karşılaştırma işleçlerinin sonucu her zaman boolean'dır.

İşleçler

İşleç Önceliği

  • Parantez içi önce değerlendirilir; tekli ! ve tip dönüşümü de önce gelir.
  • Çarpma, bölme ve kalan; toplama ve çıkarmadan önce gelir.
  • Karşılaştırmalar aritmetikten, && / || karşılaştırmadan sonra değerlendirilir.
  • Aynı düzeyde soldan sağa gidilir (atama hariç). Parantez niyeti görünür kılar.
( )parantez!  ++  --  (tip)tekli*  /  %çarpımsal+  -toplamsal<  <=  >  >=sıra==  !=eşitlik&&ve||veya=  +=  -=atama

İşleçler · Adım adım

İfade Ağacı: 2 + 3 * 4 > 10 && 7 % 2 == 1

2+3*4>10&&7%2==12 + 3 * 4 > 10 && 7 % 2 == 1

Derleyici ifadeyi önceliğe göre bir ağaca dönüştürür: en alttaki işlem en önce, kök (&&) en son hesaplanır.

2+3124>10&&7%2==12 + 12 > 10 && 7 % 2 == 1

*, +'dan önce gelir: 3 * 4 = 12.

2143124>10&&7%2==114 > 10 && 7 % 2 == 1

sonra toplama: 2 + 12 = 14.

2143124true10&&7%2==1true && 7 % 2 == 1

Karşılaştırma: 14 > 10 → true (boolean). Sol taraf true: && sağ tarafa geçer.

2143124true10&&712==1true && 1 == 1

sağ tarafta önce kalan: 7 % 2 = 1.

2143124true10&&712true1true && true

Karşılaştırma: 1 == 1 → true (boolean).

2143124true10true712true1true

Kök: true && true → true. Sol taraf true olduğu için sağ taraf da hesaplanmak zorundaydı.

İşleçler · Kodu adım adım çalıştır

Karma İfade: a / b * 2.0 + a % b

Bellek (değişkenler)a7intb2int

a = 7, b = 2 (int).

a / b * 2.0 + a % bönce / * % (soldan sağa), sonra +

/, *, % aynı öncelikte ve soldan sağa işlenir; + hepsinden sonra gelir.

3 * 2.0 + a % ba / b = 7 / 2 = 3 (int / int → tam sayı bölmesi)

İlk: a / b iki int olduğundan tam sayı bölmesi: 7 / 2 = 3 (0.5 kesri atılır).

6.0 + a % b3 * 2.0 = 6.0 (int → double, sonuç double)

Sonra 3 * 2.0: 3, double'a yükselir → 6.0.

6.0 + 1a % b = 7 % 2 = 1 (kalan, int)

+'nın sağ tarafı: 7 % 2 = 1 (kalan).

7.06.0 + 1 = 7.0 (1 → 1.0, double)

Son: 6.0 + 1: int, double'a yükselir → 7.0; r = 7.0 (double).

Bellek (değişkenler)a7intb2intr7.0double

Çıktı: 7.0. Tam sayı bölmesi yüzünden 3 × 2.0 = 6.0 çıktı; a / 2.0 olsaydı 3.5 × 2.0 + 1 = 8.0 olurdu. Sıra ve tipler sonucu belirler.

int a = 7, b = 2;
double r = a / b * 2.0 + a % b;
System.out.println(r);

İşleçler

Kısa Devre Değerlendirme

int a = 10, b = 0;
if (b != 0 && a / b > 2) {
    System.out.println("Oran büyük");
}
b = 0 iken:b != 00 != 0 → falsetrue isea / b > 2hiç hesaplanmazfalse: sonuç zaten bellikoşul = falseif gövdesi atlanır
  • && ilk koşul false ise ikinci koşulu çalıştırmaz: sonuç zaten false.
  • b = 0 iken a / b çalışsaydı ArithmeticException (sıfıra bölme) oluşurdu; kısa devre bunu önler.
  • || ilk koşul true ise ikincisine bakmaz. Bu yüzden koşulların sırası önemlidir.

İşleçler · Kodu adım adım çalıştır

Kısa Devre Adım Adım: b = 0 ve b = 2

a10intb0intb != 0&&a / b > 2

a = 10, b = 0.

a10intb0intb != 0false&&a / b > 2

Sol koşul: b != 0 → 0 != 0 → false.

a10intb0intb != 0false&&a / b > 2çalıştırılmadı→ false

Kısa devre: false && (herhangi) → false. Sağ taraf hiç çalışmaz; a / b yapılmadığı için sıfıra bölme hatası da olmaz.

a10intb0intb != 0false&&a / b > 2çalıştırılmadı→ false

Koşul false → blok atlanır, hiçbir şey yazılmaz.

a10intb2intb != 0&&a / b > 2

b = 2 yapılır ve aynı if yeniden denenir.

a10intb2intb != 0true&&a / b > 2

Sol koşul: 2 != 0 → true. Sonuç henüz belli değil, sağ taraf da hesaplanmalı.

a10intb2intb != 0true&&a / b > 25 > 2 → true→ true

Sağ koşul: a / b → 10 / 2 = 5; 5 > 2 → true. true && true → true.

a10intb2intb != 0true&&a / b > 25 > 2 → true→ true

Bloğa girilir: Oran büyük. Koşullar ters yazılsaydı (a / b > 2 && b != 0) b = 0 iken program çökerdi.

int a = 10, b = 0;
if (b != 0 && a / b > 2) {
    System.out.println("Oran büyük");
}
b = 2;
if (b != 0 && a / b > 2) {
    System.out.println("Oran büyük");
}

Veri

Tipler Farklı Davranır

System.out.println(2 + 3);       // 5
System.out.println("2" + "3");   // 23
System.out.println("Sonuç: " + 2 + 3); // Sonuç: 23
System.out.println("Sonuç: " + (2 + 3)); // Sonuç: 5
  • İşleç davranışı işlenen tiplerine bağlıdır.
  • Parantez değerlendirme sırasını açıklaştırır.

Veri · Kodu adım adım çalıştır

"Sonuç: " + 2 + 3 Adım Adım

2int+3int→5int

2 + 3: iki int → sayısal toplama.

5int

Çıktı: 5.

"2"String+"3"String→"23"String

"2" + "3": işlenenlerden biri String → birleştirme: 3 metne eklenir.

"23"String

Çıktı: 23.

"Sonuç: "String+2int+3int→"Sonuç: 2"String

"Sonuç: " + 2: işlenenlerden biri String → birleştirme: 2 metne eklenir. + soldan sağa değerlendirilir: önce ilk ikisi.

"Sonuç: 2"String+3int→"Sonuç: 23"String

"Sonuç: 2" + 3: işlenenlerden biri String → birleştirme: 3 metne eklenir.

"Sonuç: 23"String

Çıktı: Sonuç: 23. 3 de metne eklendi; 2 + 3 hiç toplanmadı.

2int+3int→5int

Parantez önce: 2 + 3, iki int → toplama = 5.

"Sonuç: "String+5int→"Sonuç: 5"String

Sonra "Sonuç: " + 5 → String varsa birleştirme → "Sonuç: 5".

"Sonuç: 5"String

Çıktı: Sonuç: 5. Parantez, toplamanın önce yapılmasını sağladı.

System.out.println(2 + 3);
System.out.println("2" + "3");
System.out.println("Sonuç: " + 2 + 3);
System.out.println("Sonuç: " + (2 + 3));

Girdi

Scanner ile Girdi

Scanner klavye = new Scanner(System.in);
System.out.print("Yaş: ");
int yas = klavye.nextInt();
klavye.nextLine(); // satır sonunu tüket
System.out.print("Ad: ");
String ad = klavye.nextLine();
girdi tamponu(kullanıcı: 20⏎ Ada⏎)20\nAda\nnextInt() → 20nextLine() → ""nextLine() → "Ada"1. nextInt sayıyı alır, \n kalır2. boş nextLine onu tüketir3. sonraki nextLine adı okur
  • Dosyanın başında import java.util.Scanner; gerekir.
  • nextInt sayıyı, nextLine tüm satırı okur.
  • Farklı okuma metotları birlikte kullanılırken kalan satır sonuna dikkat edilir.

Girdi · Kodu adım adım çalıştır

Scanner Girdi Akışı Adım Adım

klavye → System.in tamponu▲okuma konumutampon boş

Scanner nesnesi klavyeye (System.in) bağlanır. Tampon boş.

klavye → System.in tamponu▲okuma konumutampon boş

print istemi yazar; satır sonu yok, imleç "Yaş: " arkasında.

klavye → System.in tamponu20⏎▲okuma konumu⏳ kullanıcı yazıyor…

nextInt() tampon boş olduğu için bekler. Kullanıcı 20 yazıp Enter'a basar: tampona "20⏎" girer.

klavye → System.in tamponu20⏎▲okuma konumuokunan: 20

nextInt yalnızca sayıyı (20) okur; ⏎ tamponda kalır.

klavye → System.in tamponu20⏎▲okuma konumuokunan: ""

nextLine() ⏎'e kadar okur: boş dizgi ("") döner ve ⏎ tüketilir. Tampon temizlendi.

klavye → System.in tamponu20⏎▲okuma konumu

İstem "Ad: " yazılır.

klavye → System.in tamponu20⏎Ada Yılmaz⏎▲okuma konumu⏳ kullanıcı yazıyor…

nextLine tampon boş olduğu için bekler; kullanıcı Ada Yılmaz yazar ve Enter'a basar.

klavye → System.in tamponu20⏎Ada Yılmaz⏎▲okuma konumuokunan: "Ada Yılmaz"

nextLine tüm satırı (boşluk dahil) okur: ad = "Ada Yılmaz". ⏎ tüketilir, satıra dahil edilmez.

Scanner klavye = new Scanner(System.in);
System.out.print("Yaş: ");
int yas = klavye.nextInt();
klavye.nextLine(); // satır sonunu tüket
System.out.print("Ad: ");
String ad = klavye.nextLine();

Girdi · Kodu adım adım çalıştır

Satır Sonu Tüketilmezse

klavye → System.in tamponu▲okuma konumutampon boş

Scanner nesnesi klavyeye (System.in) bağlanır. Tampon boş.

klavye → System.in tamponu▲okuma konumutampon boş

print istemi yazar; satır sonu yok, imleç "Yaş: " arkasında.

klavye → System.in tamponu20⏎▲okuma konumu⏳ kullanıcı yazıyor…

nextInt() tampon boş olduğu için bekler. Kullanıcı 20 yazıp Enter'a basar: tampona "20⏎" girer.

klavye → System.in tamponu20⏎▲okuma konumuokunan: 20

nextInt yalnızca sayıyı (20) okur; ⏎ tamponda kalır.

klavye → System.in tamponu20⏎▲okuma konumu

İstem "Ad: " yazılır.

klavye → System.in tamponu20⏎▲okuma konumuokunan: ""

Tamponda hâlâ ⏎ var: nextLine beklemeden boş dizgi döner. ad = "". Kullanıcıya ad sorulamadı!

klavye → System.in tamponu20⏎▲okuma konumu

Çıktı []: ad boş. Çözüm: nextInt'ten sonra bir klavye.nextLine(); ile ⏎'i tüketmek.

Scanner klavye = new Scanner(System.in);
System.out.print("Yaş: ");
int yas = klavye.nextInt();
System.out.print("Ad: ");
String ad = klavye.nextLine();
System.out.println("[" + ad + "]");

Girdi

Girdi Doğrulama

  • Kullanıcının her zaman beklenen tipte değer gireceği varsayılmamalıdır.
  • Aralık ve iş kuralı doğrulaması tip kontrolünden sonra yapılır.
  • Hata iletisi beklenen biçimi açıkça söylemeli ve yeniden deneme yolu sunmalıdır.
girdiyi okutam sayı mı?hata:tiphayırevet0 ≤ yas ≤ 150 ?hata:aralıkhayırevetkabul ethata → iletiyi göster, yeniden sor

Çıktı

Biçimli Çıktı: printf

String ad = "Ada";
double ortalama = 87.456;
System.out.printf("%-10s %6.2f%n", ad, ortalama);
%-10ssola yasla10 karakter · dizgiad → "Ada"␣boşluk%6.2f6 karakter2 ondalık · sağa yaslaortalama → 87.456%nsatır sonuA1d2a3·4·5·6·7·8·9·10·11·12813714.1541661710 karakter: "Ada" + 7 boşluk6 karakter: " 87.46"87.456 → 87.46: yuvarlanır (kesilmez)

%s dizgi · %d tam sayı · %f kayan noktalı · %n satır sonu. Türkçe yerel ayarda ondalık ayırıcı virgüldür (87,46); derste nokta (Locale.US) kullanılır. Türkçe ayarda nextDouble() “37,5” bekler, “37.5” InputMismatchException verir.

Çıktı · Kodu adım adım çalıştır

printf Biçimini Adım Adım Çözümle

Biçim dizgisi: 3 biçim belirteci, 2 sabit karakter, 1 satır sonu%-8s|%6.2f|%05d%nargümanlar sırayla: "Ada", 3.14159, 42her % belirteci bir argümanı tüketir; | düz metindir

Biçim dizgisi soldan sağa taranır: %... biçim belirteçleri sırayla argümanlarla doldurulur, diğer karakterler olduğu gibi yazılır.

%-8s ← "Ada"Ada␣␣␣␣␣genişlik 8, - = sola yaslı, 5 boşluk eklenir

%-8s: dizgi, 8 karakter genişliğinde; - sola yaslar → "Ada " (3 harf + 5 boşluk).

| sabit, %6.2f ← 3.14159|␣␣3.14genişlik 6, noktadan sonra 2 basamak, sağa yaslı

| aynen yazılır. %6.2f: 3.14159 → 2 basamağa yuvarlanır (3.14), 6 karaktere sağa yaslanır (2 boşluk). Türkçe yerel ayarda 3,14 yazılır.

| sabit, %05d ← 42|00042genişlik 5, 0 bayrağı = soldan sıfırla doldur

%05d: tam sayı, 5 karakter genişliğinde; 0 bayrağı boşluk yerine sıfır koyar → 00042.

SonuçAda | 3.14|00042%n: satır sonu · ondalık ayırıcı yerel ayara bağlı: Locale.US → 3.14, tr → 3,14

%n satır sonu ekler. Çıktı: Ada | 3.14|00042. Ondalık ayırıcı yerel ayara bağlıdır; nokta için Locale.US verilir.

System.out.printf("%-8s|%6.2f|%05d%n",
                  "Ada", 3.14159, 42);

Örnekler

Math Sınıfı

İfadeSonuçAçıklama
Math.PI3.141592653589793π sabiti
Math.sqrt(16)4.0karekök (double)
Math.pow(2, 10)1024.0üs alma (double)
Math.abs(-7)7mutlak değer
Math.max(3, 8)8büyük olan (min: küçük)
Math.round(2.5)3en yakın tam sayı (long)
Math.round(-2.5)-2yarım değer yukarı yuvarlanır
-3-2-10123round(2.5) = 3round(-2.5) = -2yarım değer hep +∞ yönüne

Math, java.lang paketindedir: import gerekmez. sqrt ve pow her zaman double döndürür.

Örnek · Kodu adım adım çalıştır

İki Değişkeni Takas Etme

Bellek (değişkenler)a5intb8int

a = 5, b = 8. Hedef: değerleri takas etmek (a = 8, b = 5).

Bellek (değişkenler)a8intb8intİfadea ← ba = 8

a = b → a = 8. a'nın eski değeri 5 silindi!

Bellek (değişkenler)a8intb8intİfadeb ← ab = 8

b = a → b = 8. 5 artık hiçbir kutuda yok.

Bellek (değişkenler)a8intb8int

Çıktı 8 8: takas başarısız. Bir değeri korumak için üçüncü bir kutu gerekir.

Bellek (değişkenler)a5intb8int

Değerler yeniden 5 ve 8 yapıldı.

Bellek (değişkenler)a5intb8intgecici5intİfadegecici ← a

gecici = a → gecici = 5: a'nın değeri güvende.

Bellek (değişkenler)a8intb8intgecici5intİfadea ← b

a = b → a = 8.

Bellek (değişkenler)a8intb5intgecici5intİfadeb ← gecici

b = gecici → b = 5.

Bellek (değişkenler)a8intb5intgecici5int

Çıktı 8 5: takas tamam. 3 atama ve 1 geçici değişken gerekti.

int a = 5, b = 8;
a = b;                // yanlış deneme
b = a;
System.out.println(a + " " + b);
a = 5; b = 8;         // baştan
int gecici = a;       // doğru yöntem
a = b;
b = gecici;
System.out.println(a + " " + b);

Örnek · Kodu adım adım çalıştır

Celsius → Fahrenheit: 100, 37, −40

Bellek (değişkenler)c100.0doublef?double

1. çalıştırma: kullanıcı 100 girer; nextDouble → c = 100.0.

Bellek (değişkenler)c100.0doublef?doubleİfadec * 9 / 5 + 32900.0 / 5 + 32→ 212.0

Soldan sağa: c * 9 = 900.0, / 5 = 180.0, + 32 = 212.0.

Bellek (değişkenler)c100.0doublef212.0double

printf %.1f ile bir ondalık basamak: 100.0 C = 212.0 F. 9 / 5 * c yazılsaydı 9 / 5 = 1 (tam sayı bölmesi) olurdu!

Bellek (değişkenler)c37.0doublef?double

2. çalıştırma: kullanıcı 37 girer; nextDouble → c = 37.0.

Bellek (değişkenler)c37.0doublef?doubleİfadec * 9 / 5 + 32333.0 / 5 + 32→ 98.6

Soldan sağa: c * 9 = 333.0, / 5 = 66.6, + 32 = 98.6.

Bellek (değişkenler)c37.0doublef98.6double

printf %.1f ile bir ondalık basamak: 37.0 C = 98.6 F.

Bellek (değişkenler)c-40.0doublef?double

3. çalıştırma: kullanıcı -40 girer; nextDouble → c = -40.0.

Bellek (değişkenler)c-40.0doublef?doubleİfadec * 9 / 5 + 32-360.0 / 5 + 32→ -40.0

Soldan sağa: c * 9 = -360.0, / 5 = -72.0, + 32 = -40.0.

Bellek (değişkenler)c-40.0doublef-40.0double

printf %.1f ile bir ondalık basamak: -40.0 C = -40.0 F. −40 iki ölçekte aynıdır.

Scanner klavye = new Scanner(System.in);
double c = klavye.nextDouble();
double f = c * 9 / 5 + 32;
System.out.printf("%.1f C = %.1f F%n", c, f);

Örnek · Kodu adım adım çalıştır

Daire Alanı ve Çevresi: r = 2.5

rr2.5doublealan?doublecevre?double

Yarıçap r = 2.5.

rr2.5doublealan19.634954doublecevre?doubleπ · r²≈ 19.635

Alan = π · r · r = 3.14159… · 2.5 · 2.5 = 19.634954084936208. Math.PI hazır sabittir.

rr2.5doublealan19.634954doublecevre15.707963double2 · π · r≈ 15.708

Çevre = 2 · π · r = 15.707963267948966.

rr2.5doublealan19.634954doublecevre15.707963double

%.2f iki basamağa yuvarlar: 19.63. Değişkendeki değer değişmez.

rr2.5doublealan19.634954doublecevre15.707963double

Çevre: 15.71 (15.7079… → 15.71).

double r = 2.5;
double alan = Math.PI * r * r;
double cevre = 2 * Math.PI * r;
System.out.printf("Alan: %.2f%n", alan);
System.out.printf("Çevre: %.2f%n", cevre);

Örnek · Kodu adım adım çalıştır

Saniye → saat:dakika:saniye (3725)

Bellek (değişkenler)toplam3725intsaat?intkalan?intdakika?intsaniye?int

toplam = 3725 saniye.

Bellek (değişkenler)toplam3725intsaat1intkalan?intdakika?intsaniye?int

saat = toplam / 3600 → 3725 / 3600 = 1 (tam sayı bölmesi: kaç tane tam saat).

Bellek (değişkenler)toplam3725intsaat1intkalan125intdakika?intsaniye?int

kalan = toplam % 3600 → 3725 % 3600 = 125 (kalan: artan kısım saat).

Bellek (değişkenler)toplam3725intsaat1intkalan125intdakika2intsaniye?int

dakika = kalan / 60 → 125 / 60 = 2 (tam sayı bölmesi: kaç tane tam dakika).

Bellek (değişkenler)toplam3725intsaat1intkalan125intdakika2intsaniye5int

saniye = kalan % 60 → 125 % 60 = 5 (kalan: artan kısım dakika).

Bellek (değişkenler)toplam3725intsaat1intkalan125intdakika2intsaniye5int

%02d: en az 2 hane, boşluk yerine 0 ile doldur → 1:02:05. Sağlama: 1·3600 + 2·60 + 5 = 3725.

int toplam = 3725;
int saat = toplam / 3600;
int kalan = toplam % 3600;
int dakika = kalan / 60;
int saniye = kalan % 60;
System.out.printf("%d:%02d:%02d%n",
                  saat, dakika, saniye);

Hata Ayıklama

Yaygın Hatalar

HataÖrnekNe olur?
= ile == karışırif (x = 5)Derleme hatası: int, boolean değil
Tam sayı bölmesidouble o = 7 / 2;o = 3.0, 3.5 değil
Kapsam dışı kullanım{ int k = 1; } k++;k blok dışında tanımsız
Yanlış noktalı virgülif (x > 0);Boş deyim: koşul hiçbir şeyi kontrol etmez
String ve ==s1 == s2İçeriği değil, referansı karşılaştırır → s1.equals(s2)

Özet

Bölüm Özeti

  • Değişken, belirli tipteki bir değere anlamlı bir ad verir ve okunmadan önce değer almalıdır.
  • İlkel tipler farklı değer kümeleri ve bellek gereksinimleri taşır.
  • Genişletme otomatik yapılır; daraltma açık dönüşüm ister ve bilgi kaybettirebilir.
  • İşleç önceliği ve işlenen tipleri ifadenin sonucunu doğrudan belirler.
  • Kullanıcı girdisi hem tip hem iş kuralı açısından doğrulanmalıdır.

Özet

Kontrol Soruları

  1. int ve double bölmesi nasıl farklı sonuç verir?
  2. Daraltıcı dönüşüm neden açıkça yazılır?
  3. "Sonuç: " + 2 + 3 ifadesi neden Sonuç: 23 yazdırır?
  4. && işleci kısa devreyi nasıl kullanır?
  5. nextInt sonrasında nextLine kullanırken neye dikkat edilir?

Özet

Alıştırmalar

  1. Kenarları klavyeden okunan dikdörtgenin alanını ve çevresini yazdırın.
  2. Kilometreyi mile çevirin (1 mil = 1,609 km); sonucu %.2f ile yazdırın.
  3. Üç notun ortalamasını hesaplayın. (n1 + n2 + n3) / 3 neden hatalı olabilir? Düzeltin.
  4. Dört basamaklı bir sayının basamakları toplamını % ve / ile bulun (1234 → 10).
  5. Kuruş cinsinden bir tutarı lira ve kuruşa ayırın (1575 → 15 lira 75 kuruş).
  6. Takası geçici değişken olmadan a = a + b; b = a - b; a = a - b; ile izleyin. Taşma riski var mı?

Özet

Kaynaklar

Son

Değişkenler, Veri Tipleri ve İşleçler
Sonraki sunum: Koşullu İfadeler · Çalışma soruları · Simülatör: İfade Değerlendirici · Terim sözlüğü
1 / 1Sercan KÜLCÜ, Tüm hakları saklıdır.