Bu eğiticide, örnekler yardımıyla C ++ 'daki operatörlerin önceliği ve ilişkilendirilebilirliği hakkında bilgi edineceğiz.
C ++ Operatörlerinin Önceliği
Tek bir ifadede birden fazla operatör varsa, işlemler aynı anda değerlendirilmez. Bunun yerine, daha yüksek önceliğe sahip operatörlerin operasyonları ilk olarak değerlendirilir.
Bir örnek düşünelim:
int x = 5 - 17 * 6;
Burada çarpma operatörü *
, çıkarma operatöründen daha yüksek düzeyde önceliğe sahiptir -
. Bu nedenle 17 * 6
önce değerlendirilir.
Sonuç olarak, yukarıdaki ifade eşdeğerdir
int x = 5 - (17 * 6);
5 - 17
Önce değerlendirmek istiyorsak , onları parantez içine almalıyız :
int x = (5 - 17) * 6;
Örnek 1: Operatörlerin Önceliği
#include using namespace std; int main() ( // evaluates 17 * 6 first int num1 = 5 - 17 * 6; // equivalent expression to num1 int num2 = 5 - (17 * 6); // forcing compiler to evaluate 5 - 17 first int num3 = (5 - 17) * 6; cout << "num1 = " << num1 << endl; cout << "num2 = " << num2 << endl; cout << "num3 = " << num3 << endl; return 0; )
Çıktı
num1 = -97 num2 = -97 num3 = -72
Not: C ++ 'da birden çok öncelik düzeyine sahip çok sayıda operatör olduğundan, kodumuzu daha okunaklı hale getirmek için parantez kullanmamız şiddetle tavsiye edilir .
C ++ Operatörleri Öncelik Tablosu
Aşağıdaki tablo (cppreference.com'dan alınmıştır) C ++ operatörlerinin önceliğini göstermektedir. Öncelik Düzeyi 1, en yüksek önceliğe sahip işleçleri belirtirken, Öncelik Düzeyi 17, en düşük önceliğe sahip işleçleri belirtir.
Mülkiyet ilişkilendirilebilirlik kısaca ele alınacaktır.
Öncelik | Şebeke | Açıklama | İlişkisellik |
---|---|---|---|
1 | :: | Kapsam Çözümü | Soldan sağa |
2 | a ++ a-- type () type () a () a () . -> | Sonek / sonek artışı Sonek / sonek azaltma İşlev cast İşlev atama İşlev çağrısı Bir nesneden Abonelik Üye erişimi Nesne ptr'den üye erişimi | Soldan sağa |
3 | ++ a --a + a -a ! ~ (type) * a & a sizeof co_await new new () delete delete () | Önek Arttırma Önek eksiltme Tekli artı Tekli eksi Mantıksal değil Bit değil C stili döküm doğru olmayan (KQUEUE) Adres-bölgesinin boyutu-of bekliyoruz ifade Dinamik bellek ayırma Dinamik Hafıza serbest bırakma | Sağdan sola |
4 | . * -> * | Üye nesne seçici Üye işaretçi seçici | Soldan sağa |
5 | a * b a / b a% b | Çarpma Bölme Modülü | Soldan sağa |
6 | a + b a - b | Toplama Çıkarma | Soldan sağa |
7 | << >> | Bit düzeyinde sola kaydırma Bit düzeyinde sağa kaydırma | Soldan sağa |
8 | <= < | Üç yollu karşılaştırma operatörü | Soldan sağa |
9 | < <= > > = | Less than Less than or equal to Greater than Greater than or equal to | Left to Right |
10 | == != | Equal to Not equal to | Left to Right |
11 | & | Bitwise AND | Left to Right |
12 | ^ | Bitwise XOR | Left to Right |
13 | | | Bitwise OR | Left to Right |
14 | && | Logical AND | Left to Right |
15 | || | Logical OR | Left to Right |
16 | a ? b : c throw co_yield = += -= *= /= %= <<= >>= &= ^= |= | Ternary Conditional throw operator yield expression (C++ 20) Assignment Addition Assignment Subtraction Assignment Multiplication Assignment Division Assignment Modulus Assignment Bitwise Shift Left Assignment Bitwise Shift Right Assignment Bitwise AND Assignment Bitwise XOR Assignment Bitwise OR Assignment | Right to Left |
17 | , | Comma operator | Left to Right |
C++ Operators Associativity
Operator associativity is the direction from which an expression is evaluated. For example,
int a = 1; int b = 4; // a will be 4 a = b;
Take a look at a = 4;
statement. The associativity of the =
operator is from right to left. Hence, the value of b is assigned to a, and not in the other direction.
Ayrıca, birden çok operatör aynı öncelik düzeyine sahip olabilir (yukarıdaki tablodan da görebileceğimiz gibi). Bir ifadede aynı öncelik düzeyine sahip birden çok operatör kullanıldığında, bunlar ilişkilendirilebilirliklerine göre değerlendirilir .
int a = 1; int b = 4; b += a -= 6;
Operatörler Hem +=
ve -=
operatörler aynı önceliğe sahiptir. Bu operatörlerin çağrışımları sağdan sola doğru olduğu için, işte son cümle nasıl değerlendirilir.
a -= 6
önce değerlendirilir. Dolayısıyla, a -5 olacaktır- Daha sonra
b += -5
değerlendirilecektir. Bu nedenle, b -1 olacaktır
Örnek 2: Operatör İlişkilendirmesi
#include using namespace std; int main() ( int a = 1; int b = 4; // a -= 6 is evaluated first b += a -= 6; cout << "a = " << a << endl; ; cout << "b = " << b; )
Çıktı
a = -5 b = -1