Skip to content

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örAdı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ğı:

ÖncelikOperatö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

  1. 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
  2. Yeni proje aç (dotnet new console -o ifadeler) ve her ifadeyi bir Console.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?)
  3. Şu üç satırı ekle, çıktıyı önce tahmin et:
    var a = 10;
    var b = a++;
    Console.WriteLine($"a={a} b={b}");   // beklediğin: a=? b=?
    Sonra a++'ı ++a yapıp farkı gör.
  4. 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.