ฉันคิดว่าคำตอบอื่นกำลังพลาดอยู่
ใช่p[i]
คือโดยการนิยามที่เทียบเท่า*(p+i)
ซึ่ง (เนื่องจากการบวกคือการสลับ) ที่เทียบเท่ากับ*(i+p)
ซึ่ง (อีกครั้งโดยคำจำกัดความของ[]
ผู้ประกอบการ) เทียบเท่ากับi[p]
เทียบเท่ากับ
(และใน array[i]
ชื่ออาร์เรย์จะถูกแปลงเป็นตัวชี้ไปยังองค์ประกอบแรกของอาร์เรย์โดยปริยาย)
แต่การสลับสับเปลี่ยนของการเติมนั้นไม่ใช่ทั้งหมดที่ชัดเจนในกรณีนี้
เมื่อตัวถูกดำเนินการทั้งสองเป็นประเภทเดียวกันหรือแม้กระทั่งประเภทตัวเลขที่แตกต่างกันซึ่งได้รับการส่งเสริมให้เป็นประเภททั่วไป commutativity จึงเหมาะสมอย่างสมบูรณ์: x + y == y + x
ทำให้รู้สึกดี:
แต่ในกรณีนี้เรากำลังพูดถึงเลขคณิตตัวชี้โดยที่หนึ่งตัวถูกดำเนินการเป็นตัวชี้และอื่น ๆ ที่เป็นจำนวนเต็ม (จำนวนเต็ม + จำนวนเต็มเป็นการดำเนินการที่แตกต่างกันและตัวชี้ + ตัวชี้ไร้สาระ)
คำอธิบายของมาตรฐาน C ของ+
ผู้ปฏิบัติงาน ( N1570 6.5.6) พูดว่า:
สำหรับทั้งสองตัวถูกดำเนินการจะต้องมีประเภทคณิตศาสตร์หรือหนึ่งตัวถูกดำเนินการจะเป็นตัวชี้ไปยังประเภทวัตถุที่สมบูรณ์และอื่น ๆ จะต้องมีประเภทจำนวนเต็ม
สามารถพูดได้อย่างง่ายดายเพียง:
นอกจากนี้ตัวถูกดำเนินการทั้งสองจะต้องมีประเภทคณิตศาสตร์หรือ
ตัวถูกดำเนินการด้านซ้ายจะต้องเป็นตัวชี้ไปยังชนิดของวัตถุที่สมบูรณ์และตัวถูกดำเนินการด้านขวา
จะมีประเภทจำนวนเต็ม
ในกรณีนี้ทั้งสองi + p
และi[p]
จะผิดกฎหมาย
ในแง่ C ++ เรามี+
ตัวดำเนินการโอเวอร์โหลดสองชุดซึ่งสามารถอธิบายได้อย่างหลวม ๆ ดังนี้:
pointer operator+(pointer p, integer i);
และ
pointer operator+(integer i, pointer p);
สิ่งแรกเท่านั้นที่จำเป็นจริงๆ
เหตุใดจึงเป็นเช่นนี้
C ++ สืบทอดคำจำกัดความนี้จาก C ซึ่งได้มาจาก B (ความสับเปลี่ยนของการจัดทำดัชนีอาร์เรย์ถูกกล่าวถึงอย่างชัดเจนในการอ้างอิงผู้ใช้ 1972 ) ถึง B ) ซึ่งได้รับจากBCPL (คู่มือลงวันที่ 1967) ซึ่งอาจได้มาจาก ภาษาก่อนหน้า (CPL? Algol?)
ดังนั้นความคิดที่ว่าการจัดทำดัชนีอาเรย์ถูกกำหนดในแง่ของการเพิ่มและการเพิ่มนั้นแม้แต่ของตัวชี้และเลขจำนวนเต็มเป็นคอมมิวเตชันกลับไปหลายทศวรรษเพื่อภาษาบรรพบุรุษของ C
ภาษาเหล่านั้นถูกพิมพ์ลงอย่างมากน้อยกว่า C ที่ทันสมัยมาก โดยเฉพาะอย่างยิ่งความแตกต่างระหว่างตัวชี้และจำนวนเต็มมักจะถูกละเว้น (บางครั้งโปรแกรมเมอร์ซีก่อนหน้านี้ใช้พอยน์เตอร์เป็นจำนวนเต็มที่ไม่ได้ลงชื่อก่อนหน้าunsigned
เพิ่มคำหลักลงในภาษา) ดังนั้นแนวคิดในการเพิ่มการไม่สลับสับเปลี่ยนเนื่องจากตัวถูกดำเนินการในประเภทต่าง ๆ อาจไม่เกิดขึ้นกับผู้ออกแบบภาษาเหล่านั้น หากผู้ใช้ต้องการเพิ่ม "สิ่ง" สองอย่างไม่ว่าจะเป็น "สิ่ง" เหล่านั้นเป็นจำนวนเต็มพอยน์เตอร์หรืออย่างอื่นก็ไม่ได้ขึ้นอยู่กับภาษาเพื่อป้องกัน
และในช่วงหลายปีที่ผ่านมาการเปลี่ยนแปลงกฎนั้นจะทำให้รหัสที่มีอยู่เสียหาย (แม้ว่ามาตรฐาน ANSI C ปี 1989 อาจเป็นโอกาสที่ดี)
การเปลี่ยน C และ / หรือ C ++ เพื่อต้องการให้วางตัวชี้ทางด้านซ้ายและจำนวนเต็มทางด้านขวาอาจทำให้โค้ดที่มีอยู่บางตัวพัง แต่จะไม่มีการสูญเสียพลังการแสดงออกที่แท้จริง
ดังนั้นตอนนี้เรามีarr[3]
และ3[arr]
ความหมายว่าสิ่งเดียวกัน แต่รูปแบบหลังไม่ควรปรากฏนอกIOCCC