top of page

C++ Dilinde : Operator Precedence

  • Writer: Yusuf Hançar
    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.



ree

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 → true

Ternary ?: 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 = 5

 Virgül (,) En Düşük Öncelik
int sc = (std::cout << "smartcode", 42); // sc = 42; önce sol ifade çalışır


  • Overload, ö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 = 1

int x = 1, y = 2;
(x < y ? x : y) += 5; // x = 6

int sc = (x += 2, y += 3, 100); // x ve y güncellenir, sc = 100

int sc = 1 + 2 << 3;

// 1 + 2 → 3, 3 << 3 → 24

bool sc = 3 < 5 == 8 > 2;

// (3 < 5) ve (8 > 2) → true == true → true

int sc = (10, 20, 30) + 2;

// (10, 20, 30) → 30; 30 + 2 → 32

int a = 1, b = 2; 
int c = (a < b ? a : b) * 10;

// (a < b ? a : b) → 1; 1 * 10 → 10

ree

 
 
 

Recent Posts

See All
C++ Dilinde std::invoke

C++17 ile birlikte dile eklenen std::invoke, farklı türde çağrılabilir nesneleri (callable) tek bir ortak arabirim üzerinden...

 
 
 
C++ Dilinde [[nodiscard]] attribute

C++’ta [[attribute]] (öznitelik) mekanizması, kod hakkında ek bilgi sağlayarak derleyicinin uyarılar vermesine, belirli optimizasyonlar...

 
 
 

Comments


bottom of page