วงเล็บเหลี่ยมหมายถึงอะไรในการเริ่มต้นอาร์เรย์ใน C?


85

ความหมายของ[0x3A]ที่นี่คืออะไร? ฉันได้เรียนรู้เฉพาะข้อความเช่นint a[2] = {1, 2};


ส่วนใหญ่เป็นส่วนขยายของคอมไพเลอร์ที่ช่วยให้คุณเริ่มต้นรายการอาร์เรย์เฉพาะ (ตามดัชนีที่กำหนด) โดยไม่ต้องกรอกข้อมูลในส่วนที่เหลือ
Alexey Frunze

คำตอบ:


81

หมายถึงการเริ่มต้นองค์ประกอบที่nของอาร์เรย์ ตัวอย่างที่คุณให้ไว้จะหมายความว่า:

สิ่งเหล่านี้เรียกว่า"initializers ที่กำหนด"และเป็นส่วนหนึ่งของมาตรฐาน C99 อย่างไรก็ตามไวยากรณ์ที่ไม่มี=is not จากหน้านั้น:

ไวยากรณ์ทางเลือกสำหรับการนี้ซึ่งได้รับการล้าสมัยตั้งแต่ GCC 2.5 แต่ยังคง GCC ยอมรับคือการเขียนก่อนที่จะคุ้มค่าองค์ประกอบที่ไม่มี[index]=


41

ตามเอกสาร GCCนี้เป็นไปตามมาตรฐาน ISO C99 พวกเขาเรียกมันว่า "เครื่องเริ่มต้นที่กำหนด":

ในการระบุดัชนีอาร์เรย์ให้เขียน `[index] = 'ก่อนค่าองค์ประกอบ ตัวอย่างเช่น,

เทียบเท่ากับ

ฉันไม่เคยเห็นไวยากรณ์นี้มาก่อน แต่ฉันเพิ่งรวบรวมด้วย gcc 4.4.5 ด้วย -Wall รวบรวมได้สำเร็จและไม่มีคำเตือนใด ๆ

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


15

ที่ถูกนำมาใช้ใน C99 และก็เรียกว่าinitialiser กำหนด

โดยทั่วไปจะช่วยให้คุณกำหนดค่าเฉพาะในอาร์เรย์โดยให้ส่วนที่เหลือเป็นค่าเริ่มต้น

ในกรณีนี้ดัชนีอาร์เรย์คือรหัสสแกนแป้นพิมพ์ 0x3aเป็นสแกนรหัสที่อยู่ในชุดที่ 1 (ดูส่วน 10.6) สำหรับCapsLockที่สำคัญ0x45คือNumLockและ 0x46 ScrollLockคือ

ในลิงค์แรกด้านบนระบุว่า:

เทียบเท่ากับ:

น่าสนใจพอสมควรแม้ว่าลิงก์จะระบุว่า=จำเป็น แต่ดูเหมือนจะไม่เป็นเช่นนั้น


13

เป็น (ใกล้เคียงกับ) ไวยากรณ์ของinitializers ที่กำหนดซึ่งเป็นคุณลักษณะ C99

โดยพื้นฐานแล้วจะเริ่มต้นส่วนต่างๆของอาร์เรย์เช่น;

รวมค่าที่สองของอาร์เรย์เป็น 6 และค่าที่สามถึง 3

ในกรณีของคุณอาร์เรย์ออฟเซ็ตเกิดขึ้นเป็นเลขฐานสิบหก (0x3a) ซึ่งเริ่มต้นองค์ประกอบที่ 58 ของอาร์เรย์เป็นค่าของ CAPSLOCK ซึ่งน่าจะกำหนดไว้ในโค้ดเหนือรหัสที่คุณกำลังแสดง

เวอร์ชันในโค้ดของคุณที่ไม่มี=ดูเหมือนว่าจะเป็นส่วนขยายเฉพาะของ gcc

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