C işaretlerinde öncelik nasıl belirlenir?


14

Anlamakta zorlandığım iki işaretçi bildirimi ile karşılaştım. Öncelik kuralları anlayışım şu şekilde gider:

Operator             Precedence             Associativity
(), [ ]                  1                  Left to Right
*, identifier            2                  Right to Left
Data type                3

Ancak buna rağmen, aşağıdaki örneklerin doğru bir şekilde nasıl değerlendirileceğini anlayamıyorum:

İlk örnek

float * (* (*ptr)(int))(double **,char c)

Değerlendirmem:

  1. *(ptr)
  2. (int)
  3. *(*ptr)(int)
  4. *(*(*ptr)(int))

Sonra,

  1. double **
  2. char c

İkinci örnek

unsigned **( * (*ptr) [5] ) (char const *,int *)
  1. *(ptr)
  2. [5]
  3. *(*ptr)[5]
  4. *(*(*ptr)[5])
  5. **(*(*ptr)[5])

Nasıl olmalıdır Ben de okuyabilir?


1
Bir dilin özelliklerini nasıl ele aldığını sormak burada konudur.

Yanıtlar:


7

Birincisi için tahminim : ptr, bir int parametresi olarak alan bir işleve bir işaretçidir ve parametreler olarak işaretçiyi ikiye gösterecek bir işaretçi ve bir karakter döndüren ve bir göstergeyi döndüren bir işleve bir işaretçi döndürür.

Yorum :

(* Ptr) (int)

ptr ifadesinin int değerini argüman olarak alan bir fonksiyonun göstergesidir. Bu işlevin ne getirdiğini keşfetmek için görüşümüzü genişletmeliyiz:

(* (* ptr) (int))

Bu, işlevin başka bir işleve bir işaretçi döndürdüğü anlamına gelir. Bu diğer işlevin parametreleri şunlardır:

(çift **, karakter c)

ve geri dönüyor

şamandıra *

İkincisi için : ptr, karakter olarak char için sabit bir işaretçi ve int'e bir işaretçi alan ve işaretçi işaretsiz int işaretçisine geri dönen işlevlere beş işlevli bir dizi işaretçisi.

Yorum :

(* (* ptr) [5])

ptr işlevini alan beş işaretçi dizisine işaretçi olarak bildirir

(char const *, int *)

argüman olarak ve geri dönen

imzasız **


7

Bu çılgın açıklamaları anlamak için 'The Clockwise Spiral' Yöntemini deneyebilirsiniz:

http://c-faq.com/decl/spiral.anderson.html

Burada da blog yazdım:

http://www.kalekold.net/index.php?post=4


Cevabınız için teşekkür ederim. Ama benim durumumda nereden başlayacağımı The Clockwise Spiral yönteminde? Bağlantıda verilen örneklerde basit örnekler vardır. Denklemimi bu yöntemle eşleştiremiyorum.
trapaank

1
kimliğinizden başlamalısınız: ptr. şunlara sahip olacaksınız: "ptr, int alan bir işaretçiye, işaretçiyi ikiye ve karaktere götüren ve işaretçiyi kayan noktaya döndüren bir işleve bir işaretçi döndüren bir işleve bir işaretçidir". spyral deneyin ve aynı olsun.
Remo.D

1

Bu bir işlev işaretçisi. Bunu yazan kişi, daha açık hale getirmek için typedef'leri daha iyi kullanabilirdi.

Aslında bu parametrelerle çalışmak bir işaretçidir. şamandıra * myfunc (çift **, karakter)


4
Bahse girerim, onu yazan kişi öğretmendir.
mouviciel

Bunun öğretmen olmadığını umalım, çünkü böyle bir saçmalık bilmenize gerek yok. İyi bir öğretmenin önce böyle ifadelerle yüzünüze tokat atmasına rağmen, onları yorumlamaya çalışarak kafanızı çizmenize, sonra typedef'in nasıl düzgün bir şekilde kullanılacağını göstermenize izin veririm .

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.