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

- Sep 4
- 3 min read
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