<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-19T06:05:38+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Diferansiyel Sürüşlü Robotlar Tekerlek Hızı Farkıyla Nasıl Döner?</title><link href="https://program.sonsuz.us/posts/diferansiyel-suruslu-robotlar-tekerlek-hizi-farkiyla-nasil-doner/" rel="alternate" type="text/html" title="Diferansiyel Sürüşlü Robotlar Tekerlek Hızı Farkıyla Nasıl Döner?" /><published>2026-10-19T00:00:00+00:00</published><updated>2026-10-19T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/diferansiyel-suruslu-robotlar-tekerlek-hizi-farkiyla-nasil-doner</id><content type="html" xml:base="https://program.sonsuz.us/posts/diferansiyel-suruslu-robotlar-tekerlek-hizi-farkiyla-nasil-doner/"><![CDATA[<p>Diferansiyel sürüşlü bir robotun direksiyonu yoktur; buna rağmen kıvrak biçimde dönebilir, hatta olduğu yerde kendi ekseni etrafında dans edebilir. Bu yeteneğin sırrı, sağ ve sol tekerleklerin farklı hızlarda döndürülmesidir. Alışveriş arabasını tek taraftan daha güçlü ittiğinizi düşünün: hız farkı, aracın yönünü değiştirir.</p>

<p><img src="/img/diferansiyel-suruslu-robotlar-65.svg" alt="diferansiyel-suruslu-robotlar-65" /></p>

<p>``</p>
<h2 id="temel-mekanik-düzen">Temel mekanik düzen</h2>

<p>Bu robotlarda aynı eksen üzerinde bulunan iki bağımsız tahrik tekerleği vardır. Tekerlekler arasındaki mesafeye <strong>iz genişliği</strong> veya dingil uzunluğu denir ve genellikle $L$ ile gösterilir. Sol tekerleğin doğrusal hızı $v_l$, sağ tekerleğinki ise $v_r$ olsun.</p>

<p>Robotun merkezinin ileri yönlü doğrusal hızı iki tekerlek hızının ortalamasıdır:</p>

\[v = (v_r + v_l) / 2\]

<p>Açısal hız ise tekerlekler arasındaki hız farkıyla belirlenir:</p>

\[ω = (v_r - v_l) / L\]

<p>Bu ikinci denklem robotun dönüş mantığını özetler. Hız farkı büyüdükçe robot daha hızlı döner. Tekerlekler arası mesafe büyüdükçe aynı hız farkıyla elde edilen açısal hız azalır; çünkü geniş bir robotu çevirmek daha zordur.</p>

<table>
  <thead>
    <tr>
      <th>Sol ve sağ hız ilişkisi</th>
      <th>Robotun davranışı</th>
      <th style="text-align: right">Açısal hız</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$v_l = v_r &gt; 0$</td>
      <td>Düz ileri gider</td>
      <td style="text-align: right">$0$</td>
    </tr>
    <tr>
      <td>$v_l &lt; v_r$</td>
      <td>Sola döner</td>
      <td style="text-align: right">Pozitif</td>
    </tr>
    <tr>
      <td>$v_l &gt; v_r$</td>
      <td>Sağa döner</td>
      <td style="text-align: right">Negatif</td>
    </tr>
    <tr>
      <td>$v_l = -v_r$</td>
      <td>Olduğu yerde döner</td>
      <td style="text-align: right">En yüksek</td>
    </tr>
    <tr>
      <td>$v_l = v_r = 0$</td>
      <td>Durur</td>
      <td style="text-align: right">$0$</td>
    </tr>
  </tbody>
</table>

<p>Buradaki sağ ve sol yön işaretleri, kullanılan koordinat sistemine göre ters tanımlanabilir. Önemli olan yazılımın ve matematiksel modelin aynı işaret kuralını kullanmasıdır.</p>

<h2 id="görünmez-dönüş-merkezi-icc">Görünmez dönüş merkezi: ICC</h2>

<p>Robot viraj alırken iki tekerlek aynı merkez çevresinde fakat farklı yarıçaplarda yay çizer. Bu ortak noktaya <strong>Anlık Dönüş Merkezi</strong> ya da ICC denir. İç taraftaki tekerlek daha kısa, dış taraftaki tekerlek daha uzun yol aldığı için dış tekerlek daha hızlı dönmelidir.</p>

<p>Robot merkezinin dönüş yarıçapı $R$, açısal hız sıfır değilken şöyle bulunabilir:</p>

\[R = v / ω = L(v_r + v_l) / (2(v_r - v_l))\]

<p>Tekerlek hızları birbirine yaklaştığında paydadaki fark küçülür ve $R$ büyür; robot geniş bir yay çizer. Hızlar eşit olduğunda yarıçap teorik olarak sonsuza gider, yani hareket düz bir çizgiye dönüşür. Hızlar eşit büyüklükte ve zıt yönlü olduğundaysa $v=0$ olur; dönüş merkezi robotun tam ortasına gelir.</p>

<h2 id="basit-bir-hız-hesabı">Basit bir hız hesabı</h2>

<p>Aşağıdaki Python fonksiyonu, tekerlek hızlarından robotun doğrusal ve açısal hızını hesaplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">robot_hizi</span><span class="p">(</span><span class="n">sol_hiz</span><span class="p">,</span> <span class="n">sag_hiz</span><span class="p">,</span> <span class="n">tekerlek_araligi</span><span class="p">):</span>
    <span class="n">dogrusal_hiz</span> <span class="o">=</span> <span class="p">(</span><span class="n">sag_hiz</span> <span class="o">+</span> <span class="n">sol_hiz</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
    <span class="n">acisal_hiz</span> <span class="o">=</span> <span class="p">(</span><span class="n">sag_hiz</span> <span class="o">-</span> <span class="n">sol_hiz</span><span class="p">)</span> <span class="o">/</span> <span class="n">tekerlek_araligi</span>
    <span class="k">return</span> <span class="n">dogrusal_hiz</span><span class="p">,</span> <span class="n">acisal_hiz</span>

<span class="n">v</span><span class="p">,</span> <span class="n">omega</span> <span class="o">=</span> <span class="nf">robot_hizi</span><span class="p">(</span><span class="mf">0.20</span><span class="p">,</span> <span class="mf">0.40</span><span class="p">,</span> <span class="mf">0.30</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">omega</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu örnekte robotun doğrusal hızı $0.30\ m/s$, açısal hızı yaklaşık $0.67\ rad/s$ olur. Sağ tekerlek daha hızlı olduğu için robot sola yönelir.</p>

<p>Motorlar genellikle doğrusal hız yerine açısal tekerlek hızıyla kontrol edilir. Tekerlek yarıçapı $r$ ve motor açısal hızı $ω_w$ ise doğrusal hız:</p>

\[v_w = rω_w\]

<p>bağıntısıyla bulunur. Böylece enkoderden ölçülen dönüş hızı, robot kinematiğinde kullanılabilir.</p>

<h2 id="gerçek-dünya-neden-formüllerden-daha-huysuzdur">Gerçek dünya neden formüllerden daha huysuzdur?</h2>

<p>Teorik model tekerleklerin kaymadığını varsayar. Gerçekte zemin sürtünmesi, motor farklılıkları, pil gerilimi ve ağırlık dağılımı dönüşü etkiler. Aynı PWM değeri iki motorda aynı hızı üretmeyebilir. Bu nedenle enkoder geri bildirimi ve PID kontrolü kullanılarak her tekerleğin hedef hızı ayrı ayrı korunur.</p>

<p>Kısacası diferansiyel sürüş, mekanik olarak sade fakat matematiksel olarak güçlüdür: ortalama hız robotu ilerletir, hız farkı ise döndürür. İki motorun uyumlu anlaşmazlığı, robotun tüm yön kabiliyetini oluşturur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="diferansiyel sürüş" /><category term="kinematik" /><category term="tekerlek hızı" /><category term="python" /><category term="mobil robotlar" /><summary type="html"><![CDATA[Diferansiyel sürüşlü bir robotun direksiyonu yoktur; buna rağmen kıvrak biçimde dönebilir, hatta olduğu yerde kendi ekseni etrafında dans edebilir. Bu yeteneğin sırrı, sağ ve sol tekerleklerin farklı hızlarda döndürülmesidir. Alışveriş arabasını tek taraftan daha güçlü ittiğinizi düşünün: hız farkı, aracın yönünü değiştirir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/diferansiyel-suruslu-robotlar-65.png" /><media:content medium="image" url="https://program.sonsuz.us/img/diferansiyel-suruslu-robotlar-65.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Fırtınada Bile Gören Robotlar: Otonom Araçlarda Sensör Füzyonu</title><link href="https://program.sonsuz.us/posts/firtinada-bile-goren-robotlar-otonom-araclarda-sensor-fuzyonu/" rel="alternate" type="text/html" title="Fırtınada Bile Gören Robotlar: Otonom Araçlarda Sensör Füzyonu" /><published>2026-10-19T00:00:00+00:00</published><updated>2026-10-19T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/firtinada-bile-goren-robotlar-otonom-araclarda-sensor-fuzyonu</id><content type="html" xml:base="https://program.sonsuz.us/posts/firtinada-bile-goren-robotlar-otonom-araclarda-sensor-fuzyonu/"><![CDATA[<p>Güneşli bir günde yolu algılamak otonom araçlar için görece kolaydır. Ancak sis çöktüğünde, yağmur kamera görüntüsünü bozduğunda veya kar taneleri LiDAR ölçümlerinde hayalet noktalar oluşturduğunda işler değişir. Sensör füzyonu, farklı sensörlerin güçlü yanlarını birleştirerek aracın tek bir ölçüme körü körüne güvenmesini önler. Kısacası ekip çalışması yapar: Kamera renkleri söyler, radar mesafeyi ölçer, LiDAR çevrenin üç boyutlu haritasını çıkarır.</p>

<p><img src="/img/firtinada-bile-goren-83.svg" alt="firtinada-bile-goren-83" /></p>

<p>``</p>

<h2 id="tek-bir-sensör-neden-yetmez">Tek Bir Sensör Neden Yetmez?</h2>

<p>Her sensör çevreyi farklı bir fiziksel ilkeye göre gözlemler. Kameralar görünür ışığı, radar elektromanyetik dalgaların yansımasını, LiDAR ise lazer darbelerinin dönüş süresini kullanır. Bu çeşitlilik aynı zamanda hata çeşitliliği demektir. Kamera sisi yoğun bir duvar gibi görebilirken radar sisin içinden çalışmayı sürdürebilir. Buna karşılık radar, nesnenin bisiklet mi yoksa trafik levhası mı olduğunu kamera kadar başarılı sınıflandıramaz.</p>

<table>
  <thead>
    <tr>
      <th>Sensör</th>
      <th>Güçlü yönü</th>
      <th>Kötü havadaki sorunu</th>
      <th>Füzyondaki rolü</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kamera</td>
      <td>Renk, şerit ve nesne sınıfı</td>
      <td>Sis, karanlık ve su damlaları</td>
      <td>Anlamsal bilgi sağlar</td>
    </tr>
    <tr>
      <td>LiDAR</td>
      <td>Hassas 3B geometri</td>
      <td>Yağmur ve karda sahte yansımalar</td>
      <td>Şekil ve konum üretir</td>
    </tr>
    <tr>
      <td>Radar</td>
      <td>Hız ve mesafe ölçümü</td>
      <td>Düşük açısal çözünürlük</td>
      <td>Zorlu havada kararlı ölçüm sağlar</td>
    </tr>
    <tr>
      <td>Ultrasonik</td>
      <td>Yakın mesafede ekonomiktir</td>
      <td>Rüzgâr ve yüzey yapısından etkilenir</td>
      <td>Park ve düşük hız desteği verir</td>
    </tr>
    <tr>
      <td>GNSS/IMU</td>
      <td>Araç konumu ve hareketi</td>
      <td>Tünel, yansıma ve sürüklenme</td>
      <td>Küresel ve göreli hareketi izler</td>
    </tr>
  </tbody>
</table>

<h2 id="güven-ağırlık-ve-olasılık">Güven, Ağırlık ve Olasılık</h2>

<p>Füzyonun temel fikri, bütün sensörlere eşit oy hakkı vermek değildir. Sistem, mevcut koşullara göre her ölçümün güvenilirliğini değerlendirir. Bir sensörün ölçümü $z_i$, güven ağırlığı $w_i$ ise basit bir birleşik tahmin şöyle yazılabilir:</p>

\[x = (w_1z_1 + w_2z_2 + ... + w_nz_n) / (w_1 + w_2 + ... + w_n)\]

<p>Yoğun siste kameranın $w$ değeri azaltılırken radarın ağırlığı artırılabilir. Daha gelişmiş sistemlerde Kalman filtresi, genişletilmiş Kalman filtresi, parçacık filtresi veya Bayesçi çıkarım kullanılır. Bayes yaklaşımı, yeni bir ölçüm geldiğinde önceki inancı günceller:</p>

\[P(x\vert z) = P(z\vert x)P(x) / P(z)\]

<p>Burada $P(x)$ önceki tahmini, $P(z\vert x)$ ölçümün bu tahmin altında görülme olasılığını, $P(x\vert z)$ ise güncellenmiş sonucu temsil eder. Böylece araç, “Radar önümde bir şey olduğunu söylüyor ama kamera emin değil” durumunu matematiksel olarak çözebilir.</p>

<h2 id="basit-bir-uyarlanabilir-füzyon-örneği">Basit Bir Uyarlanabilir Füzyon Örneği</h2>

<p>Aşağıdaki Python kodu, hava durumuna göre kamera ve radar ölçümlerinin ağırlıklarını değiştirir. Gerçek araçlarda belirsizlik kovaryans matrisleri ve zaman senkronizasyonu kullanılır; bu örnek temel mantığı görünür kılar.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">fuse_distance</span><span class="p">(</span><span class="n">camera</span><span class="p">,</span> <span class="n">radar</span><span class="p">,</span> <span class="n">weather</span><span class="p">):</span>
    <span class="c1"># Açık havada kamera daha güvenilirken siste radar öne çıkar.
</span>    <span class="n">weights</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">clear</span><span class="sh">"</span><span class="p">:</span> <span class="p">(</span><span class="mf">0.6</span><span class="p">,</span> <span class="mf">0.4</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">rain</span><span class="sh">"</span><span class="p">:</span>  <span class="p">(</span><span class="mf">0.3</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">fog</span><span class="sh">"</span><span class="p">:</span>   <span class="p">(</span><span class="mf">0.15</span><span class="p">,</span> <span class="mf">0.85</span><span class="p">)</span>
    <span class="p">}</span>

    <span class="n">camera_w</span><span class="p">,</span> <span class="n">radar_w</span> <span class="o">=</span> <span class="n">weights</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">weather</span><span class="p">,</span> <span class="p">(</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">camera</span> <span class="o">*</span> <span class="n">camera_w</span> <span class="o">+</span> <span class="n">radar</span> <span class="o">*</span> <span class="n">radar_w</span>

<span class="n">result</span> <span class="o">=</span> <span class="nf">fuse_distance</span><span class="p">(</span><span class="n">camera</span><span class="o">=</span><span class="mf">24.0</span><span class="p">,</span> <span class="n">radar</span><span class="o">=</span><span class="mf">21.5</span><span class="p">,</span> <span class="n">weather</span><span class="o">=</span><span class="sh">"</span><span class="s">fog</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Tahmini mesafe: </span><span class="si">{</span><span class="n">result</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="s"> metre</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Burada sisli havada radar ölçümü sonuca daha fazla yön verir. Fakat yalnızca hava etiketi kullanmak yeterli değildir. Kamera kontrastı, LiDAR dönüş yoğunluğu, radar sinyal-gürültü oranı ve sensör sıcaklığı gibi anlık kalite göstergeleri de ağırlıkları dinamik biçimde değiştirmelidir.</p>

<h2 id="füzyonun-gizli-kahramanları">Füzyonun Gizli Kahramanları</h2>

<p>Başarılı bir sistem için sensörlerin kalibrasyonu ve zaman eşlemesi kritiktir. Milisaniyelik gecikme, hızlı hareket eden bir aracın farklı konumlarda algılanmasına yol açabilir. Ayrıca sensörler ortak koordinat sistemine dönüştürülmelidir. Aksi hâlde radarın “ön sağ” dediği nesne, kamera görüntüsünde yanlış piksele bağlanır.</p>

<p>Sonuç olarak sensör füzyonu kötü havayı ortadan kaldırmaz; belirsizliği yönetilebilir hâle getirir. Güvenilir otonomi, en parlak sensöre sahip olmak değil, hangi sensöre ne zaman güvenileceğini bilmektir. Robotik aracın süper gücü kusursuz görmek değil, şüphe etmeyi matematikle öğrenmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="otonom araçlar" /><category term="sensör füzyonu" /><category term="lidar" /><category term="radar" /><category term="bilgisayarlı görü" /><category term="yapay zeka" /><summary type="html"><![CDATA[Güneşli bir günde yolu algılamak otonom araçlar için görece kolaydır. Ancak sis çöktüğünde, yağmur kamera görüntüsünü bozduğunda veya kar taneleri LiDAR ölçümlerinde hayalet noktalar oluşturduğunda işler değişir. Sensör füzyonu, farklı sensörlerin güçlü yanlarını birleştirerek aracın tek bir ölçüme körü körüne güvenmesini önler. Kısacası ekip çalışması yapar: Kamera renkleri söyler, radar mesafeyi ölçer, LiDAR çevrenin üç boyutlu haritasını çıkarır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/firtinada-bile-goren-83.png" /><media:content medium="image" url="https://program.sonsuz.us/img/firtinada-bile-goren-83.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Java Veri Tipleri, Değişkenler ve Diziler: Tip Güvenliğine Sağlam Bir Başlangıç</title><link href="https://program.sonsuz.us/posts/java-veri-tipleri-degiskenler-ve-diziler-tip-guvenligine-saglam-bir-baslangic/" rel="alternate" type="text/html" title="Java Veri Tipleri, Değişkenler ve Diziler: Tip Güvenliğine Sağlam Bir Başlangıç" /><published>2026-10-19T00:00:00+00:00</published><updated>2026-10-19T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/java-veri-tipleri-degiskenler-ve-diziler-tip-guvenligine-saglam-bir-baslangic</id><content type="html" xml:base="https://program.sonsuz.us/posts/java-veri-tipleri-degiskenler-ve-diziler-tip-guvenligine-saglam-bir-baslangic/"><![CDATA[<p>Java’da her verinin bir kimliği vardır: tipi! Bir değişkenin sayı mı, karakter mi yoksa mantıksal değer mi taşıyacağı önceden belirtilir. Bu yaklaşım başlangıçta biraz katı görünse de hataların daha kod çalışmadan yakalanmasını sağlar. Gelin Java’nın tip güvenliği dünyasına, değişkenlerine ve aynı türden verileri düzenleyen dizilerine yakından bakalım.
``</p>

<h2 id="java-neden-katı-tipli-bir-dildir">Java Neden Katı Tipli Bir Dildir?</h2>

<p>Java, <strong>statik ve güçlü tipli</strong> bir programlama dilidir. Statik tipleme, değişken tiplerinin derleme aşamasında bilinmesi anlamına gelir. Güçlü tipleme ise uyumsuz tipler arasında kontrolsüz işlem yapılmasını engeller.</p>

<p>Örneğin aşağıdaki kod derlenemez:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">yas</span> <span class="o">=</span> <span class="mi">25</span><span class="o">;</span>
<span class="n">yas</span> <span class="o">=</span> <span class="s">"yirmi beş"</span><span class="o">;</span> <span class="c1">// Hata: String, int değişkenine atanamaz</span>
</code></pre></div></div>

<p>Derleyicinin bu itirazı aslında dostça bir uyarıdır. Aksi hâlde program, çalışma sırasında beklenmedik sonuçlarla karşılaşabilirdi. Tip güvenliği sayesinde bir değişkenin hangi değerleri taşıyabileceği ve üzerinde hangi işlemlerin uygulanabileceği bellidir.</p>

<h2 id="i̇lkel-veri-tipleri">İlkel Veri Tipleri</h2>

<p>Java’da doğrudan değer saklayan sekiz adet <strong>primitive</strong>, yani ilkel veri tipi bulunur. Bunlar nesne değildir ve genellikle hızlı, düşük maliyetli veri işlemleri için kullanılır.</p>

<table>
  <thead>
    <tr>
      <th>Tip</th>
      <th style="text-align: right">Boyut</th>
      <th>Örnek</th>
      <th>Kullanım amacı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">byte</code></td>
      <td style="text-align: right">8 bit</td>
      <td><code class="language-plaintext highlighter-rouge">120</code></td>
      <td>Küçük tam sayılar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">short</code></td>
      <td style="text-align: right">16 bit</td>
      <td><code class="language-plaintext highlighter-rouge">30000</code></td>
      <td>Orta aralıklı tam sayılar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">int</code></td>
      <td style="text-align: right">32 bit</td>
      <td><code class="language-plaintext highlighter-rouge">42</code></td>
      <td>Genel tam sayı işlemleri</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">long</code></td>
      <td style="text-align: right">64 bit</td>
      <td><code class="language-plaintext highlighter-rouge">9000L</code></td>
      <td>Büyük tam sayılar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">float</code></td>
      <td style="text-align: right">32 bit</td>
      <td><code class="language-plaintext highlighter-rouge">3.14F</code></td>
      <td>Düşük hassasiyetli ondalık sayılar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">double</code></td>
      <td style="text-align: right">64 bit</td>
      <td><code class="language-plaintext highlighter-rouge">3.14159</code></td>
      <td>Yüksek hassasiyetli ondalık sayılar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">char</code></td>
      <td style="text-align: right">16 bit</td>
      <td><code class="language-plaintext highlighter-rouge">'A'</code></td>
      <td>Tek bir Unicode karakteri</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">boolean</code></td>
      <td style="text-align: right">JVM’e bağlı</td>
      <td><code class="language-plaintext highlighter-rouge">true</code></td>
      <td>Doğru veya yanlış durumu</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/java-veri-tipleri-59.svg" alt="java-veri-tipleri-59" /></p>

<p>$n$ bitlik işaretli bir tam sayının teorik değer aralığı şu şekilde hesaplanır:</p>

\[-2^{n-1} \leq x \leq 2^{n-1}-1\]

<p>Dolayısıyla 8 bitlik <code class="language-plaintext highlighter-rouge">byte</code>, $-128$ ile $127$ arasında değer alabilir. Daha büyük bir değer atamaya çalışmak derleme hatasına neden olur.</p>

<h2 id="değişken-tanımlama-ve-tür-dönüşümü">Değişken Tanımlama ve Tür Dönüşümü</h2>

<p>Bir değişken; tip, isim ve isteğe bağlı başlangıç değerinden oluşur:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">ogrenciSayisi</span> <span class="o">=</span> <span class="mi">24</span><span class="o">;</span>
<span class="kt">double</span> <span class="n">sicaklik</span> <span class="o">=</span> <span class="mf">21.5</span><span class="o">;</span>
<span class="kt">char</span> <span class="n">seviye</span> <span class="o">=</span> <span class="sc">'A'</span><span class="o">;</span>
<span class="kt">boolean</span> <span class="n">aktifMi</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
</code></pre></div></div>

<p>Küçük kapsamlı bir tipten daha geniş kapsamlı tipe geçiş çoğunlukla otomatik yapılır. Buna <strong>widening conversion</strong> denir. Tersi yönde ise veri kaybı oluşabileceği için açık dönüşüm gerekir.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">puan</span> <span class="o">=</span> <span class="mi">95</span><span class="o">;</span>
<span class="kt">double</span> <span class="n">ondalikliPuan</span> <span class="o">=</span> <span class="n">puan</span><span class="o">;</span> <span class="c1">// Otomatik dönüşüm</span>

<span class="kt">double</span> <span class="n">fiyat</span> <span class="o">=</span> <span class="mf">49.99</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">tamFiyat</span> <span class="o">=</span> <span class="o">(</span><span class="kt">int</span><span class="o">)</span> <span class="n">fiyat</span><span class="o">;</span>   <span class="c1">// Açık dönüşüm: sonuç 49</span>
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>Dönüşüm</th>
      <th>Örnek</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Genişletme</td>
      <td><code class="language-plaintext highlighter-rouge">int</code> → <code class="language-plaintext highlighter-rouge">double</code></td>
      <td>Genellikle güvenli</td>
    </tr>
    <tr>
      <td>Daraltma</td>
      <td><code class="language-plaintext highlighter-rouge">double</code> → <code class="language-plaintext highlighter-rouge">int</code></td>
      <td>Hassasiyet veya veri kaybı</td>
    </tr>
  </tbody>
</table>

<h2 id="diziler-aynı-tipten-verilerin-takımı">Diziler: Aynı Tipten Verilerin Takımı</h2>

<p>Dizi, aynı veri tipindeki birden fazla değeri sabit uzunlukta saklar. Java dizileri nesnedir; ancak içlerinde ilkel değerler veya nesne referansları bulunabilir.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span><span class="o">[]</span> <span class="n">notlar</span> <span class="o">=</span> <span class="o">{</span><span class="mi">85</span><span class="o">,</span> <span class="mi">90</span><span class="o">,</span> <span class="mi">72</span><span class="o">,</span> <span class="mi">100</span><span class="o">};</span>

<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">notlar</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span> <span class="c1">// 85</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">notlar</span><span class="o">.</span><span class="na">length</span><span class="o">);</span> <span class="c1">// 4</span>
</code></pre></div></div>

<p>Dizi indeksleri sıfırdan başlar. Uzunluğu $n$ olan bir dizinin geçerli indeks aralığı $0$ ile $n-1$ arasındadır. Bu sınırın dışına çıkılması <code class="language-plaintext highlighter-rouge">ArrayIndexOutOfBoundsException</code> üretir.</p>

<p>Diziler sonradan da oluşturulabilir:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">String</span><span class="o">[]</span> <span class="n">diller</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">String</span><span class="o">[</span><span class="mi">3</span><span class="o">];</span>
<span class="n">diller</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">=</span> <span class="s">"Java"</span><span class="o">;</span>
<span class="n">diller</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">=</span> <span class="s">"Kotlin"</span><span class="o">;</span>
<span class="n">diller</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span> <span class="o">=</span> <span class="s">"Python"</span><span class="o">;</span>

<span class="k">for</span> <span class="o">(</span><span class="nc">String</span> <span class="n">dil</span> <span class="o">:</span> <span class="n">diller</span><span class="o">)</span> <span class="o">{</span>
    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">dil</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Buradaki geliştirilmiş <code class="language-plaintext highlighter-rouge">for</code> döngüsü, indeks yönetmeden her elemanı sırayla okur. Dizinin uzunluğu oluşturulduktan sonra değişmez; dinamik boyut gerekiyorsa <code class="language-plaintext highlighter-rouge">ArrayList</code> tercih edilir.</p>

<p>Sonuç olarak Java’nın katı tip sistemi, programcıyı kısıtlamak için değil güvenilir kod üretmeye yönlendirmek için vardır. Doğru veri tipini seçmek belleği ve niyeti netleştirirken diziler, benzer verileri düzenli biçimde yönetmenin temelini oluşturur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="java" /><category term="veri tipleri" /><category term="değişkenler" /><category term="diziler" /><category term="tip güvenliği" /><category term="programlama" /><summary type="html"><![CDATA[Java’da her verinin bir kimliği vardır: tipi! Bir değişkenin sayı mı, karakter mi yoksa mantıksal değer mi taşıyacağı önceden belirtilir. Bu yaklaşım başlangıçta biraz katı görünse de hataların daha kod çalışmadan yakalanmasını sağlar. Gelin Java’nın tip güvenliği dünyasına, değişkenlerine ve aynı türden verileri düzenleyen dizilerine yakından bakalım.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/java-veri-tipleri-59.png" /><media:content medium="image" url="https://program.sonsuz.us/img/java-veri-tipleri-59.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Python’da *args ve **kwargs: Esneklik Okunabilirliğe Karşı</title><link href="https://program.sonsuz.us/posts/pythonda-args-ve-kwargs-esneklik-okunabilirlige-karsi/" rel="alternate" type="text/html" title="Python’da *args ve **kwargs: Esneklik Okunabilirliğe Karşı" /><published>2026-10-19T00:00:00+00:00</published><updated>2026-10-19T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/pythonda-args-ve-kwargs-esneklik-okunabilirlige-karsi</id><content type="html" xml:base="https://program.sonsuz.us/posts/pythonda-args-ve-kwargs-esneklik-okunabilirlige-karsi/"><![CDATA[<p><img src="/img/pythonda-args-ve-31.svg" alt="pythonda-args-ve-31" /></p>

<p>Python’daki <code class="language-plaintext highlighter-rouge">*args</code> ve <code class="language-plaintext highlighter-rouge">**kwargs</code>, fonksiyonlara değişken sayıda argüman gönderme özgürlüğü sağlar. Ancak bu özgürlük kontrolsüz kullanıldığında fonksiyon imzası, ne beklediğini söylemeyen gizemli bir kapıya dönüşebilir. Fonksiyon çalışır, testler geçer; fakat onu ilk kez gören geliştirici kendini “Buraya ne göndermem gerekiyor?” diye sorarken bulur.</p>

<p>``</p>

<h2 id="args-ve-kwargs-aslında-ne-yapar"><code class="language-plaintext highlighter-rouge">*args</code> ve <code class="language-plaintext highlighter-rouge">**kwargs</code> aslında ne yapar?</h2>

<p><code class="language-plaintext highlighter-rouge">*args</code>, fazladan konumsal argümanları bir <code class="language-plaintext highlighter-rouge">tuple</code> içerisinde toplar. <code class="language-plaintext highlighter-rouge">**kwargs</code> ise fazladan anahtar kelimeli argümanları bir <code class="language-plaintext highlighter-rouge">dict</code> olarak saklar. Buradaki <code class="language-plaintext highlighter-rouge">args</code> ve <code class="language-plaintext highlighter-rouge">kwargs</code> isimleri zorunlu değildir; özel davranışı oluşturan yıldızlardır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">rapor_olustur</span><span class="p">(</span><span class="n">baslik</span><span class="p">,</span> <span class="o">*</span><span class="n">satirlar</span><span class="p">,</span> <span class="o">**</span><span class="n">ayarlar</span><span class="p">):</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Rapor: </span><span class="si">{</span><span class="n">baslik</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Satır sayısı: </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">satirlar</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Ayarlar: </span><span class="si">{</span><span class="n">ayarlar</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="nf">rapor_olustur</span><span class="p">(</span>
    <span class="sh">"</span><span class="s">Aylık Satış</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">Ocak: 120</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">Şubat: 145</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">renk</span><span class="o">=</span><span class="sh">"</span><span class="s">mavi</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">pdf</span><span class="o">=</span><span class="bp">True</span>
<span class="p">)</span>
</code></pre></div></div>

<p>Bu örnekte <code class="language-plaintext highlighter-rouge">satirlar</code>, iki elemanlı bir tuple; <code class="language-plaintext highlighter-rouge">ayarlar</code> ise <code class="language-plaintext highlighter-rouge">renk</code> ve <code class="language-plaintext highlighter-rouge">pdf</code> anahtarlarını taşıyan bir sözlüktür. Teknik olarak oldukça kullanışlıdır. Sorun, fonksiyon imzasının hangi ayarların geçerli olduğunu açıklamamasıdır.</p>

<p>Bir fonksiyonun anlaşılabilirliğini kabaca şu ilişkiyle düşünebiliriz:</p>

\[O \approx \frac{B}{1 + G}\]

<p>Burada $O$ okunabilirliği, $B$ imzada açıkça belirtilen bilgiyi, $G$ ise gizli veya belirsiz parametre sayısını temsil eder. Bu gerçek bir yazılım metriği değildir; fakat önemli fikri gösterir: Beklentiler imzadan sözlük içine taşındıkça okunabilirlik azalır.</p>

<h2 id="açık-imza-ile-karşılaştırma">Açık imza ile karşılaştırma</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Açık parametreler</td>
      <td>IDE desteği ve anlaşılır hata mesajları</td>
      <td>Çok sayıda parametrede imza uzar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">*args</code></td>
      <td>Değişken sayıda değer kabul eder</td>
      <td>Değerlerin anlamı sıraya bağımlıdır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">**kwargs</code></td>
      <td>Yeni seçenek eklemek kolaydır</td>
      <td>Geçerli anahtarlar görünmez kalabilir</td>
    </tr>
    <tr>
      <td>Yapılandırma nesnesi</td>
      <td>Tip güvenliği ve düzen sağlar</td>
      <td>Ek bir sınıf tanımlamak gerekir</td>
    </tr>
  </tbody>
</table>

<p>Şu fonksiyon kısa görünür, ancak kullanıcı açısından yeterince açıklayıcı değildir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">kullanici_olustur</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
    <span class="c1"># Parametreleri doğrudan veri katmanına iletiyor.
</span>    <span class="k">return</span> <span class="n">veritabani</span><span class="p">.</span><span class="nf">ekle</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
</code></pre></div></div>

<p>Fonksiyon <code class="language-plaintext highlighter-rouge">ad</code>, <code class="language-plaintext highlighter-rouge">eposta</code>, <code class="language-plaintext highlighter-rouge">yas</code> veya bambaşka alanlar mı bekliyor? Yanlışlıkla <code class="language-plaintext highlighter-rouge">eposta</code> yerine <code class="language-plaintext highlighter-rouge">epost</code> yazılırsa hata hemen mi alınacak, yoksa problem veritabanına kadar mı ilerleyecek? Kısa imza her zaman sade tasarım anlamına gelmez.</p>

<p>Açık parametreler çoğu durumda daha güvenlidir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">kullanici_olustur</span><span class="p">(</span>
    <span class="n">ad</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
    <span class="n">eposta</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
    <span class="o">*</span><span class="p">,</span>
    <span class="n">aktif</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="bp">True</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">ad</span><span class="sh">"</span><span class="p">:</span> <span class="n">ad</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">eposta</span><span class="sh">"</span><span class="p">:</span> <span class="n">eposta</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">aktif</span><span class="sh">"</span><span class="p">:</span> <span class="n">aktif</span><span class="p">,</span>
    <span class="p">}</span>
</code></pre></div></div>

<p>Tek başına kullanılan <code class="language-plaintext highlighter-rouge">*</code>, sonraki parametrelerin yalnızca isimleriyle gönderilmesini zorunlu kılar. Böylece <code class="language-plaintext highlighter-rouge">aktif</code> değerinin yanlışlıkla üçüncü konumsal argüman olarak verilmesi engellenir. Ayrıca IDE otomatik tamamlama sunabilir ve statik tip denetleyicileri hataları daha erken yakalayabilir.</p>

<h2 id="yapılandırma-nesnesi-ne-zaman-kullanılmalı">Yapılandırma nesnesi ne zaman kullanılmalı?</h2>

<p>Seçenek sayısı arttığında bütün bilgileri <code class="language-plaintext highlighter-rouge">**kwargs</code> içine saklamak yerine <code class="language-plaintext highlighter-rouge">dataclass</code> tercih edilebilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span>

<span class="nd">@dataclass</span>
<span class="k">class</span> <span class="nc">RaporAyarlari</span><span class="p">:</span>
    <span class="n">renk</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="sh">"</span><span class="s">mavi</span><span class="sh">"</span>
    <span class="n">pdf</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="bp">False</span>
    <span class="n">sayfa_boyutu</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="sh">"</span><span class="s">A4</span><span class="sh">"</span>


<span class="k">def</span> <span class="nf">rapor_olustur</span><span class="p">(</span><span class="n">baslik</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">ayarlar</span><span class="p">:</span> <span class="n">RaporAyarlari</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">baslik</span><span class="p">,</span> <span class="n">ayarlar</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu yapı geçerli seçenekleri görünür kılar, varsayılan değerleri tek yerde toplar ve yanlış alan adlarının sessizce dolaşmasını önler.</p>

<p>Elbette <code class="language-plaintext highlighter-rouge">*args</code> ve <code class="language-plaintext highlighter-rouge">**kwargs</code> kötü değildir. Dekoratörlerde, başka bir fonksiyona çağrı aktarırken veya gerçekten değişken sayıda değer kabul eden toplama benzeri işlemlerde son derece uygundurlar. Temel ölçüt şudur: Esnekliğin kendisi fonksiyonun amacıysa yıldızlı parametreler mantıklıdır; yalnızca uzun bir imzayı saklamak için kullanılıyorsa okunabilirlik borcu oluştururlar. Python bize yıldızları verir, fakat her fonksiyonu galaksiye çevirmek zorunda değiliz.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="python" /><category term="args" /><category term="kwargs" /><category term="fonksiyonlar" /><category term="okunabilirlik" /><category term="temiz-kod" /><summary type="html"><![CDATA[Python’daki *args ve **kwargs, fonksiyonlara değişken sayıda argüman gönderme özgürlüğü sağlar. Ancak bu özgürlük kontrolsüz kullanıldığında fonksiyon imzası, ne beklediğini söylemeyen gizemli bir kapıya dönüşebilir. Fonksiyon çalışır, testler geçer; fakat onu ilk kez gören geliştirici kendini “Buraya ne göndermem gerekiyor?” diye sorarken bulur.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/pythonda-args-ve-31.png" /><media:content medium="image" url="https://program.sonsuz.us/img/pythonda-args-ve-31.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Python’da Late Binding: Döngüdeki Lambda’lar Neden Hep Son Değeri Görür?</title><link href="https://program.sonsuz.us/posts/pythonda-late-binding-dongudeki-lambdalar-neden-hep-son-degeri-gorur/" rel="alternate" type="text/html" title="Python’da Late Binding: Döngüdeki Lambda’lar Neden Hep Son Değeri Görür?" /><published>2026-10-19T00:00:00+00:00</published><updated>2026-10-19T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/pythonda-late-binding-dongudeki-lambdalar-neden-hep-son-degeri-gorur</id><content type="html" xml:base="https://program.sonsuz.us/posts/pythonda-late-binding-dongudeki-lambdalar-neden-hep-son-degeri-gorur/"><![CDATA[<p>Bir döngü içinde birkaç <code class="language-plaintext highlighter-rouge">lambda</code> oluşturup her birinin farklı değeri hatırlamasını beklersiniz. Ardından hepsi aynı sonucu döndürür ve Python masumca size bakar. Bu davranış bir hata değil; closure’ların değişkenleri nasıl bağladığıyla ilgili önemli bir Python kuralıdır.</p>

<p>``</p>

<h2 id="şaşırtıcı-örnek">Şaşırtıcı örnek</h2>

<p>Aşağıdaki kodun <code class="language-plaintext highlighter-rouge">0, 1, 2</code> yazdırmasını beklemek oldukça doğaldır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">fonksiyonlar</span> <span class="o">=</span> <span class="p">[]</span>

<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span>
    <span class="n">fonksiyonlar</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="n">i</span><span class="p">)</span>

<span class="k">for</span> <span class="n">fonksiyon</span> <span class="ow">in</span> <span class="n">fonksiyonlar</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="nf">fonksiyon</span><span class="p">())</span>
</code></pre></div></div>

<p>Gerçek çıktı şöyledir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2
2
2
</code></pre></div></div>

<p>Çünkü <code class="language-plaintext highlighter-rouge">lambda</code>, oluşturulduğu anda <code class="language-plaintext highlighter-rouge">i</code> değişkeninin değerini kopyalamaz. Bunun yerine, çevresindeki kapsamda bulunan <code class="language-plaintext highlighter-rouge">i</code> değişkenine erişir. Fonksiyonlar çalıştırıldığında döngü çoktan bitmiştir ve <code class="language-plaintext highlighter-rouge">i</code> değişkeninin son değeri <code class="language-plaintext highlighter-rouge">2</code> olmuştur.</p>

<p>Bu davranış <strong>late binding</strong>, yani geç bağlama olarak adlandırılır. Bağlamanın fonksiyon tanımlanırken değil, fonksiyon çağrılırken gerçekleştiğini düşünebiliriz.</p>

<p>Matematiksel olarak üç fonksiyon oluşturduğumuzu varsayalım. Beklentimiz:</p>

\[f_0() = 0, \quad f_1() = 1, \quad f_2() = 2\]

<p>Fakat fonksiyonların tamamı aynı değişken hücresine başvurduğu için gerçekte:</p>

\[f_i() = i_{son} = 2\]

<p>olur.</p>

<h2 id="closure-tam-olarak-neyi-saklar">Closure tam olarak neyi saklar?</h2>

<p>Closure, dış kapsamdaki değişkenlere erişebilen iç fonksiyondur. Önemli ayrıntı şudur: Python çoğu durumda değişkenin o anki değerini değil, değişkenin bulunduğu <strong>hücreyi</strong> saklar. Hücrenin içeriği sonradan değişirse closure yeni içeriği görür.</p>

<p>Python isimleri ararken kabaca <strong>LEGB</strong> sırasını kullanır:</p>

<table>
  <thead>
    <tr>
      <th>Kapsam</th>
      <th>Anlamı</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Local</td>
      <td>Fonksiyonun yerel alanı</td>
      <td>Parametreler</td>
    </tr>
    <tr>
      <td>Enclosing</td>
      <td>Dış fonksiyonların alanı</td>
      <td>Closure değişkenleri</td>
    </tr>
    <tr>
      <td>Global</td>
      <td>Modül seviyesi</td>
      <td>Dosyada tanımlanan isimler</td>
    </tr>
    <tr>
      <td>Built-in</td>
      <td>Yerleşik isimler</td>
      <td><code class="language-plaintext highlighter-rouge">len</code>, <code class="language-plaintext highlighter-rouge">print</code></td>
    </tr>
  </tbody>
</table>

<p>Döngüdeki <code class="language-plaintext highlighter-rouge">i</code>, lambda’nın yerel parametresi değildir. Bu nedenle çağrı sırasında dış kapsamdan okunur.</p>

<h2 id="en-yaygın-çözüm-varsayılan-parametre">En yaygın çözüm: varsayılan parametre</h2>

<p>Değeri lambda oluşturulurken sabitlemek için varsayılan parametre kullanılabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">fonksiyonlar</span> <span class="o">=</span> <span class="p">[]</span>

<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span>
    <span class="n">fonksiyonlar</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="k">lambda</span> <span class="n">i</span><span class="o">=</span><span class="n">i</span><span class="p">:</span> <span class="n">i</span><span class="p">)</span>

<span class="k">for</span> <span class="n">fonksiyon</span> <span class="ow">in</span> <span class="n">fonksiyonlar</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="nf">fonksiyon</span><span class="p">())</span>
</code></pre></div></div>

<p>Bu kez çıktı <code class="language-plaintext highlighter-rouge">0, 1, 2</code> olur. Çünkü varsayılan parametre ifadeleri fonksiyon <strong>tanımlandığı anda</strong> değerlendirilir. Sağ taraftaki <code class="language-plaintext highlighter-rouge">i</code>, mevcut döngü değerini alır; sol taraftaki <code class="language-plaintext highlighter-rouge">i</code> ise lambda’nın yerel parametresidir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Bağlanma zamanı</th>
      <th>Sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">lambda: i</code></td>
      <td>Çağrı anı</td>
      <td>Son değer görülür</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">lambda i=i: i</code></td>
      <td>Tanımlama anı</td>
      <td>Her değer ayrı saklanır</td>
    </tr>
  </tbody>
</table>

<h2 id="factory-fonksiyonu-kullanmak">Factory fonksiyonu kullanmak</h2>

<p>Daha karmaşık işlemlerde varsayılan parametre numarası yerine açıklayıcı bir üretici fonksiyon tercih edilebilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">carpani_uret</span><span class="p">(</span><span class="n">carpan</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">carp</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">sayi</span> <span class="o">*</span> <span class="n">carpan</span>
    <span class="k">return</span> <span class="n">carp</span>

<span class="n">fonksiyonlar</span> <span class="o">=</span> <span class="p">[</span><span class="nf">carpani_uret</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">3</span><span class="p">)]</span>

<span class="nf">print</span><span class="p">([</span><span class="nf">fonksiyon</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="k">for</span> <span class="n">fonksiyon</span> <span class="ow">in</span> <span class="n">fonksiyonlar</span><span class="p">])</span>
<span class="c1"># [0, 10, 20]
</span></code></pre></div></div>

<p>Her <code class="language-plaintext highlighter-rouge">carpani_uret</code> çağrısı yeni bir yerel kapsam oluşturur. Böylece her iç fonksiyon farklı bir <code class="language-plaintext highlighter-rouge">carpan</code> hücresine sahip olur. Bu yaklaşım daha uzun olsa da okunabilirliği yüksektir.</p>

<p>Alternatif olarak <code class="language-plaintext highlighter-rouge">functools.partial</code>, bir fonksiyonun belirli argümanlarını önceden bağlamak için kullanılabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">functools</span> <span class="kn">import</span> <span class="n">partial</span>

<span class="k">def</span> <span class="nf">carp</span><span class="p">(</span><span class="n">sayi</span><span class="p">,</span> <span class="n">carpan</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">sayi</span> <span class="o">*</span> <span class="n">carpan</span>

<span class="n">fonksiyonlar</span> <span class="o">=</span> <span class="p">[</span><span class="nf">partial</span><span class="p">(</span><span class="n">carp</span><span class="p">,</span> <span class="n">carpan</span><span class="o">=</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">3</span><span class="p">)]</span>
</code></pre></div></div>

<p>Late binding özellikle buton callback’lerinde, zamanlayıcılarda, olay dinleyicilerinde ve asenkron görevlerde ortaya çıkar. Kısa kural şudur: Döngü değişkenini daha sonra çalışacak bir fonksiyonda kullanıyorsanız, değeri varsayılan parametreyle, factory fonksiyonuyla veya <code class="language-plaintext highlighter-rouge">partial</code> ile açıkça bağlayın. Böylece lambda’lar sürpriz kutusu olmaktan çıkar.</p>

<p><img src="/img/pythonda-late-binding-15.svg" alt="pythonda-late-binding-15" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="python" /><category term="lambda" /><category term="closure" /><category term="late-binding" /><category term="fonksiyonel-programlama" /><summary type="html"><![CDATA[Bir döngü içinde birkaç lambda oluşturup her birinin farklı değeri hatırlamasını beklersiniz. Ardından hepsi aynı sonucu döndürür ve Python masumca size bakar. Bu davranış bir hata değil; closure’ların değişkenleri nasıl bağladığıyla ilgili önemli bir Python kuralıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/pythonda-late-binding-15.png" /><media:content medium="image" url="https://program.sonsuz.us/img/pythonda-late-binding-15.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ Fonksiyon Aşırı Yükleme: Tek İsim, Birden Fazla Yetenek</title><link href="https://program.sonsuz.us/posts/c-fonksiyon-asiri-yukleme-tek-isim-birden-fazla-yetenek/" rel="alternate" type="text/html" title="C++ Fonksiyon Aşırı Yükleme: Tek İsim, Birden Fazla Yetenek" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-fonksiyon-asiri-yukleme-tek-isim-birden-fazla-yetenek</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-fonksiyon-asiri-yukleme-tek-isim-birden-fazla-yetenek/"><![CDATA[<p>Bir hesap makinesindeki “topla” düğmesinin tam sayılar, ondalıklı sayılar ve hatta metinler için farklı davranabildiğini düşünün. C++ fonksiyon aşırı yükleme sayesinde benzer işlemleri yapan fonksiyonlara aynı ismi verebilir, kullanım sırasında hangi sürümün çalışacağını derleyiciye bırakabiliriz. Böylece <code class="language-plaintext highlighter-rouge">toplaTamSayilari</code>, <code class="language-plaintext highlighter-rouge">toplaOndalikliSayilari</code> gibi isimler üretmek yerine daha sade ve anlaşılır bir arayüz oluştururuz.</p>

<p>``</p>

<h2 id="fonksiyon-aşırı-yükleme-nedir">Fonksiyon aşırı yükleme nedir?</h2>

<p>Function overloading, aynı kapsam içerisinde aynı isimli fakat farklı parametre listelerine sahip birden fazla fonksiyon tanımlamaktır. Parametre listesindeki tür, sayı veya sıralama değiştiğinde yeni bir overload meydana gelir.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">topla</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">double</span> <span class="nf">topla</span><span class="p">(</span><span class="kt">double</span> <span class="n">a</span><span class="p">,</span> <span class="kt">double</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="nf">topla</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">topla</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">topla</span><span class="p">(</span><span class="mf">2.5</span><span class="p">,</span> <span class="mf">1.8</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">topla</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="s">"Merhaba "</span><span class="p">),</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="s">"C++"</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">topla(4, 7)</code> çağrısı <code class="language-plaintext highlighter-rouge">int</code> sürümünü, ondalıklı argümanlar <code class="language-plaintext highlighter-rouge">double</code> sürümünü seçer. Son sürüm ise iki metni birleştirir. <code class="language-plaintext highlighter-rouge">const std::string&amp;</code> kullanılması, metinlerin gereksiz yere kopyalanmasını önler.</p>

<h2 id="derleyici-doğru-fonksiyonu-nasıl-seçer">Derleyici doğru fonksiyonu nasıl seçer?</h2>

<p>Derleyici, çağrıdaki argümanları mevcut adayların parametreleriyle karşılaştırır. Bu sürece <strong>overload resolution</strong> denir. Basitleştirilmiş biçimde her aday için bir dönüşüm maliyeti düşünülebilir:</p>

\[S = C_1 + C_2 + \cdots + C_n\]

<p>Burada $C_i$, ilgili argümanın parametre türüne dönüştürülme maliyetidir. En düşük $S$ değerine sahip aday seçilir. Tam eşleşme genellikle standart tür dönüşümünden, standart dönüşüm de kullanıcı tanımlı dönüşümden daha güçlüdür.</p>

<table>
  <thead>
    <tr>
      <th>Eşleşme türü</th>
      <th>Örnek</th>
      <th>Tercih düzeyi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tam eşleşme</td>
      <td><code class="language-plaintext highlighter-rouge">int</code> → <code class="language-plaintext highlighter-rouge">int</code></td>
      <td>En yüksek</td>
    </tr>
    <tr>
      <td>Terfi</td>
      <td><code class="language-plaintext highlighter-rouge">char</code> → <code class="language-plaintext highlighter-rouge">int</code></td>
      <td>Yüksek</td>
    </tr>
    <tr>
      <td>Standart dönüşüm</td>
      <td><code class="language-plaintext highlighter-rouge">int</code> → <code class="language-plaintext highlighter-rouge">double</code></td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>Kullanıcı tanımlı dönüşüm</td>
      <td>Sınıf dönüşümü</td>
      <td>Daha düşük</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/c-fonksiyon-asiri-87.svg" alt="c-fonksiyon-asiri-87" /></p>

<h2 id="neler-overload-oluşturur">Neler overload oluşturur?</h2>

<p>Aşağıdaki fonksiyonlar geçerli biçimde aşırı yüklenebilir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="kt">int</span> <span class="n">deger</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="kt">double</span> <span class="n">deger</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="kt">int</span> <span class="n">deger</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tekrar</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">metin</span><span class="p">);</span>
</code></pre></div></div>

<p>Birincisi ve ikincisi parametre türüyle, üçüncüsü parametre sayısıyla ayrılır. Ancak yalnızca dönüş türünü değiştirmek yeterli değildir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">hesapla</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">);</span>
<span class="c1">// double hesapla(int x); // Hata: Parametre listesi aynı!</span>
</code></pre></div></div>

<p>Çağıran kod yalnızca <code class="language-plaintext highlighter-rouge">hesapla(5)</code> yazdığında hangi dönüş türünü istediğini derleyici kesin olarak anlayamaz. Bu nedenle dönüş türü, fonksiyon aşırı yükleme imzasının ayırt edici parçası değildir.</p>

<h2 id="belirsizlik-tuzağı">Belirsizlik tuzağı</h2>

<p>Dönüşümler eşit derecede uygun olduğunda derleyici seçim yapamaz:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">goster</span><span class="p">(</span><span class="kt">long</span> <span class="n">deger</span><span class="p">)</span> <span class="p">{}</span>
<span class="kt">void</span> <span class="nf">goster</span><span class="p">(</span><span class="kt">double</span> <span class="n">deger</span><span class="p">)</span> <span class="p">{}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">// goster(10); // Belirsiz çağrı</span>
    <span class="n">goster</span><span class="p">(</span><span class="mi">10L</span><span class="p">);</span>   <span class="c1">// long sürümü</span>
    <span class="n">goster</span><span class="p">(</span><span class="mf">10.0</span><span class="p">);</span>  <span class="c1">// double sürümü</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">10</code>, <code class="language-plaintext highlighter-rouge">int</code> türündedir ve hem <code class="language-plaintext highlighter-rouge">long</code> hem de <code class="language-plaintext highlighter-rouge">double</code> türüne dönüştürülebilir. <code class="language-plaintext highlighter-rouge">L</code> ve <code class="language-plaintext highlighter-rouge">.0</code> ekleriyle niyet açıkça belirtilir. Benzer sorunlar varsayılan parametrelerle de oluşabilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Farklı fonksiyon adları</td>
      <td>Seçim tamamen açıktır</td>
      <td>Gereksiz isim kalabalığı</td>
    </tr>
    <tr>
      <td>Overloading</td>
      <td>Temiz ve doğal API</td>
      <td>Belirsiz çağrı ihtimali</td>
    </tr>
    <tr>
      <td>Şablonlar</td>
      <td>Çok sayıda türü destekler</td>
      <td>Hata mesajları karmaşıklaşabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="ne-zaman-kullanmalıyız">Ne zaman kullanmalıyız?</h2>

<p>Aşırı yüklenen fonksiyonlar kavramsal olarak aynı işi yapmalıdır. <code class="language-plaintext highlighter-rouge">yazdir</code>, <code class="language-plaintext highlighter-rouge">hesapla</code> veya <code class="language-plaintext highlighter-rouge">ekle</code> gibi işlemler bunun için uygundur. Bir overload dosya silerken diğeri matematiksel hesap yapıyorsa ortak isim geliştiriciyi şaşırtır.</p>

<p>Kısacası function overloading, C++ arayüzlerini esnek ve okunabilir hâle getirir. Parametre listelerini belirgin tuttuğunuz, örtük dönüşümleri sınırladığınız ve her sürüme aynı kavramsal sorumluluğu verdiğiniz sürece tek bir isim gerçekten birçok yeteneği zarifçe taşıyabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="fonksiyonlar" /><category term="function-overloading" /><category term="oop" /><category term="programlama" /><summary type="html"><![CDATA[Bir hesap makinesindeki “topla” düğmesinin tam sayılar, ondalıklı sayılar ve hatta metinler için farklı davranabildiğini düşünün. C++ fonksiyon aşırı yükleme sayesinde benzer işlemleri yapan fonksiyonlara aynı ismi verebilir, kullanım sırasında hangi sürümün çalışacağını derleyiciye bırakabiliriz. Böylece toplaTamSayilari, toplaOndalikliSayilari gibi isimler üretmek yerine daha sade ve anlaşılır bir arayüz oluştururuz.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-fonksiyon-asiri-87.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-fonksiyon-asiri-87.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ İstisna Garantileri: Güçlü, Temel ve Zayıf Güvencenin Gerçek Etkisi</title><link href="https://program.sonsuz.us/posts/c-istisna-garantileri-guclu-temel-ve-zayif-guvencenin-gercek-etkisi/" rel="alternate" type="text/html" title="C++ İstisna Garantileri: Güçlü, Temel ve Zayıf Güvencenin Gerçek Etkisi" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-istisna-garantileri-guclu-temel-ve-zayif-guvencenin-gercek-etkisi</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-istisna-garantileri-guclu-temel-ve-zayif-guvencenin-gercek-etkisi/"><![CDATA[<p><img src="/img/c-istisna-garantileri-83.svg" alt="c-istisna-garantileri-83" /></p>

<p>Bir C++ fonksiyonunun istisna fırlatabilmesi tek başına korkutucu değildir; asıl mesele, istisna sonrasında programın hangi durumda kaldığıdır. Sepete ürün eklerken bellek tahsisi başarısız olursa eski sepet hâlâ kullanılabilir mi, yoksa nesne yarı güncellenmiş bir zombiye mi dönüşür? İstisna garantileri tam olarak bu soruya cevap verir.</p>

<p>``</p>

<h2 id="önce-terminolojiyi-netleştirelim">Önce terminolojiyi netleştirelim</h2>

<p>C++ literatüründe yaygın olarak <strong>no-throw</strong>, <strong>güçlü</strong>, <strong>temel</strong> ve <strong>garantisiz</strong> olmak üzere dört seviye bulunur. “Zayıf garanti” standartlaşmış ayrı bir seviye değildir. Bazı kaynaklar bu ifadeyi temel garantinin eş anlamlısı olarak, bazılarıysa hiçbir durum garantisi vermeyen kod için kullanır. Bu yazıda karışıklığı önlemek amacıyla <strong>zayıf/garantisiz</strong> ifadesini son anlamda kullanacağız.</p>

<table>
  <thead>
    <tr>
      <th>Seviye</th>
      <th>İstisna sonrasında durum</th>
      <th style="text-align: right">Veri kaybı</th>
      <th>Kullanılabilirlik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Güçlü garanti</td>
      <td>İşlem hiç başlamamış gibi</td>
      <td style="text-align: right">Yok</td>
      <td>Tam</td>
    </tr>
    <tr>
      <td>Temel garanti</td>
      <td>Durum değişebilir fakat geçerlidir</td>
      <td style="text-align: right">Olabilir</td>
      <td>Nesne kullanılabilir</td>
    </tr>
    <tr>
      <td>Zayıf/garantisiz</td>
      <td>Durum hakkında söz verilmez</td>
      <td style="text-align: right">Muhtemel</td>
      <td>Belirsiz</td>
    </tr>
  </tbody>
</table>

<p>Güçlü garantiyi bir işlem dönüşümüyle ifade edebiliriz. Başlangıç durumu $S$, işlem $f$ ise:</p>

\[f(S) = S' \quad \text{veya istisna durumunda} \quad S\]

<p>Yani sonuç ya tamamen yeni durumdur ya da tamamen eski durumdur. Bu yaklaşım veritabanlarındaki atomik işlemlere benzer.</p>

<h2 id="güçlü-garanti-ya-hep-ya-hiç">Güçlü garanti: Ya hep ya hiç</h2>

<p>Aşağıdaki sınıf, yeni değeri önce geçici nesnede hazırlar. Riskli işlemler tamamlanmadan mevcut veriye dokunulmaz:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;utility&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">Profile</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">name</span><span class="p">;</span>

<span class="nl">public:</span>
    <span class="kt">void</span> <span class="n">rename</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">newName</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">temporary</span> <span class="o">=</span> <span class="n">newName</span><span class="p">;</span> <span class="c1">// Bellek ayırırken fırlatabilir</span>
        <span class="n">name</span><span class="p">.</span><span class="n">swap</span><span class="p">(</span><span class="n">temporary</span><span class="p">);</span>            <span class="c1">// noexcept</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Kopyalama sırasında <code class="language-plaintext highlighter-rouge">std::bad_alloc</code> oluşursa <code class="language-plaintext highlighter-rouge">name</code> değişmez. Başarılı olursa <code class="language-plaintext highlighter-rouge">swap</code> ile yeni değer devreye alınır. Bu desen <strong>copy-and-swap</strong> veya daha genel anlamıyla “önce hazırla, sonra taahhüt et” yaklaşımıdır.</p>

<p>Güçlü garanti; finansal işlemler, yapılandırma güncellemeleri ve birden fazla adımın tek işlem gibi görünmesi gereken yerlerde değerlidir. Bedeli ise geçici kopyalar, ek bellek ve bazen daha karmaşık tasarımdır.</p>

<h2 id="temel-garanti-dağınık-ama-hayatta">Temel garanti: Dağınık ama hayatta</h2>

<p>Temel garanti, istisna sonrasında nesnenin kurallarını koruduğunu ve kaynak sızdırmadığını söyler. Ancak eski değerlerin korunacağını söylemez:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">normalize</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">values</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">values</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
    <span class="n">values</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> <span class="c1">// Bellek tahsisi başarısız olabilir</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">push_back</code> başarısız olursa vektör boş kalabilir. Eski elemanlar kaybedilmiştir fakat <code class="language-plaintext highlighter-rouge">values</code> hâlâ geçerli bir vektördür; yeniden doldurulabilir, taşınabilir veya yok edilebilir. Bu, temel garantinin pratik özüdür.</p>

<p>RAII burada kritik rol oynar. <code class="language-plaintext highlighter-rouge">std::vector</code>, <code class="language-plaintext highlighter-rouge">std::string</code>, akıllı işaretçiler ve kilit sınıfları kaynaklarını yıkıcılarında bıraktığı için istisna sırasında bellek ve kilit sızıntılarını önler.</p>

<h2 id="zayıf-veya-garantisiz-kod-sürpriz-kutusu">Zayıf veya garantisiz kod: Sürpriz kutusu</h2>

<p>Ham kaynaklar ve sıralı güncellemeler tehlikeli bir kombinasyondur:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">account</span><span class="p">.</span><span class="n">balance</span> <span class="o">-=</span> <span class="n">amount</span><span class="p">;</span>
<span class="n">ledger</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">account</span><span class="p">.</span><span class="n">id</span><span class="p">,</span> <span class="n">amount</span><span class="p">);</span> <span class="c1">// Fırlatabilir</span>
<span class="n">account</span><span class="p">.</span><span class="n">lastTransfer</span> <span class="o">=</span> <span class="n">now</span><span class="p">();</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">ledger.add</code> fırlatırsa bakiye azalmış, kayıt eklenmemiş ve zaman damgası değişmemiş olabilir. Nesneler tek tek geçerli görünse bile sistemin iş kuralı bozulmuştur. Böyle bir fonksiyon tekrar çağrılırsa para ikinci kez düşülebilir.</p>

<p>Çözüm; değişiklikleri geçici bir yapıda toplamak, geri alma işlemi tasarlamak veya fırlatabilen adımları mutasyondan önce tamamlamaktır.</p>

<h2 id="hangi-seviyeyi-seçmeliyiz">Hangi seviyeyi seçmeliyiz?</h2>

<p>Her fonksiyona güçlü garanti vermek gereksiz olabilir. Salt hesaplamalarda ve kritik güncellemelerde güçlü garanti hedeflenebilir; büyük koleksiyonları dönüştüren performans odaklı işlemlerde temel garanti yeterli olabilir. Yıkıcılar, kaynak bırakma fonksiyonları ve <code class="language-plaintext highlighter-rouge">swap</code> gibi altyapı işlemleri ise mümkünse <code class="language-plaintext highlighter-rouge">noexcept</code> olmalıdır.</p>

<p>Pratik kontrol sorusu şudur: “Bu satır fırlatırsa hangi değişiklikler yapılmış olacak?” Cevap belirsizse yalnızca bir istisna probleminiz değil, aynı zamanda bir tasarım probleminiz vardır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="istisna yönetimi" /><category term="exception safety" /><category term="raii" /><category term="yazılım tasarımı" /><summary type="html"><![CDATA[Bir C++ fonksiyonunun istisna fırlatabilmesi tek başına korkutucu değildir; asıl mesele, istisna sonrasında programın hangi durumda kaldığıdır. Sepete ürün eklerken bellek tahsisi başarısız olursa eski sepet hâlâ kullanılabilir mi, yoksa nesne yarı güncellenmiş bir zombiye mi dönüşür? İstisna garantileri tam olarak bu soruya cevap verir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-istisna-garantileri-83.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-istisna-garantileri-83.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ İstisna Yönetimi: Hataları Güvenle Yakalamak</title><link href="https://program.sonsuz.us/posts/c-istisna-yonetimi-hatalari-guvenle-yakalamak/" rel="alternate" type="text/html" title="C++ İstisna Yönetimi: Hataları Güvenle Yakalamak" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-istisna-yonetimi-hatalari-guvenle-yakalamak</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-istisna-yonetimi-hatalari-guvenle-yakalamak/"><![CDATA[<p>Bir C++ programı derlenmiş olsa bile çalışma sırasında dosya bulunamaması, belleğin ayrılamaması veya geçersiz veriyle karşılaşılması gibi sorunlar yaşayabilir. İstisna yönetimi, bu beklenmedik durumları programı aniden sonlandırmadan uygun bir noktaya bildirmemizi sağlar. Kısacası <code class="language-plaintext highlighter-rouge">throw</code> alarmı çalıştırır, <code class="language-plaintext highlighter-rouge">try</code> riskli bölgeyi gözetler, <code class="language-plaintext highlighter-rouge">catch</code> ise olaya müdahale eder.
``</p>
<h2 id="i̇stisna-yönetiminin-temel-mantığı">İstisna yönetiminin temel mantığı</h2>

<p>Normal koşullarda fonksiyonlar sonuçlarını <code class="language-plaintext highlighter-rouge">return</code> ile döndürür. Ancak bir fonksiyon görevini tamamlayamıyorsa sıradan bir sonuç döndürmek yanıltıcı olabilir. Örneğin pozitif sayı bekleyen bir karekök fonksiyonuna negatif değer verilmesi ayrı bir kontrol akışı gerektirir.</p>

<p>İstisna oluştuğunda program, uygun bir <code class="language-plaintext highlighter-rouge">catch</code> bloğu bulana kadar çağrı zincirinde geriye ilerler. Bu sürece <strong>stack unwinding</strong> denir. Matematiksel olarak bir fonksiyonun geçerli kümesini şöyle gösterebiliriz:</p>

\[f(x) = \sqrt{x}, \qquad x \in [0, \infty)\]

<p>Burada $x &lt; 0$ olması, fonksiyon sözleşmesinin ihlal edildiğini belirtir.</p>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Görevi</th>
      <th>Benzetme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">try</code></td>
      <td>Hata oluşturabilecek kodu çalıştırır</td>
      <td>Güvenlik kamerası</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">throw</code></td>
      <td>İstisna üretir</td>
      <td>Alarm düğmesi</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">catch</code></td>
      <td>Belirli istisnayı yakalar</td>
      <td>Müdahale ekibi</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">noexcept</code></td>
      <td>Fonksiyonun istisna fırlatmayacağını bildirir</td>
      <td>Güvenlik garantisi</td>
    </tr>
  </tbody>
</table>

<h2 id="temel-try-throw-ve-catch-kullanımı">Temel <code class="language-plaintext highlighter-rouge">try</code>, <code class="language-plaintext highlighter-rouge">throw</code> ve <code class="language-plaintext highlighter-rouge">catch</code> kullanımı</h2>

<p>Aşağıdaki örnek, bölme işleminden önce paydayı denetler. Sıfıra bölme tespit edildiğinde <code class="language-plaintext highlighter-rouge">std::runtime_error</code> nesnesi fırlatılır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdexcept&gt;</span><span class="cp">
</span>
<span class="kt">double</span> <span class="nf">bol</span><span class="p">(</span><span class="kt">double</span> <span class="n">pay</span><span class="p">,</span> <span class="kt">double</span> <span class="n">payda</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">payda</span> <span class="o">==</span> <span class="mf">0.0</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span><span class="p">(</span><span class="s">"Sıfıra bölme girişimi!"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">pay</span> <span class="o">/</span> <span class="n">payda</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">try</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">bol</span><span class="p">(</span><span class="mi">42</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span><span class="o">&amp;</span> <span class="n">hata</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"Hata: "</span> <span class="o">&lt;&lt;</span> <span class="n">hata</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>İstisnanın <code class="language-plaintext highlighter-rouge">const</code> referansla yakalanması gereksiz kopyalamayı engeller ve çok biçimliliği korur. <code class="language-plaintext highlighter-rouge">what()</code> metodu ise hatanın açıklamasını verir. Program kontrolsüz biçimde çökmek yerine kullanıcıya anlamlı bir mesaj sunar.</p>

<h2 id="standart-mı-özel-istisna-mı">Standart mı, özel istisna mı?</h2>

<p>C++ standart kütüphanesi <code class="language-plaintext highlighter-rouge">std::exception</code> tabanlı birçok hata türü sağlar.</p>

<table>
  <thead>
    <tr>
      <th>İstisna</th>
      <th>Uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::invalid_argument</code></td>
      <td>Geçersiz fonksiyon argümanı</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::out_of_range</code></td>
      <td>Aralık dışı indeks</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::runtime_error</code></td>
      <td>Genel çalışma zamanı sorunu</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::bad_alloc</code></td>
      <td>Bellek ayırma başarısızlığı</td>
    </tr>
  </tbody>
</table>

<p>Uygulamaya özgü hatalar için özel bir sınıf da tanımlanabilir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdexcept&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">BakiyeHatasi</span> <span class="o">:</span> <span class="k">public</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="k">explicit</span> <span class="n">BakiyeHatasi</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">mesaj</span><span class="p">)</span>
        <span class="o">:</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span><span class="p">(</span><span class="n">mesaj</span><span class="p">)</span> <span class="p">{}</span>
<span class="p">};</span>

<span class="kt">void</span> <span class="nf">paraCek</span><span class="p">(</span><span class="kt">double</span> <span class="n">bakiye</span><span class="p">,</span> <span class="kt">double</span> <span class="n">miktar</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">miktar</span> <span class="o">&gt;</span> <span class="n">bakiye</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">throw</span> <span class="n">BakiyeHatasi</span><span class="p">(</span><span class="s">"Yetersiz bakiye"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu yaklaşım, çağıran kodun banka işlemlerine özgü problemi diğer çalışma zamanı hatalarından ayırmasını sağlar.</p>

<h2 id="yakalama-sırası-ve-yeniden-fırlatma">Yakalama sırası ve yeniden fırlatma</h2>

<p><code class="language-plaintext highlighter-rouge">catch</code> blokları özel türden genel türe doğru sıralanmalıdır. Aksi hâlde <code class="language-plaintext highlighter-rouge">std::exception</code> gibi genel bir blok, türetilmiş bütün istisnaları önce yakalayabilir.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span> <span class="p">{</span>
    <span class="n">paraCek</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">250</span><span class="p">);</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">BakiyeHatasi</span><span class="o">&amp;</span> <span class="n">hata</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="n">hata</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="k">throw</span><span class="p">;</span> <span class="c1">// Aynı istisnayı üst seviyeye iletir</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">exception</span><span class="o">&amp;</span> <span class="n">hata</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"Genel hata: "</span> <span class="o">&lt;&lt;</span> <span class="n">hata</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Parametresiz <code class="language-plaintext highlighter-rouge">throw;</code>, mevcut istisnayı türünü kaybetmeden yeniden fırlatır. Bu yöntem, alt seviyede kayıt tutup üst seviyede kullanıcıya cevap vermek için kullanışlıdır.</p>

<h2 id="güvenli-tasarım-için-kısa-kurallar">Güvenli tasarım için kısa kurallar</h2>

<p>İstisnaları sıradan döngü kontrolü amacıyla değil, gerçekten olağan dışı durumlar için kullanın. Kaynak yönetiminde RAII yaklaşımını tercih edin; <code class="language-plaintext highlighter-rouge">std::vector</code>, <code class="language-plaintext highlighter-rouge">std::string</code> ve akıllı işaretçiler stack unwinding sırasında otomatik olarak temizlenir. Yıkıcılar mümkünse istisna fırlatmamalıdır. Ayrıca yalnızca gerçekten garanti verebildiğiniz fonksiyonları <code class="language-plaintext highlighter-rouge">noexcept</code> olarak işaretleyin.</p>

<p>Doğru tasarlanmış istisna yönetimi hataları yok etmez; onları görünür, sınıflandırılabilir ve güvenli biçimde yönetilebilir hâle getirir. Böylece programınız ilk beklenmedik durumda havlu atmak yerine kontrollü bir iniş yapar.</p>

<p><img src="/img/c-istisna-yonetimi-33.svg" alt="c-istisna-yonetimi-33" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="istisna yönetimi" /><category term="exception handling" /><category term="try-catch" /><category term="hata yönetimi" /><summary type="html"><![CDATA[Bir C++ programı derlenmiş olsa bile çalışma sırasında dosya bulunamaması, belleğin ayrılamaması veya geçersiz veriyle karşılaşılması gibi sorunlar yaşayabilir. İstisna yönetimi, bu beklenmedik durumları programı aniden sonlandırmadan uygun bir noktaya bildirmemizi sağlar. Kısacası throw alarmı çalıştırır, try riskli bölgeyi gözetler, catch ise olaya müdahale eder.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-istisna-yonetimi-33.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-istisna-yonetimi-33.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C Karakter Dizileri: Null Karakterinden Güvenli Metin İşlemeye</title><link href="https://program.sonsuz.us/posts/c-karakter-dizileri-null-karakterinden-guvenli-metin-islemeye/" rel="alternate" type="text/html" title="C Karakter Dizileri: Null Karakterinden Güvenli Metin İşlemeye" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-karakter-dizileri-null-karakterinden-guvenli-metin-islemeye</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-karakter-dizileri-null-karakterinden-guvenli-metin-islemeye/"><![CDATA[<p>C dilinde metinlerle çalışmak ilk bakışta birkaç kelimeyi bir değişkende saklamak kadar basit görünür. Fakat C, hazır ve bağımsız bir <code class="language-plaintext highlighter-rouge">string</code> veri türü sunmaz. Bunun yerine metinleri, bellekte art arda bulunan karakterlerden oluşan ve özel bir null karakteriyle sonlandırılan diziler şeklinde işler. Bu yaklaşım hem yüksek performans hem de etkileyici bir kontrol sağlar; ancak sınırlar unutulduğunda programı küçük bir bellek mayın tarlasına çevirebilir.</p>

<p><img src="/img/c-karakter-dizileri-59.svg" alt="c-karakter-dizileri-59" /></p>

<p>``</p>

<h2 id="c-stringinin-temel-yapısı">C string’inin temel yapısı</h2>

<p>Bir C karakter dizisinin her elemanı <code class="language-plaintext highlighter-rouge">char</code> türündedir. Metnin bittiği yer, sayısal değeri sıfır olan <code class="language-plaintext highlighter-rouge">\0</code> karakteriyle belirtilir. Örneğin <code class="language-plaintext highlighter-rouge">"Kod"</code> metni bellekte şu şekilde tutulur:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">İndis</th>
      <th style="text-align: center">Karakter</th>
      <th style="text-align: right">Sayısal değer</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">0</td>
      <td style="text-align: center"><code class="language-plaintext highlighter-rouge">K</code></td>
      <td style="text-align: right">75</td>
    </tr>
    <tr>
      <td style="text-align: right">1</td>
      <td style="text-align: center"><code class="language-plaintext highlighter-rouge">o</code></td>
      <td style="text-align: right">111</td>
    </tr>
    <tr>
      <td style="text-align: right">2</td>
      <td style="text-align: center"><code class="language-plaintext highlighter-rouge">d</code></td>
      <td style="text-align: right">100</td>
    </tr>
    <tr>
      <td style="text-align: right">3</td>
      <td style="text-align: center"><code class="language-plaintext highlighter-rouge">\0</code></td>
      <td style="text-align: right">0</td>
    </tr>
  </tbody>
</table>

<p>Görünen karakter sayısı $n$ ise gereken en düşük bellek miktarı yaklaşık olarak şöyledir:</p>

\[B = (n + 1) \times sizeof(char)\]

<p>C standardında <code class="language-plaintext highlighter-rouge">sizeof(char)</code> her zaman 1 olduğundan, üç karakterli <code class="language-plaintext highlighter-rouge">"Kod"</code> için dört baytlık alan gerekir. Fazladan bayt, null karakterinin koltuğudur; görünmez ama yolculuk onsuz tamamlanmaz.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">char</span> <span class="n">metin</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"Kod"</span><span class="p">;</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"%s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">metin</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Ilk karakter: %c</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">metin</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Sonlandirici deger: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">metin</span><span class="p">[</span><span class="mi">3</span><span class="p">]);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Derleyici burada dizinin boyutunu otomatik olarak dört seçer ve sona <code class="language-plaintext highlighter-rouge">\0</code> ekler. <code class="language-plaintext highlighter-rouge">%s</code>, karakterleri null sonlandırıcıya ulaşıncaya kadar ekrana yazar.</p>

<h2 id="dizi-mi-işaretçi-mi">Dizi mi, işaretçi mi?</h2>

<p>Aşağıdaki iki tanım benzer görünse de aynı davranışı garanti etmez:</p>

<table>
  <thead>
    <tr>
      <th>Tanım</th>
      <th>Veri konumu</th>
      <th>Değiştirilebilir mi?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">char ad[] = "Ada";</code></td>
      <td>Yazılabilir dizi</td>
      <td>Evet</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">const char *ad = "Ada";</code></td>
      <td>String sabitini gösterir</td>
      <td>Hayır</td>
    </tr>
  </tbody>
</table>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">char</span> <span class="n">dil</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"C dili"</span><span class="p">;</span>
<span class="n">dil</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="sc">'c'</span><span class="p">;</span>  <span class="cm">/* Gecerli: dizi degistirilebilir. */</span>

<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">mesaj</span> <span class="o">=</span> <span class="s">"Merhaba"</span><span class="p">;</span>
<span class="cm">/* mesaj[0] = 'm';  Hatali: string sabiti degistirilmemeli. */</span>
</code></pre></div></div>

<p>İkinci kullanımda <code class="language-plaintext highlighter-rouge">const</code>, yanlışlıkla salt okunur veriyi değiştirmeye çalışmamızı engeller. Yalın <code class="language-plaintext highlighter-rouge">char *mesaj = "Merhaba";</code> bazı derleyicilerde kabul edilse bile karakterleri değiştirmek tanımsız davranıştır.</p>

<h2 id="uzunluk-ve-kapasite-aynı-şey-değildir">Uzunluk ve kapasite aynı şey değildir</h2>

<p><code class="language-plaintext highlighter-rouge">strlen()</code> yalnızca <code class="language-plaintext highlighter-rouge">\0</code> öncesindeki karakterleri sayar. <code class="language-plaintext highlighter-rouge">sizeof()</code> ise erişilebilen dizi nesnesinin toplam boyutunu verir.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">char</span> <span class="n">kutu</span><span class="p">[</span><span class="mi">20</span><span class="p">]</span> <span class="o">=</span> <span class="s">"Merhaba"</span><span class="p">;</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"Uzunluk: %zu</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">kutu</span><span class="p">));</span> <span class="cm">/* 7 */</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Kapasite: %zu</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">kutu</span><span class="p">));</span> <span class="cm">/* 20 */</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu örnekte metin uzunluğu $L=7$, dizinin kapasitesi $C=20$ bayttır. Güvenli bir string için temel koşul $L &lt; C$ olmalıdır; çünkü bir hücre <code class="language-plaintext highlighter-rouge">\0</code> için ayrılır. İşaretçi bir fonksiyona gönderildiğinde <code class="language-plaintext highlighter-rouge">sizeof()</code> artık dizinin kapasitesini değil, işaretçinin boyutunu verebilir. Bu nedenle kapasiteyi fonksiyona ayrıca göndermek iyi bir alışkanlıktır.</p>

<h2 id="güvenli-girdi-alma">Güvenli girdi alma</h2>

<p><code class="language-plaintext highlighter-rouge">scanf("%s", ...)</code> boşlukta okumayı keser ve sınır belirtilmezse taşmaya yol açabilir. <code class="language-plaintext highlighter-rouge">fgets()</code> ise kapasiteyi bildiği için daha güvenli bir seçenektir.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">char</span> <span class="n">ad</span><span class="p">[</span><span class="mi">32</span><span class="p">];</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"Adinizi girin: "</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">fgets</span><span class="p">(</span><span class="n">ad</span><span class="p">,</span> <span class="k">sizeof</span> <span class="n">ad</span><span class="p">,</span> <span class="n">stdin</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">ad</span><span class="p">[</span><span class="n">strcspn</span><span class="p">(</span><span class="n">ad</span><span class="p">,</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)]</span> <span class="o">=</span> <span class="sc">'\0'</span><span class="p">;</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"Merhaba, %s!</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">ad</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">fgets()</code> satır sonunu diziye ekleyebilir. <code class="language-plaintext highlighter-rouge">strcspn()</code> ilk <code class="language-plaintext highlighter-rouge">\n</code> karakterinin konumunu bulur ve bu karakter null sonlandırıcıyla değiştirilir.</p>

<h2 id="akılda-tutulacaklar">Akılda tutulacaklar</h2>

<p>C string’leri, null karakteriyle sonlanan <code class="language-plaintext highlighter-rouge">char</code> dizileridir. Her zaman kapasiteyi hesaba katın, sonlandırıcı için yer bırakın ve sınır kontrollü fonksiyonları tercih edin. <code class="language-plaintext highlighter-rouge">strlen</code>, <code class="language-plaintext highlighter-rouge">strcmp</code>, <code class="language-plaintext highlighter-rouge">strchr</code> ve dikkatli kullanıldığında <code class="language-plaintext highlighter-rouge">snprintf</code>, metin işlemlerinde güçlü yardımcılarınızdır. C size emniyet kemerini zorla takmaz; fakat kemerin nerede olduğunu bilmek programınızı çöküşlerden korur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="string" /><category term="karakter-dizileri" /><category term="bellek" /><category term="pointer" /><category term="programlama" /><summary type="html"><![CDATA[C dilinde metinlerle çalışmak ilk bakışta birkaç kelimeyi bir değişkende saklamak kadar basit görünür. Fakat C, hazır ve bağımsız bir string veri türü sunmaz. Bunun yerine metinleri, bellekte art arda bulunan karakterlerden oluşan ve özel bir null karakteriyle sonlandırılan diziler şeklinde işler. Bu yaklaşım hem yüksek performans hem de etkileyici bir kontrol sağlar; ancak sınırlar unutulduğunda programı küçük bir bellek mayın tarlasına çevirebilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-karakter-dizileri-59.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-karakter-dizileri-59.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C# Operatörler ve Program Kontrolü: Kararlardan Döngülere</title><link href="https://program.sonsuz.us/posts/c-operatorler-ve-program-kontrolu-kararlardan-dongulere/" rel="alternate" type="text/html" title="C# Operatörler ve Program Kontrolü: Kararlardan Döngülere" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-operatorler-ve-program-kontrolu-kararlardan-dongulere</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-operatorler-ve-program-kontrolu-kararlardan-dongulere/"><![CDATA[<p>Bir C# programı yalnızca yukarıdan aşağıya çalışan komutlardan oluşmaz. Değerleri karşılaştırır, koşullara göre karar verir ve gerektiğinde aynı işlemi tekrarlar. Operatörler bu kararların kelimeleri, kontrol blokları ise programın trafik ışıklarıdır. Gelin C# kodunun nasıl düşündüğünü adım adım inceleyelim.</p>

<p>``</p>

<h2 id="operatörlerin-temel-mantığı">Operatörlerin temel mantığı</h2>

<p>Operatör, bir veya daha fazla değer üzerinde işlem yapan semboldür. Örneğin <code class="language-plaintext highlighter-rouge">+</code> iki sayıyı toplarken <code class="language-plaintext highlighter-rouge">&gt;=</code> değerleri karşılaştırır. <code class="language-plaintext highlighter-rouge">=</code> ile <code class="language-plaintext highlighter-rouge">==</code> arasındaki fark özellikle önemlidir: İlki atama, ikincisi eşitlik kontrolüdür.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">puan</span> <span class="p">=</span> <span class="m">75</span><span class="p">;</span>              <span class="c1">// Atama</span>
<span class="kt">bool</span> <span class="n">gectiMi</span> <span class="p">=</span> <span class="n">puan</span> <span class="p">&gt;=</span> <span class="m">50</span><span class="p">;</span>  <span class="c1">// Karşılaştırma</span>
<span class="kt">int</span> <span class="n">bonusluPuan</span> <span class="p">=</span> <span class="n">puan</span> <span class="p">+</span> <span class="m">10</span><span class="p">;</span>
</code></pre></div></div>

<p>Aritmetik operatörler matematiksel işlemleri gerçekleştirir. İki sayı $a$ ve $b$ olmak üzere kalan işlemi $a \bmod b$ biçiminde düşünülebilir. C# dilinde bunun karşılığı <code class="language-plaintext highlighter-rouge">%</code> operatörüdür.</p>

<table>
  <thead>
    <tr>
      <th>Grup</th>
      <th>Operatörler</th>
      <th>Örnek kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Aritmetik</td>
      <td><code class="language-plaintext highlighter-rouge">+</code>, <code class="language-plaintext highlighter-rouge">-</code>, <code class="language-plaintext highlighter-rouge">*</code>, <code class="language-plaintext highlighter-rouge">/</code>, <code class="language-plaintext highlighter-rouge">%</code></td>
      <td><code class="language-plaintext highlighter-rouge">sayi % 2</code></td>
    </tr>
    <tr>
      <td>Karşılaştırma</td>
      <td><code class="language-plaintext highlighter-rouge">==</code>, <code class="language-plaintext highlighter-rouge">!=</code>, <code class="language-plaintext highlighter-rouge">&lt;</code>, <code class="language-plaintext highlighter-rouge">&gt;</code>, <code class="language-plaintext highlighter-rouge">&lt;=</code>, <code class="language-plaintext highlighter-rouge">&gt;=</code></td>
      <td><code class="language-plaintext highlighter-rouge">yas &gt;= 18</code></td>
    </tr>
    <tr>
      <td>Mantıksal</td>
      <td><code class="language-plaintext highlighter-rouge">&amp;&amp;</code>, <code class="language-plaintext highlighter-rouge">||</code>, <code class="language-plaintext highlighter-rouge">!</code></td>
      <td><code class="language-plaintext highlighter-rouge">aktif &amp;&amp; yetkili</code></td>
    </tr>
    <tr>
      <td>Atama</td>
      <td><code class="language-plaintext highlighter-rouge">=</code>, <code class="language-plaintext highlighter-rouge">+=</code>, <code class="language-plaintext highlighter-rouge">-=</code>, <code class="language-plaintext highlighter-rouge">*=</code>, <code class="language-plaintext highlighter-rouge">/=</code></td>
      <td><code class="language-plaintext highlighter-rouge">puan += 5</code></td>
    </tr>
    <tr>
      <td>Artırma/Azaltma</td>
      <td><code class="language-plaintext highlighter-rouge">++</code>, <code class="language-plaintext highlighter-rouge">--</code></td>
      <td><code class="language-plaintext highlighter-rouge">sayac++</code></td>
    </tr>
  </tbody>
</table>

<p><img src="/img/c-operatorler-ve-81.svg" alt="c-operatorler-ve-81" /></p>

<p>Mantıksal operatörler Boolean cebirine dayanır. <code class="language-plaintext highlighter-rouge">&amp;&amp;</code> için sonuç yalnızca iki ifade de doğruysa doğrudur:</p>

\[A \land B = true \quad \text{yalnızca A ve B doğruysa}\]

<p><code class="language-plaintext highlighter-rouge">||</code> operatöründe ise koşullardan birinin doğru olması yeterlidir. C# kısa devre değerlendirmesi uygular; <code class="language-plaintext highlighter-rouge">A &amp;&amp; B</code> ifadesinde <code class="language-plaintext highlighter-rouge">A</code> yanlışsa <code class="language-plaintext highlighter-rouge">B</code> çalıştırılmaz. Bu davranış hem performans sağlar hem de bazı null hatalarını engeller.</p>

<h2 id="ca-özgü-kullanışlı-işleçler">C#’a özgü kullanışlı işleçler</h2>

<p>C#, null değerlerle güvenli çalışmayı kolaylaştıran operatörler sunar. <code class="language-plaintext highlighter-rouge">?.</code> yalnızca nesne null değilse üyeye erişir; <code class="language-plaintext highlighter-rouge">??</code> ise sol taraf null olduğunda yedek değer üretir.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">string</span><span class="p">?</span> <span class="n">kullaniciAdi</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
<span class="kt">int</span><span class="p">?</span> <span class="n">uzunluk</span> <span class="p">=</span> <span class="n">kullaniciAdi</span><span class="p">?.</span><span class="n">Length</span><span class="p">;</span>
<span class="kt">string</span> <span class="n">gorunenAd</span> <span class="p">=</span> <span class="n">kullaniciAdi</span> <span class="p">??</span> <span class="s">"Misafir"</span><span class="p">;</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">gorunenAd</span><span class="p">);</span> <span class="c1">// Misafir</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">is</code> tür denetimi ve örüntü eşleştirme için, <code class="language-plaintext highlighter-rouge">as</code> ise güvenli tür dönüşümü için kullanılır. Ayrıca <code class="language-plaintext highlighter-rouge">nameof(degisken)</code> değişkenin adını metin olarak verir; böylece yeniden adlandırmalara dayanıklı hata mesajları oluşturulur.</p>

<table>
  <thead>
    <tr>
      <th>İşleç</th>
      <th>Amaç</th>
      <th>Başarısızlık davranışı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">?.</code></td>
      <td>Güvenli üye erişimi</td>
      <td>Null üretir</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">??</code></td>
      <td>Varsayılan değer seçimi</td>
      <td>Sağ tarafı kullanır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">is</code></td>
      <td>Tür veya örüntü kontrolü</td>
      <td><code class="language-plaintext highlighter-rouge">false</code> üretir</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">as</code></td>
      <td>Referans türü dönüşümü</td>
      <td>Null üretir</td>
    </tr>
  </tbody>
</table>

<h2 id="if-else-ile-karar-vermek">if-else ile karar vermek</h2>

<p><code class="language-plaintext highlighter-rouge">if</code> bloğu koşul doğru olduğunda çalışır. Alternatif yollar <code class="language-plaintext highlighter-rouge">else if</code> ve <code class="language-plaintext highlighter-rouge">else</code> ile tanımlanır.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">not</span> <span class="p">=</span> <span class="m">82</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="n">not</span> <span class="p">&gt;=</span> <span class="m">85</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Pek iyi"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">not</span> <span class="p">&gt;=</span> <span class="m">50</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Geçti"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Tekrar dene"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Basit seçimlerde üçlü koşul operatörü kullanılabilir: <code class="language-plaintext highlighter-rouge">sonuc = kosul ? dogruDeger : yanlisDeger;</code>. Ancak iç içe üçlü ifadeler kodu bulmacaya çevirebilir; okunabilirlik her zaman kısalıktan değerlidir.</p>

<h2 id="döngüsel-iterasyon-mekanizmaları">Döngüsel iterasyon mekanizmaları</h2>

<p>Döngüler tekrar eden işleri otomatikleştirir. Hangi döngünün seçileceği, tekrar sayısının bilinip bilinmemesine bağlıdır.</p>

<table>
  <thead>
    <tr>
      <th>Döngü</th>
      <th>Ne zaman tercih edilir?</th>
      <th>Özellik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">for</code></td>
      <td>Tekrar sayısı biliniyorsa</td>
      <td>Sayaç kontrolü sunar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">while</code></td>
      <td>Devam koşulu önemliyse</td>
      <td>Koşulu başta sınar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">do-while</code></td>
      <td>İşlem en az bir kez yapılacaksa</td>
      <td>Koşulu sonda sınar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">foreach</code></td>
      <td>Koleksiyon gezilecekse</td>
      <td>İndeks yönetimi gerektirmez</td>
    </tr>
  </tbody>
</table>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">string</span><span class="p">[]</span> <span class="n">diller</span> <span class="p">=</span> <span class="p">{</span> <span class="s">"C#"</span><span class="p">,</span> <span class="s">"Java"</span><span class="p">,</span> <span class="s">"Python"</span> <span class="p">};</span>

<span class="k">foreach</span> <span class="p">(</span><span class="kt">string</span> <span class="n">dil</span> <span class="k">in</span> <span class="n">diller</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">dil</span> <span class="p">==</span> <span class="s">"Java"</span><span class="p">)</span>
        <span class="k">continue</span><span class="p">;</span> <span class="c1">// Bu turu atlar</span>

    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">dil</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">continue</code> mevcut turu atlatırken <code class="language-plaintext highlighter-rouge">break</code> döngüyü tamamen bitirir. Sonsuz döngülerden kaçınmak için <code class="language-plaintext highlighter-rouge">while</code> koşulunu etkileyen değerin gerçekten değiştiğinden emin olun. Özetle operatörler veriyi işler, koşullar yolu seçer, döngüler ise işi tekrarlar; bu üçlü, neredeyse bütün C# uygulamalarının kontrol merkezidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c#" /><category term="operatörler" /><category term="if-else" /><category term="döngüler" /><category term="programlama" /><category term="kontrol-akışı" /><summary type="html"><![CDATA[Bir C# programı yalnızca yukarıdan aşağıya çalışan komutlardan oluşmaz. Değerleri karşılaştırır, koşullara göre karar verir ve gerektiğinde aynı işlemi tekrarlar. Operatörler bu kararların kelimeleri, kontrol blokları ise programın trafik ışıklarıdır. Gelin C# kodunun nasıl düşündüğünü adım adım inceleyelim.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-operatorler-ve-81.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-operatorler-ve-81.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>