Bölüm 3 / 15
Operatörler ve ifadeler
Aritmetik, karşılaştırma, mantıksal, öncelik.
9 dakikalık okuma
Değişkenler değerleri saklar; bu ders o değerlerle iş yapmayı
öğretir. Dört operatör ailesini kuracağız: aritmetik, atama, karşılaştırma ve mantıksal.
Aralarda yazılı sınavların en verimli tuzakları var: tamsayı bölmesinin sonucu neden 3,
"2" + 3 neden 23, a++ ile ++a neden farklı ve
5 + 3 * 2 neden 16 değil. Dersin sonunda karşılaştırma ve mantık
operatörleriyle bool ifadeler kurabiliyor olacaksın — bir sonraki dersin (koşullar)
hammaddesi budur.
01Ne öğreneceksin
- Aritmetik operatörler ve iki tuzağı: tamsayı bölmesi ile string'e
+uygulanması %(mod) operatörünün pratik kullanımları: çift/tek, basamak alma, döngüsel sayaç- Karşılaştırma ve mantıksal operatörlerle bool ifade kurmak; kısa devre davranışı
- İşlem önceliği tablosu ve parantezle niyet beyanı
02Operatör, operand, ifade
Terimler kısa: operatör işlemi yapan simgedir (+,
*, ==), operand işleme giren değerlerdir,
ikisinin birleşimi geçen dersten tanıdığın ifadeyi oluşturur — hesaplanır ve
bir değer üretir. Kritik nokta şu: her ifadenin ürettiği değerin bir tipi
vardır. 4 + 3 int üretir, 4.0 + 3 double,
4 > 3 ise bool. Bu ders boyunca soracağın iki soru hep aynı: bu ifade
hangi değeri ve hangi tipte üretir?
03Aritmetik: + − * / %
Dört işlem beklendiği gibidir; sürprizler bölmede ve beşinci operatörde:
Console.WriteLine(7 + 2); // 9
Console.WriteLine(7 - 2); // 5
Console.WriteLine(7 * 2); // 14
Console.WriteLine(7 / 2); // 3 ← dikkat: 3.5 değil
Console.WriteLine(7 % 2); // 1 ← kalan (mod)
Tamsayı bölmesi: iki operand da int ise sonuç da int'tir — ondalık kısım
hesaplanmaz, atılır. 7 / 2 = 3. Ondalıklı sonuç istiyorsan operandlardan
en az biri ondalıklı olmalıdır:
Console.WriteLine(7.0 / 2); // 3.5 — operand double
Console.WriteLine((double)7 / 2); // 3.5 — cast ile (geçen ders)
int dogru = 85, soru = 120;
Console.WriteLine(dogru / soru); // 0 ← klasik hata
Console.WriteLine((double)dogru / soru); // 0.7083...
Son örnek gerçek hayattan: başarı oranı hesaplayan kodun 0 basması, tamsayı
bölmesinin en sık görüldüğü yerdir. Cast'in yalnızca dogru'ya
uygulandığına dikkat et: (double)(dogru / soru) yazsaydın bölme önce
int olarak yapılır, 0'a döner, sonra 0.0'a çevrilirdi — parantezin yeri sonucu
değiştirir.
% (mod) bölmeden kalanı verir ve göründüğünden çok işe yarar:
Console.WriteLine(10 % 3); // 1 (10 = 3*3 + 1)
Console.WriteLine(8 % 2); // 0 → 8 çifttir (kalan 0)
Console.WriteLine(7 % 2); // 1 → 7 tektir
Console.WriteLine(247 % 10); // 7 → son basamak
Console.WriteLine(13 % 12); // 1 → saat 13:00, 12'lik kadranda 1
Üç kalıbı ezbere bil: x % 2 == 0 çiftlik testi, x % 10
son basamak, x % n 0..n-1 aralığında dönen döngüsel sayaç. Üçü de hem
yazılı sorularında hem döngü alıştırmalarında (5. ders) tekrar tekrar çıkacak.
04Atama kısayolları: += ve ++
Geçen dersin kalıbı x = x + 5; o kadar sık kullanılır ki kısayolu
vardır; her aritmetik operatörün bileşik atama biçimi bulunur:
var puan = 100;
puan += 20; // puan = puan + 20 → 120
puan -= 50; // 70
puan *= 2; // 140
puan /= 4; // 35
puan %= 8; // 3
Bir artırma ve bir azaltmanın ayrıca tek karakterlik biçimi vardır:
puan++ ve puan--. Operatör öne de yazılabilir
(++puan) ve fark yalnızca aynı satırda değeri kullanırsan ortaya
çıkar: sonek (a++) önce eski değeri verir sonra artırır; önek
(++a) önce artırır sonra yeni değeri verir:
var a = 5;
var b = a++; // b = 5, a = 6 (önce kullan, sonra artır)
var c = ++a; // c = 7, a = 7 (önce artır, sonra kullan)
Pratik kural: ++'ı kendi satırında tek başına kullan (döngü sayaçları
dahil); değeri aynı anda hem artırıp hem kullanmak okunabilirliği bozar. Ayrımı yine
de bil — yazılı sınav klasiğidir.
05Karşılaştırma: sonuç her zaman bool
Altı karşılaştırma operatörü vardır; hepsi bool üretir:
Console.WriteLine(7 > 3); // True
Console.WriteLine(7 < 3); // False
Console.WriteLine(7 >= 7); // True
Console.WriteLine(7 <= 6); // False
Console.WriteLine(7 == 7); // True (eşit mi?)
Console.WriteLine(7 != 3); // True (farklı mı?)
En önemli ayrım: = atamadır, == karşılaştırmadır.
"x 5'e eşit mi?" demek isteyip x = 5 yazmak dillerin çoğunda sinsi bir
hatadır; C#'ta tip güvenliği burada da korur — if (x = 5) yazarsan
"int, bool'a çevrilemez" derleme hatası alırsın, çünkü atama ifadesi int üretir, if
ise bool bekler. String'ler de == ile karşılaştırılır ve içerik
karşılaştırılır: "ali" == "ali" True, "Ali" == "ali" False
(büyük-küçük harf farklı). Karşılaştırmanın sonucu bir değişkende saklanabilir:
int puan = 85;
bool gectiMi = puan >= 70; // True
Console.WriteLine(gectiMi);
06Mantıksal: &&, ||, !
Karşılaştırmalar tek soru sorar; gerçek koşullar çoğu zaman birleşiktir: "70'ten büyük ve 100'den küçük", "öğrenci veya emekli". Bool değerleri üç operatör birleştirir:
| Operatör | Adı | Sonuç ne zaman true? |
|---|---|---|
&& | ve (AND) | İki taraf da true ise |
|| | veya (OR) | En az bir taraf true ise |
! | değil (NOT) | Operandı tersine çevirir |
int puan = 85;
bool aralikta = puan >= 0 && puan <= 100; // True: iki koşul da sağlandı
bool sinirDurum = puan < 5 || puan > 95; // False: ikisi de sağlanmadı
bool kaldiMi = !(puan >= 70); // False: True'nun tersi
Aralık kontrolünün yazımına dikkat: matematikteki 0 ≤ puan ≤ 100
programda iki ayrı karşılaştırma olarak yazılır ve && ile
bağlanır. 0 <= puan <= 100 yazmak C#'ta derleme hatasıdır (ilk
karşılaştırma bool üretir, bool 100 ile karşılaştırılamaz).
Kısa devre: && sol taraf false çıkarsa sağ tarafı
hiç hesaplamaz (sonuç zaten false); || sol taraf true çıkarsa sağı
atlar. Buna kısa devre (short-circuit) denir. Yalnızca performans inceliği değildir;
sağ tarafı koşullu koruma altına alır — "önce güvenlik kontrolü, sonra riskli işlem"
kalıbı bununla yazılır ve örneklerini null konusunda (Hat 03, cs-null) sık
göreceksin.
07Öncelik: hangi işlem önce?
Bir ifadede birden çok operatör varsa sıra matematikten tanıdık kurala benzer biçimde öncelik tablosuyla belirlenir. Bilmen gereken kadarı, yukarıdan aşağı:
| Öncelik | Operatörler |
|---|---|
| 1 — en önce | () parantez içi |
| 2 | !, ++, --, cast |
| 3 | * / % |
| 4 | + - |
| 5 | < <= > >= |
| 6 | == != |
| 7 | && |
| 8 — en sonra | || |
Console.WriteLine(5 + 3 * 2); // 11 — çarpma önce
Console.WriteLine((5 + 3) * 2); // 16 — parantez sırayı değiştirdi
Console.WriteLine(10 - 4 - 3); // 3 — aynı öncelik soldan sağa
Console.WriteLine(true || false && false); // True — && önce: true || false
Son örneği çözümle: && öncelikte ||'dan yüksektir,
bu yüzden ifade true || (false && false) olarak okunur. Meslek
kuralı: tabloyu sınav için bil, kodda ona yaslanma — karışma ihtimali olan her
ifadeyi parantezle yaz. Parantez ücretsizdir, yanlış okunan öncelik değildir.
08String'te +: birleştirme
+ operatörü operand tipine göre iş değiştirir: iki sayıyı toplar, ama
taraflardan biri string ise birleştirmeye döner ve diğer tarafı metne çevirir:
Console.WriteLine(2 + 3); // 5 — sayı + sayı: toplama
Console.WriteLine("2" + 3); // 23 — string var: birleştirme
Console.WriteLine("Puan: " + 8 + 5); // Puan: 85 — soldan sağa: önce "Puan: 8", sonra +5
Console.WriteLine("Puan: " + (8 + 5)); // Puan: 13 — parantez toplamayı öne aldı
Üçüncü satır sınav klasiğidir: işlem soldan sağa yürür, "Puan: " + 8
string ürettiği andan itibaren geri kalan her + birleştirmedir. Bu
belirsizlik, geçen derste öğrendiğin interpolation'ı tercih etmenin bir sebebi daha:
$"Puan: {8 + 5}" niyeti netleştirir — süslü parantez içi her zaman önce
hesaplanır.
09Mini alıştırma — önce tahmin, sonra doğrulama
Yaklaşık 15 dakika · kağıt + dotnet new console -o ifadeler
- Aşağıdaki 12 ifadenin sonucunu (değerini ve tipini) kağıda yaz —
çalıştırmak yok:
7 / 2 7 % 2 7.0 / 2 (double)7 / 2 (double)(7 / 2) 5 + 3 * 2 (5 + 3) * 2 20 - 8 - 4 17 % 10 "1" + 2 + 3 10 > 3 && 2 == 2 !(4 < 3) || 1 > 2 - Yeni proje aç (
dotnet new console -o ifadeler) ve her ifadeyi birConsole.WriteLine(...)içine koyup çalıştır. Her yanlış tahminin yanına bir cümle yaz: hangi kuralı yanlış uygulamışsın? (Tamsayı bölmesi mi, öncelik mi, soldan sağa mı, string birleştirme mi?) - Şu üç satırı ekle, çıktıyı önce tahmin et:
Sonravar a = 10; var b = a++; Console.WriteLine($"a={a} b={b}"); // beklediğin: a=? b=?a++'ı++ayapıp farkı gör. - Kapanış: kullanıcıdan
int.Parse(Console.ReadLine())ile üç basamaklı bir sayı al; yalnızca / ve % kullanarak yüzler, onlar ve birler basamağını ayrı satırlarda yazdır. (İpucu:sayi / 100,sayi / 10 % 10,sayi % 10.) 247 için çıktı 2, 4, 7 olmalı.
10Kendini sına
7 / 2 ve 7 % 2 kaçtır? İlkinin 3.5 olması için ne değişmeli?
7 / 2 = 3 — iki operand da int olduğu için
tamsayı bölmesi yapılır, ondalık kısım atılır. 7 % 2 = 1 — bölmeden
kalan. 3.5 için operandlardan en az biri ondalıklı olmalı: 7.0 / 2 ya da
(double)7 / 2. (double)(7 / 2) işe yaramaz: bölme önce int
olarak yapılır, 3.0 çıkar.
Kısa devre (short-circuit) nedir? Ne işe yarar?
&& sol tarafı false bulursa sağ tarafı hiç
hesaplamaz (sonuç kesinleşmiştir); || sol taraf true ise sağı atlar.
İki faydası var: gereksiz hesap yapılmaz ve sağ taraf koşullu korumaya alınır —
sol taraftaki kontrol sağlanmadan sağdaki riskli ifade hiç çalışmaz. Bu kalıp null
kontrollerinde standarttır.
5 + 3 * 2 kaçtır? true || false && false neden True'dur?
5 + 3 * 2 = 11: çarpma toplamadan önceliklidir.
İkincide &&, ||'dan önceliklidir; ifade
true || (false && false) olarak okunur ve sol taraf true olduğu
için sonuç True'dur (üstelik kısa devre nedeniyle sağ taraf hiç hesaplanmaz).
Kodda böyle ifadeleri parantezle yazmak esastır.
var b = a++; ile var b = ++a; arasındaki fark nedir (a başlangıçta 5)?
Sonek biçimi önce mevcut değeri verir, sonra artırır:
b = a++ → b=5, a=6. Önek biçimi önce artırır, sonra yeni değeri verir:
b = ++a → b=6, a=6. Fark yalnızca değer aynı ifadede kullanıldığında
görünür; a++; tek başına bir satırdaysa ikisi de aynı işi yapar.
11Sınav köşesi
Yazılıda nasıl sorulur
Bu ders yazılının en sık soru ürettiği alandır ve kalıp hep aynıdır: "İfadenin
değeri nedir?" Dört tuzağı kontrol listesi yap: (1) tamsayı bölmesi —
7/2=3, oran hesapları 0'a düşer; (2) öncelik — çarpma/bölme önce,
&& önce || sonra; (3) string birleştirme —
"1"+2+3 = "123"; (4) a++/++a — aynı ifadede
kullanımda eski/yeni değer farkı. Mod soruları da standarttır: son basamak
(%10), çift/tek (%2).
Sözlüde nasıl anlatılır — 2 dakikalık taslak
"C#'taki operatörleri sınıflandırır mısınız?" sorusuna aile aile: (1) Aritmetik
— beş işlem; tamsayı bölmesine ve mod'un pratik kullanımlarına birer cümle ayır.
(2) Atama ve bileşikleri — +=, ++. (3) Karşılaştırma —
altı operatör, hepsi bool üretir; =/== ayrımını söyle.
(4) Mantıksal — &&, ||, !; kısa
devreyi tanımla, bunun null kontrolündeki güvenlik değerine değin. Kapanış:
"Öncelik tablosunu bilirim ama üretim kodunda karışabilecek her ifadeyi parantezle
yazarım" — kural bilgisiyle mesleki olgunluğu aynı cümlede göstermiş olursun.
