Operatörlerin birlikteliği nedir ve neden önemlidir?


89

İlişkilendirme nedir (bir operatör için) ve neden önemlidir?

Güncellenmiş: operatör ilişkilendirmesi


2
Ne tür bir çağrışım? Operatör çağrışımı?
Ikke

26
@Neil Butterworth - Makul bir soru gibi görünen şey için özellikle sert bir yorum. Sitenin tüm amacı, giriş metinlerinde kapsanan şeyler dahil TÜM programlama bilgisi için merkezi bir depo olmaktır. @Jian Lin'in kendi yorumunu yanıtlaması hakkında yorum yapmanıza gelince, bu da resmi SSS'nin ilk sorusunda belirtildiği gibi kabul edilebilir. Temsilci seviyenize sahip biri daha iyi bilmeli. Buna katılmıyorsanız, en azından bu konuda nazik olun.
Rob Allen

1
@Rob Allen Diğer gönderilerine bakın. Ayrıca, kendi gönderisine cevap vermemesi gerektiğini söylemedim, sadece yardımcı olmadığını söyledim. Ve seninle bir anlaşma yapacağım - benimkini nasıl ifade edeceğimi bana söylemezsen, burada gönderilerini nasıl ifade edeceğini söylemeyeceğim.

Yanıtlar:


106

Operatörler için ilişkilendirilebilirlik, aynı operatör bir satırda göründüğünde, daha sonra hangi operatör oluşumunu ilk uyguladığımız anlamına gelir. Aşağıda Qoperatör olalım

a Q b Q c

Eğer Qsol taraf ise, o zaman olarak değerlendirir

(a Q b) Q c

Ve eğer doğru çağrışımsal ise, o zaman şu şekilde değerlendirir:

a Q (b Q c)

Bir ifadenin anlamını değiştirdiği için önemlidir. İlişkili bırakılan tamsayı aritmetiği ile bölme operatörünü düşünün

4 / 2 / 3    <=>    (4 / 2) / 3    <=> 2 / 3     = 0

Doğru ilişkilendirilebilir olsaydı, tanımlanmamış bir ifade olarak değerlendirilirdi, çünkü sıfıra bölerdiniz

4 / 2 / 3    <=>    4 / (2 / 3)    <=> 4 / 0     = undefined

Verilen gramer için sol veya sağ olsun, çağrışımsallığı nasıl bulacağınızı biliyor musunuz?
user2510115

1
Örneğin expr -> expr + term;, sol ilişkiseldir ve expr -> term + exprsağ ilişkiseldir.
Subin Sebastian

15
Cevabınızın ilk satırında "aynı operatör göründüğünde" yerine "aynı önceliğe sahip operatörler göründüğünde" demek daha doğru olur. Örnek: a * b / c => burada * ve / aynı önceliğe sahiptir.
1O1

2
@ 1O1 teşekkürler, ama aynı önceliğe sahip operatörlerin farklı ilişkilendirilebilirliği varsa ne olur? Sol-çağrışımlı ancak sağ çağrışımlı a * b / colacaksa nasıl değerlendirilir ? Sonra bir çelişki var. Bu yüzden, birden fazla operatörü kapsamak istiyorsanız, "aynı önceliğe ve ilişkiye sahip operatörler olduğunda" demek gerektiğini düşünüyorum. */
Johannes Schaub -

2
@Mark bilmiyorum ama nasıl çalışması gerektiğini düşünemiyorum. Muhtemelen fazladan bir
yığın aşımı

13

Üç tür çağrışım vardır:

Matematikte İlişkisel özellik

Programlama dillerinde İşlem Sırası

CPU önbelleklerinde ilişkilendirilebilirlik.

Matematikteki İlişkili özellik, toplama (+) gibi operatörlerin bir özelliğidir. Bu özellik, bir ifadenin değerini değiştirmeden parantezleri yeniden düzenlemenizi sağlar, yani:

(a + b) + c = a + (b + c)

Programlama dillerinde, bir operatörün ilişkilendirilebilirliği (veya sabitliği), aynı önceliğe sahip operatörlerin yokluğunda nasıl gruplandırılacağını belirleyen bir özelliktir. parantez ; yani, her operatörün hangi sırayla değerlendirildiği. Bu, programlama dilleri arasında farklılık gösterebilir.

CPU önbelleklerinde ilişkilendirilebilirlik, performansı optimize etmenin bir yöntemidir.


3
Bir operatörün ilişkilendirilebilirliği (veya sabitliği), aynı önceliğe sahip operatörlerin parantez olmadan nasıl gruplandırılacağını belirleyen bir özelliktir - bu ifade anlamamı sağlamak için mükemmeldi
Rafael Eyng

7

Basit!!

Left Associative means we evaluate our expression from left to right

Right Associative means we evaluate our expression from right to left 

* Ve% 'nin aynı önceliğe sahip olduğunu biliyoruz, ancak ilişkilendirilebilirliğe göre yanıt değişebilir:

Örneğin: İfademiz var: 4 * 8/2% 5

Left associative:   (4 * 8) / 2 % 5 ==> (32 / 2) % 5 ==> 16 % 5 ==> 1

Right associative:  4 * 8 /(2 % 5) ==>  4 * ( 8 / 2) ==> 4 * 4 ==> 16

2
Cevapta bir hata var gibi görünüyor: 2 % 5değerlendiriyor 2, değil 0.
6005

6

aynı önceliğe sahip operatörler için değerlendirme sırasıdır. Soldan sağa veya sağa sola sıralaması önemlidir. İçin

3 - 2 - 1

SOLDAN SAĞA ise, o zaman

(3 - 2) - 1

ve 0'dır. SOLA DOĞRU ise, o zaman

3 - (2 - 1)

ve 2'dir. Çoğu dilde, eksi operatörünün SOLA SAĞA bir çağrışım özelliği olduğunu söylüyoruz.

2020 Güncellemesi:

3 - 2 - 1İddia "tabii ki soldan sağa yapıyoruz" ise, durum önemsiz görünebilir. Ancak Ruby'de veya NodeJS'de yapıldığı gibi diğer durumlarda:

$ irb
2.6.3 :001 > 2 ** 3 ** 2
 => 512 

**Operatör "gücüne" dir. İlişkilendirme sağdan sola doğrudur. Ve budur

 2 ** (3 ** 2)

ki bu 2 ** 9, örneğin, 512yerine

(2 ** 3) ** 2

ki bu 8 ** 2, yani, 64.


4
Cevabı zaten biliyorsanız, o zaman neden soruyu sordunuz?
Robert Harvey

6
yeni insanlara yardım etmekti. C'yi uzun zaman önce öğrendiğimi hatırlıyorum ve daha sonrasına kadar çağrışımın gerçekte ne olduğunu bilmiyordum.
nonopolarite

3
C'yi öğrenen çoğu insanın sizin "yardımınız" olmadan yapabileceğinden şüpheleniyorum.

1
hm, örneğin, ilişkilendirilebilirlik aynı operatörle mi sınırlı, yoksa aynı öncelik düzeyindeki operatörler için mi? Pek çok insan kitapları veya referansları kontrol etmeden buna kesin olarak cevap verebilir mi?
nonopolarite

13
@Neil Butterworth, neden bu kadar düşmanca? Kendi sorunuza cevap vermenin kabul edilebilir olduğunu düşünüyorum. Bu SSS bölümündedir ve podcast'te birkaç kez bahsedilmiştir.
Jay Conrod

5

"Operatör ilişkilendirilebilirliği" nden bahsediyorsanız - bu, bir dilin aynı önceliğe sahip operatörlerin parantez olmadan nasıl gruplandırılacağını nasıl belirlediğidir.

Örneğin, C tabanlı dillerdeki + ve - operatörleri aynı önceliğe sahiptir. Her ikisini de kullanan (parantezsiz) bir ifade yazdığınızda, derleyicinin bunları hangi sırada değerlendireceğini belirlemesi gerekir.

12 - 5 + 3 yazarsanız, olası değerlendirmeler şunları içerir:

  1. (12 - 5) + 3 = 10
  2. 12 - (5 + 3) = 4

İfadeyi değerlendirdiğiniz sıraya bağlı olarak farklı sonuçlar alabilirsiniz. C tabanlı dillerde, + ve - sol ilişkiselliğe sahiptir, bu da yukarıdaki ifadenin ilk durum olarak değerlendirileceği anlamına gelir.

Tüm dillerin hem öncelik hem de çağrışım için güçlü bir şekilde tanımlanmış kuralları vardır. Burada C # kuralları hakkında daha fazla bilgi edinebilirsiniz. Operatör çağrışımı ve önceliğinin genel kavramları wikipedia'da iyi bir şekilde ele alınmıştır.


Örnekleriniz, hepsi aynı işlenenleri kullanırsa daha net olacaktır.
Michael Carman

Aynı önceliğe sahip iki operatör parantez içermeyen bir ifadede görünseler de, birinin sol çağrışım, diğerinde ise sağ operatör varsa ne olurdu? Hangi operatörün ilk bulduğu ilişkiselliği kullanır mıydı?
Hector

aynı öncelik aynı çağrışım anlamına geldiği için olamaz. eğer durum böyle olmasaydı, gerçekliğin varlığını tehdit eden belirsizlikler olabilirdi.
Ankur S

3

Operatör çağrışımını kastettiğinizi varsayıyorum ...

İşlenenlerin bir operatöre bağlanma sırasıdır. Temel olarak:

a - b + c

şu şekilde değerlendirilebilir (- ve + aynı önceliğe sahiptir):

((a - b) + c) veya,
(a - (b + c))

Operatörler ilişkisel olarak bırakılırsa (hemen sol işlenene bağlanır), ilk olarak değerlendirilir. Doğru çağrışımlılarsa, ikinci olarak değerlendirilecektir.


1

Operatör çağrışımını kastediyorsanız:

İfadelerin ayrıştırılma şeklini tanımlar. Bir standart verir, böylece her ifade aynı şekilde çözümlenir.

Yan etkilerin olabileceği aynı öncülü operasyonlar için çoğunlukla önemlidir.


0

Önceki örneklerin çoğunda sabitler kullanılmıştır. Argümanlar işlev çağrıları olursa, çağrıların yapılma sırası derleyicinize bağlı olarak ilişkilendirme kuralları tarafından belirlenebilir. Ve bu işlevlerin yan etkileri varsa ..


0

Hepimiz önceliğin önemli olduğunu biliyoruz, ancak bir ifadenin anlamını yorumlamada çağrışım da önemlidir. Gerçekten basit bir giriş için Power of Operators'ı deneyin .


0

İlişkilendirme, programlama dili kavramlarında hesaplama sırasına girer. Hesaplama sırası, ifadenin anlamını belirler. İki ana kuralı vardır,

  1. Öncelik kuralları
  2. İlişkilendirme kuralları

öncelik kuralları, farklı türlerdeki "bitişik" operatörlerin değerlendirilme sırasını tanımlar. Her programlama dilinin, operatörlerine ilişkin kendi operatör öncelik tablosu vardır.

İlişkiselliğe geri dönersek,

Aynı önceliğe sahip bitişik işlemlerin yürütme sırasını tanımlar. 3 çeşidi vardır,

sol çağrışım
sağ çağrışım
ilişkisizlik

Bir operatör sola ilişkiliyse, aynı şekilde soldan sağa doğru değerlendirir, eğer sağla ilişkiliyse, sağdan sola doğru değerlendirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.