← Kursa Dön
📄 Text · 12 min

İlk Programın: Hello World

Programlama öğrenmenin evrensel bir geleneği var: her dilde ilk yazılan program ekrana "Hello, World!" yazdırır. Bu gelenek 1978'den, Brian Kernighan ve Dennis Ritchie'nin C programlama kitabından beri süregliyor.

Şimdi senin de ilk C++ programını yazma zamanı. Her satırı teker teker açıklayacağız — hiçbir şey "öylesine" yazılmıyor.


İlk Programın

İşte C++'ta en basit çalışan program:

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

Bu 6 satırlık kodu derleyip çalıştırdığında ekranda şunu göreceksin:

Hello, World!

Basit görünüyor ama bu 6 satırda C++'ın birçok temel kavramı gizli. Hadi her satırı inceleyelim.


Satır Satır Açıklama

Satır 1: #include <iostream>

#include <iostream>

Bu satır preprocessor direktifi. # işareti ile başlayan her satır derleme öncesi işlenir.

#include <iostream> derleyiciye şunu söyler: *"iostream adlı header dosyasının içeriğini buraya yapıştır."*

iostream = input/output stream (giriş/çıkış akışı). Bu header dosyası std::cout (ekrana yazma) ve std::cin (klavyeden okuma) gibi araçları içerir.

Bunu dahil etmezsen derleyici cout'un ne olduğunu bilmez ve hata verir.

🏠 Analoji: #include bir mutfak dolabından malzeme almak gibidir. Yemek yapmadan önce hangi malzemelere ihtiyacın varsa dolabı açıp alman gerekir. iostream bir malzeme paketi — içinde cout, cin, endl gibi araçlar var.

Satır 2: Boş satır

Boş satırlar derleyici için bir anlam ifade etmez. Sadece kodun okunabilirliğini artırır. Mantıksal blokları ayırmak için kullan.

Satır 3: int main() {

int main() {

Bu satırda üç önemli bilgi var:

  • `int` — Fonksiyonun dönüş tipi. main bir tamsayı (integer) döndürür.

  • `main` — Fonksiyonun adı. C++'ta her program main fonksiyonundan başlar. Bu isim zorunludur — değiştiremezsin.

  • `()` — Parametre listesi. Şimdilik boş, yani bu fonksiyon dışarıdan bilgi almıyor.

  • `{` — Fonksiyon gövdesinin başlangıcı. Süslü parantez (curly brace) bir kod bloğunun başladığını belirtir.

main özel bir fonksiyondur. İşletim sistemi programını çalıştırdığında ilk olarak main fonksiyonunu arar ve çalıştırır. main yoksa program derlenmez.

Satır 4: std::cout << "Hello, World!" << std::endl;

std::cout << "Hello, World!" << std::endl;

Bu satır biraz yoğun. Parçalayalım:

  • `std::cout` — Standart çıktı akışı (standard character output). Ekrana yazmak için kullanılır.

  • `<<` — Ekleme operatörü (insertion operator). Sağındaki veriyi cout'a gönderir.

  • `"Hello, World!"` — String literal. Çift tırnak içindeki metin.

  • `std::endl` — Satır sonu (end line). İmleci bir alt satıra götürür ve çıktı tamponunu (buffer) temizler.

  • `;` — Her ifade (statement) noktalı virgülle biter.

<< operatörünü zincirleme kullanabilirsin:

std::cout << "Merhaba" << " " << "Dunya" << std::endl;
// Çıktı: Merhaba Dunya

Satır 5: return 0;

return 0;

main fonksiyonu işletim sistemine bir sayı döndürür:

  • 0 — "Program başarıyla tamamlandı" demek.

  • Sıfır olmayan değer — "Bir hata oluştu" demek.

Bu dönüş değerini terminal üzerinden kontrol edebilirsin:

./program
echo $?    # Son çalışan programın dönüş değerini gösterir
# Çıktı: 0

💡 İpucu: C++17'den itibaren main fonksiyonunda return 0; yazmazsan derleyici otomatik olarak 0 döndürür. Ama açıkça yazmak iyi bir alışkanlıktır — kodu okuyan kişi niyetini anlar.

Satır 6: }

}

Fonksiyon gövdesinin kapanışı. { ile açılan her blok } ile kapanmalıdır.


Namespace Nedir?

Koddaki std:: kısmını fark ettin mi? Bu bir namespace (isim alanı) belirteci.

Problem: İsim Çakışması

Büyük projelerde farklı kütüphanelerdeki fonksiyonların aynı ismi taşıması olası. Mesela sen de bir cout fonksiyonu yazarsan, derleyici hangisini kullanacağını bilemez.

Çözüm: Namespace

Namespace, isimleri gruplamak için kullanılan bir mekanizmadır. Standart kütüphanenin tüm öğeleri std namespace'i içindedir.

std::cout    // std namespace'indeki cout
std::cin     // std namespace'indeki cin
std::endl    // std namespace'indeki endl
std::string  // std namespace'indeki string

std:: prefix'i "bu öğe standart kütüphaneden geliyor" demek.

Kendi namespace'ini tanımlama

#include <iostream>

namespace matematik {
    double topla(double a, double b) {
        return a + b;
    }
}

namespace fizik {
    double topla(double kutle, double ivme) {
        return kutle * ivme;  // F = m * a
    }
}

int main() {
    std::cout << matematik::topla(3.0, 5.0) << std::endl;  // 8
    std::cout << fizik::topla(10.0, 9.8) << std::endl;      // 98
    return 0;
}

İki farklı topla fonksiyonu var ama namespace sayesinde çakışma olmuyor.


using namespace std; — Kullanmalı mı?

Birçok C++ kaynağında şu satırı göreceksin:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, World!" << endl;  // std:: yazmaya gerek yok
    return 0;
}

using namespace std; satırı, std namespace'indeki tüm isimleri küresel alana (global scope) açar. Böylece std::cout yerine sadece cout yazabilirsin.

Neden Tercih Edilmez?

Küçük programlarda sorun yaratmaz ama büyük projelerde:

  1. İsim çakışması riski artar. std namespace'inde yüzlerce isim var. Bunlardan biriyle kendi değişkeninin adı çakışabilir.

  2. Kodun okunabilirliği düşer. std::vector gördüğünde hemen "bu standart kütüphaneden" anlarsın. Sadece vector gördüğünde nereden geldiğini bilemezsin.

  3. Header dosyalarında asla kullanılmamalı. Header'lar her yere dahil edildiğinden, tüm projeyi etkiler.

Tavsiye Edilen Yaklaşımlar

En iyi: Her yerde std:: prefix kullan.

std::cout << "Merhaba" << std::endl;
std::vector<int> sayilar;
std::string isim;

Orta yol: Sadece sık kullandıklarını aç.

using std::cout;
using std::cin;
using std::endl;

int main() {
    cout << "Merhaba" << endl;
    return 0;
}

Bu kursta biz `std::` prefix kullanacağız. Biraz fazla yazmak gibi görünebilir ama zamanla parmakların alışır ve kodun her zaman net olur.

⚠️ Dikkat: using namespace std; satırını header dosyalarına (.h veya .hpp) asla koyma. Bu, o header'ı include eden her dosyayı etkiler ve beklenmedik hatalara yol açabilir.


Programı Çeşitlendirelim

Birden Fazla Satır Yazdırma

#include <iostream>

int main() {
    std::cout << "Satir 1" << std::endl;
    std::cout << "Satir 2" << std::endl;
    std::cout << "Satir 3" << std::endl;
    return 0;
}

Tek cout ile Çoklu Satır

#include <iostream>

int main() {
    std::cout << "Ad: Ali" << std::endl
              << "Yas: 25" << std::endl
              << "Sehir: Istanbul" << std::endl;
    return 0;
}

<< operatörünü zincirleme kullanabilirsin. Her << yeni bir veri ekler.

Sayıları Yazdırma

#include <iostream>

int main() {
    std::cout << "Tam sayi: " << 42 << std::endl;
    std::cout << "Ondalik: " << 3.14 << std::endl;
    std::cout << "Toplam: " << 10 + 20 << std::endl;
    std::cout << "Carpim: " << 7 * 6 << std::endl;
    return 0;
}
Tam sayi: 42
Ondalik: 3.14
Toplam: 30
Carpim: 42

cout string, tamsayı, ondalıklı sayı, hatta aritmetik ifadeleri bile yazdırabilir.

Özel Karakterler (Escape Sequences)

Bazı karakterleri doğrudan yazamazsın. Bunlar için kaçış dizileri (escape sequences) kullanılır:

Kaçış DizisiAnlam
\nYeni satır (new line)
\tTab (sekme)
\\Ters eğik çizgi
\"Çift tırnak
\'Tek tırnak
\0Null karakter
#include <iostream>

int main() {
    std::cout << "Birinci satir\nIkinci satir\n";
    std::cout << "Ad:\tAli\n";
    std::cout << "Soyad:\tVeli\n";
    std::cout << "O dedi ki: \"Merhaba!\"\n";
    std::cout << "Dosya yolu: C:\\Users\\Ali\\belgeler\n";
    return 0;
}
Birinci satir
Ikinci satir
Ad:     Ali
Soyad:  Veli
O dedi ki: "Merhaba!"
Dosya yolu: C:\Users\Ali\belgeler

main() Fonksiyonunun Detayları

Parametre Alan main

main fonksiyonu iki formda yazılabilir:

// Form 1: Parametresiz
int main() {
    return 0;
}

// Form 2: Komut satırı argümanları alan
int main(int argc, char* argv[]) {
    return 0;
}

İkinci formda:

  • `argc` (argument count) — Komut satırından kaç argüman geçildiği.

  • `argv` (argument vector) — Argümanların kendileri (metin dizisi).

#include <iostream>

int main(int argc, char* argv[]) {
    std::cout << "Arguman sayisi: " << argc << std::endl;
    for (int i = 0; i < argc; ++i) {
        std::cout << "argv[" << i << "] = " << argv[i] << std::endl;
    }
    return 0;
}
./program merhaba dunya
Arguman sayisi: 3
argv[0] = ./program
argv[1] = merhaba
argv[2] = dunya

argv[0] her zaman programın kendi adıdır.

Dönüş Değeri Kuralları

int main() {
    // return 0;          → Başarı
    // return 1;          → Genel hata
    // return EXIT_SUCCESS → 0 ile aynı (cstdlib header'ında)
    // return EXIT_FAILURE → Sıfır olmayan (cstdlib header'ında)
    return 0;
}

💡 İpucu: main fonksiyonu dışında program başlatmak tanımsız davranış (undefined behavior) olur. Her C++ programı tek bir main fonksiyonuna sahip olmalıdır — ne eksik ne fazla.


Programı Derleme ve Çalıştırma

Linux / macOS

# Dosyayı yaz
nano hello.cpp

# Derle
g++ -std=c++17 -Wall hello.cpp -o hello

# Çalıştır
./hello

Windows (MinGW)

g++ -std=c++17 -Wall hello.cpp -o hello.exe
hello.exe

Windows (Visual Studio)

Visual Studio'da yeni bir "Console Application" projesi oluştur. IDE derleme ve çalıştırma işlemini senin için yapar — Ctrl+F5 ile çalıştır.

Online Derleyici

Hiçbir şey yüklemeden denemek istiyorsan [cpp.sh](https://cpp.sh) veya [godbolt.org](https://godbolt.org) adresine git, kodu yapıştır ve çalıştır.


Yaygın Hatalar ve Çözümleri

1. iostream'i dahil etmemek

int main() {
    std::cout << "Merhaba";  // Hata!
    return 0;
}
error: 'cout' is not a member of 'std'

Çözüm: #include <iostream> eklemeyi unutmuşsun.

2. Noktalı virgül unutmak

#include <iostream>
int main() {
    std::cout << "Merhaba" << std::endl  // ; yok!
    return 0;
}

Çözüm: Her ifadenin sonuna ; koy.

3. main yerine Main yazmak

int Main() {  // Büyük M!
    return 0;
}
undefined reference to 'main'

Çözüm: C++ büyük-küçük harf duyarlıdır. main küçük harfle yazılmalıdır.

4. String'de çift tırnak unutmak

std::cout << Merhaba;  // Tırnak yok!
error: 'Merhaba' was not declared in this scope

Çözüm: Metinleri çift tırnak içine al: "Merhaba".


Alıştırma: Kartvizit Programı

Öğrendiklerini pekiştirmek için şu programı yaz:

#include <iostream>

int main() {
    std::cout << "================================" << std::endl;
    std::cout << "        KARTVIZIT               " << std::endl;
    std::cout << "================================" << std::endl;
    std::cout << "Ad:      Ali Yilmaz" << std::endl;
    std::cout << "Unvan:   Yazilim Gelistirici" << std::endl;
    std::cout << "E-posta: ali@example.com" << std::endl;
    std::cout << "Tel:     +90 555 123 4567" << std::endl;
    std::cout << "================================" << std::endl;
    return 0;
}

Kendi bilgilerinle değiştir, derle ve çalıştır. Bu kadar — ilk C++ programını yazmış oldun!


Özet

  • Her C++ programı `main()` fonksiyonundan başlar; bu fonksiyon zorunludur ve adı değiştirilemez.

  • `#include <iostream>` satırı, cout ve cin gibi giriş/çıkış araçlarını kullanmak için gereklidir.

  • `std::cout << "metin"` ekrana yazdırır; << operatörü veriyi çıktı akışına gönderir.

  • `std::` prefix'i standart kütüphane öğelerini belirtir; using namespace std; yerine std:: kullanmayı tercih et.

  • `return 0;` programın başarıyla tamamlandığını işletim sistemine bildirir.

  • Escape sequence'ler (\n, \t, \") özel karakterleri yazdırmak için kullanılır.