การกำหนดความสำคัญมาก่อนในตัวชี้ C คืออะไร


14

ฉันเจอข้อความประกาศสองฉบับที่ฉันมีปัญหาในการทำความเข้าใจ ความเข้าใจของฉันเกี่ยวกับกฎสำคัญกว่ามีดังนี้:

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

แต่แม้จะได้รับสิ่งนี้ฉันไม่สามารถหาวิธีประเมินตัวอย่างต่อไปนี้ได้อย่างถูกต้อง:

ตัวอย่างแรก

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

การประเมินของฉัน:

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

จากนั้น

  1. double **
  2. char c

ตัวอย่างที่สอง

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

ฉันควรอ่านพวกเขาอย่างไร


1
การถามเกี่ยวกับวิธีการจัดการภาษาของคุณสมบัตินั้นอยู่ที่หัวข้อนี้

คำตอบ:


7

ฉันเดาสำหรับอันแรก : ptr เป็นตัวชี้ไปยังฟังก์ชั่นที่ใช้เป็นพารามิเตอร์ int และส่งกลับตัวชี้ไปยังฟังก์ชั่นที่ใช้เป็นพารามิเตอร์ตัวชี้ไปยังตัวชี้ไปที่สองและตัวอักษรและส่งกลับตัวชี้ไปลอย

การตีความ :

(* PTR) (int)

บอกว่า ptr เป็นตัวชี้ไปยังฟังก์ชันที่รับค่า int เป็นอาร์กิวเมนต์ ในการค้นพบสิ่งที่ฟังก์ชั่นส่งคืนเราจำเป็นต้องขยายมุมมองของเรา:

(* (* ptr) (int))

นี่หมายความว่าฟังก์ชันจะคืนค่าตัวชี้ไปยังฟังก์ชันอื่น พารามิเตอร์ของฟังก์ชันอื่นนั้นคือ:

(สองเท่า **, ถ่าน c)

และมันจะกลับมา

ลอย *

และสำหรับอันที่สอง : ptr คือตัวชี้ไปยังอาร์เรย์ของห้าพอยน์เตอร์ไปยังฟังก์ชั่นที่ใช้เป็นพารามิเตอร์ตัวชี้ค่าคงที่เพื่อถ่านและตัวชี้ไปยัง int ส่งคืนตัวชี้ไปยังตัวชี้ของ int ที่ไม่ได้ลงนาม

การตีความ :

(* (* ptr) [5])

ประกาศ ptr เป็นตัวชี้ไปยังอาร์เรย์ของห้าพอยน์เตอร์เพื่อรับฟังก์ชั่น

(ถ่าน const *, int *)

เป็นข้อโต้แย้งและกลับมา

ไม่ได้ลงชื่อ **


7

คุณสามารถลองวิธี 'วนตามเข็มนาฬิกา' เพื่อทำความเข้าใจกับการประกาศที่บ้าเหล่านี้:

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

ฉัน blogged เกี่ยวกับที่นี่ด้วย:

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


ขอบคุณที่ตอบ. แต่ในวิธีการวนตามเข็มนาฬิกาจากจุดเริ่มต้นในกรณีของฉัน? ในตัวอย่างที่ให้ไว้ในลิงค์มีตัวอย่างง่ายๆ ฉันไม่สามารถจับคู่สมการของฉันกับวิธีการนั้นได้
trapaank

1
คุณควรเริ่มจากตัวระบุของคุณ: ptr คุณจะได้: "ptr คือตัวชี้ไปยังฟังก์ชันที่รับค่า int และส่งกลับค่าตัวชี้ไปยังฟังก์ชันที่ใช้ตัวชี้ไปยังตัวชี้ไปยังตัวชี้ที่เป็นคู่และตัวอักขระและส่งคืนตัวชี้ไปยังแบบลอย" ลองใช้สายลับแล้วคุณจะได้เหมือนเดิม
Remo.D

1

มันเป็นตัวชี้ฟังก์ชั่น คนที่เขียนมันสามารถใช้ typedefs เพื่อทำให้ชัดเจนขึ้น

มันมีผลบังคับใช้กับตัวชี้การทำงานกับพารามิเตอร์เหล่านี้ float * myfunc (double **, char)


4
เดิมพันของฉันคือคนที่เขียนมันเป็นครู
mouviciel

ให้ความหวังไม่ใช่ครูเพราะคุณไม่จำเป็นต้องรู้เรื่องแบบนี้ แม้ว่าฉันคิดว่าครูที่ดีจะตบหน้าคุณด้วยการแสดงออกเช่นนี้ให้คุณเกาหัวพยายามตีความพวกเขาจากนั้นแสดงวิธีใช้ typedef ให้ถูกต้อง

1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.