Aracılığıyla paylaş


Öncelik ve değerlendirme sırası

C işleçlerinin öncelik ve birleşimleri, ifadelerde işlenenlerin gruplandırılmasını ve değerlendirilmesini etkiler. Bir işlecin önceliği, daha yüksek veya daha düşük önceliğe sahip başka işleçler varsa bir anlam ifade eder. Önce daha yüksek önceliğe sahip işleçler değerlendirilir. Öncelik, "bağlama" sözcüğüyle de açıklanabilir. Daha yüksek önceliğe sahip işleçlerin daha sıkı bağlamaya sahip olduğu söylenir.

Aşağıdaki tabloda, C işleçlerinin öncelik ve ilişkilendirilebilirliği (işlenenlerin değerlendirilme sırası) özetlenmekte ve öncelikleri en yüksekten en düşüğe listelenmektedir. Birkaç işlecin birlikte göründüğü yerlerde, bu işleçler aynı önceliğe sahip olur ve ilişkilendirilebilirliklerine göre değerlendirilir. Tablodaki işleçler, SonEk İşleçleri ile başlayan bölümlerde açıklanmıştır. Bu bölümün geri kalanında, öncelik ve ilişkilendirilebilirlik hakkında genel bilgiler verilmektedir.

C işleçlerinin önceliği ve ilişkilendiriciliği

Simge 1 İşlem türü İlişkilendirilebilirlik
[ ] ( ) . ->
++-- (sonek)
Expression Soldan sağa
sizeof & * + - ~ !
++-- (ön ek)
Birli Sağdan sola
typecasts Birli Sağdan sola
* / % Çarpma Soldan sağa
+ - Katkı Soldan sağa
<< >> Bit düzeyinde kaydırma Soldan sağa
< > <= >= İlişkisel Soldan sağa
== != Eşitlik Soldan sağa
& Bit düzeyinde AND Soldan sağa
^ Bit düzeyinde dışlamalı OR Soldan sağa
| Bit düzeyinde kapsamalı OR Soldan sağa
&& Mantıksal AND Soldan sağa
|| Mantıksal OR Soldan sağa
? : Koşullu ifade Sağdan sola
= *= /= %=
+= -= <<= >>= &=
^= |=
Basit ve bileşik atama 2 Sağdan sola
, Sıralı değerlendirme Soldan sağa

1 İşleçler azalan öncelik sırasına göre listelenir. Aynı satırda veya grupta birkaç işleç görünüyorsa, bunlar eşit önceliğe sahip olur.

2 Tüm basit ve bileşik atama işleçleri eşit önceliğe sahiptir.

Bir ifade eşit önceliğe sahip birkaç işleç içerebilir. Böyle birkaç işleç bir ifadede aynı düzeyde göründüğünde, değerlendirme işlecin ilişkilendirilebilirliğine göre sağdan sola veya soldan sağa devam eder. Değerlendirme yönü, aynı düzeyde birden fazla çarpma (), toplama (*+) veya ikili bit düzeyinde (&, |, veya ^) işleci içeren ifadelerin sonuçlarını etkilemez. İşlemlerin sırası dil tarafından tanımlanmaz. Derleyici, tutarlı bir sonuç sağladığı sürece bu tür ifadeleri herhangi bir sırada değerlendirebilir.

Yalnızca sıralı değerlendirme (), mantıksal AND (,&&), mantıksal-OR (), koşullu ifade (||? :) ve işlev çağrısı işleçleri sıralı noktaları oluşturur ve bu nedenle işlenenleri için belirli bir değerlendirme sırasını garanti eder. İşlev çağrısı işleci, işlev tanımlayıcısının arkasından gelen bir parantezler kümesidir. Sıralı değerlendirme işlecinin (,) işlenenlerini soldan sağa değerlendirmesi garanti edilir. (İşlev çağrısındaki virgül işleci sıralı değerlendirme işleciyle aynı değildir ve böyle bir garanti sağlamaz.) Daha fazla bilgi için bkz . Sıra noktaları.

Mantıksal işleçler de işlenenlerinin soldan sağa değerlendirilmesini garanti eder. Bununla birlikte, ifadenin sonucunu belirlemek için gereken en az sayıda işleneni değerlendirirler. Buna "kısa devre" değerlendirmesi adı verilir. Bu nedenle, ifadenin bazı işlenenleri değerlendirilmeyebilir. Örneğin, ifadede

x && y++

ikinci işlenen y++, yalnızca x true (sıfırdan farklı) olduğunda değerlendirilir. Bu nedenle, yx yanlış (0) olduğunda artmaz.

Örnekler

Aşağıdaki listede, derleyicinin bazı örnek ifadeleri otomatik olarak nasıl bağladığı gösterilmektedir:

Expression Otomatik Bağlama
a & b || c (a & b) || c
a = b || c a = (b || c)
q && r || s-- (q && r) || s--

İlk ifadede, bit düzeyinde AND işleci (&), mantıksal OR işlecine (||) göre daha yüksek bir önceliğe sahiptir, bu nedenle a & b mantıksal OR işleminin ilk işlenenini oluşturur.

İkinci ifadede, mantıksal OR işleci (||) basit atama işlecine (=) göre daha yüksek bir önceliğe sahiptir, bu nedenle b || c atamada sağ işlenen olarak gruplandırılır. a'ya atanan değerin 0 veya 1 olduğuna dikkat edin.

Üçüncü ifade, beklenmedik bir sonuç oluşturabilecek doğru bir şekilde biçimlendirilmiş bir ifadeyi gösterir. Mantıksal AND işleci (&&), mantıksal OR işlecine (||) göre daha yüksek bir önceliğe sahiptir, bu nedenle q && r bir işlenen olarak gruplandırılır. Mantıksal işleçler işlenenlerin soldan sağa değerlendirilmesini garanti ettiğinden, q && r öncesinde s--değerlendirilir. Ancak sıfır olmayan bir değere s-- değerlendirilirse q && r değerlendirilmez ve s azalmaz. Azaltma s olmaması programınızda bir soruna neden olacaksa, s-- ifadenin ilk işleneni olarak görünmelidir veya s ayrı bir işlemde azalmalıdır.

Aşağıdaki ifade geçersizdir ve derleme zamanında bir tanılama iletisi oluşturur:

Geçersiz İfade Varsayılan Gruplandırma
p == 0 ? p += 1: p += 2 ( p == 0 ? p += 1 : p ) += 2

Bu ifadede, eşitlik işleci (==) en yüksek önceliğe sahiptir, bu nedenle p == 0 bir işlenen olarak gruplandırılır. Koşullu ifade işleci (? :) sonraki en yüksek önceliğe sahiptir. İlk işleneni p == 0, ikinci işleneni ise p += 1'dir. Ancak, koşullu ifade işlecinin son işleneni p yerine p += 2 olarak kabul edilir; çünkü bu p örneği koşullu ifade işlecine, bileşik atama işlecine göre daha yakından bağlanır. += 2 sol işlenene sahip olmadığı için bir sözdizimi hatası oluşur. Bu türden hataları önlemek ve daha okunabilir bir kod oluşturmak için parantez kullanmanız gerekir. Örneğin, yukarıdaki örneği düzeltmek ve netleştirmek için parantezleri aşağıda gösterildiği gibi kullanabilirsiniz:

( p == 0 ) ? ( p += 1 ) : ( p += 2 )

Ayrıca bkz.

C işleçleri