C++ Dilinde : Operator Precedence
- Yusuf Hançar

- Sep 4, 2025
- 3 min read
Updated: Dec 27, 2025
Programlama dillerinde operatörler, ifadelerin işlenme şeklini belirleyen en temel araçlardandır. Ancak bu operatörlerin her zaman aynı sırayla çalışmadığını bilmek, özellikle karmaşık ifadelerin doğru yorumlanabilmesi açısından kritik önem taşır. C++ dilinde “operator önceliği” adı verilen bu kavram, hangi işlemin önce, hangisinin sonra gerçekleştirileceğini tanımlar.
Yanlış anlaşılan bir öncelik kuralı, geliştiricinin niyetinden farklı sonuçlar doğurabilir; hatta bazı durumlarda programın hatalı çalışmasına veya güvenlik açıklarına yol açabilir. Dolayısıyla operatör önceliğini ve bağlaşıklık/ilişkisellik (associativity) kurallarını bilmek üretim ortamında güvenilir ve okunabilir kod yazabilmek için de gereklidir.

Precedence associativity seçimi ?
Precedence : Hangi grup önce bağlanır. Örneğin: * (çarpma) +’dan önce.
associativity : Aynı gruptakiler nasıl zincirlenir.
a - b - c → (a - b) - c (soldan)
a = b = c → a = (b = c) (sağdan)
C++ dilinde = operatörü sağdan sola associativity kuralına sahiptir. Yani birden fazla atama arka arkaya yazıldığında, ifadeler sağdan gruplandırılır.
Çünkü b = c ifadesi bir değer döndürür (dönüş tipi b’nin türü).
Ardından bu değer a’ya atanır.
Böylece hem b hem a aynı değeri alır.
Eğer bu operatör soldan associativity olsaydı (a = b) = c olurdu.
Ama a = b ifadesi genellikle bir geçici değer (temporary) olurdu ve bunu tekrar atamak mantıksız/hatalı olurdu. Bu yüzden = mantıksal olarak sağdan bağlaşır.Çünkü çıkarma işlemi associative değildir (yani farklı gruplama farklı sonuç verir).
(a - b) - c ≠ a - (b - c) çoğu durumda.Short-Circuit
&& : Sol taraf false ise sağ taraf değerlendirilmez.
|| : Sol taraf true ise sağ taraf değerlendirilmez.
bool log(const char* tag)
{
std::cout << tag << "\n";
return true;
}
int sc = 0;
if (sc != 0 && (10 / sc) > 1) { /* güvenli, sağ taraf çalışmaz */ }
if (log("A") || log("B")) { /* "A" yazılır, "B" çalışmayabilir */ }Karşılaştırma ve Eşitlik
bool r = 1 < 2 == 3 < 4; // `<` ve `==` farklı seviyede : `<` önce; sonra `==`
(1 < 2) == (3 < 4) → true == true → trueTernary ?: ve Atama = Sağdan Bağlaşır
int a = 1, b = 2, c = 3;
(a < b ? a : b) = 10; // lvalue dönerse atanabilir
int x; int y;
x = y = 5; // y = 5, sonra x = 5Virgül (,) En Düşük Öncelik
int sc = (std::cout << "smartcode", 42); // sc = 42; önce sol ifade çalışırOverload, önceliği değiştirmez.
operator[], operator(), operator< gibi operatörler anlamı korumalı.
int a = 2, b = 3, c = 4;
int r = a + b * c << 1 >= 10;
// b*c (5), a+.. (6), << (7), >= (8)
// b*c = 12 → a + 12 = 14 → 14 << 1 = 28 → 28 >= 10 = true → r = 1int x = 1, y = 2;
(x < y ? x : y) += 5; // x = 6int sc = (x += 2, y += 3, 100); // x ve y güncellenir, sc = 100int sc = 1 + 2 << 3;
// 1 + 2 → 3, 3 << 3 → 24bool sc = 3 < 5 == 8 > 2;
// (3 < 5) ve (8 > 2) → true == true → trueint sc = (10, 20, 30) + 2;
// (10, 20, 30) → 30; 30 + 2 → 32int a = 1, b = 2;
int c = (a < b ? a : b) * 10;
// (a < b ? a : b) → 1; 1 * 10 → 10




Comments