วิธีมาตรฐาน vs วิธีพิเศษ
ปกติเราเข้าถึงอาร์เรย์ด้วย arr[index] แต่ C++ อนุญาตให้เขียนเป็น index[arr] ได้เช่นกัน!
ตัวอย่าง
#include <iostream>
using namespace std;
int main() {
int arr[2] = {32, 65};
// วิธีมาตรฐาน
cout << "Standard: arr[0] = " << arr[0] << ", arr[1] = " << arr[1] << endl;
// วิธี "ไม่ธรรมดา" - แต่ทำงานได้จริง!
cout << "Unusual: 0[arr] = " << 0[arr] << ", 1[arr] = " << 1[arr] << endl;
return 0;
}
ผลลัพธ์
Standard: arr[0] = 32, arr[1] = 65 Unusual: 0[arr] = 32, 1[arr] = 65
ทำไมถึงทำงานได้?
ใน C/C++ นิพจน์ arr[index] ถูกแปลว่า *(arr + index)
arr[0]→*(arr + 0)→ ชี้ที่ตำแหน่งแรก0[arr]→*(0 + arr)→ ชี้ที่ตำแหน่งเดียวกัน! (การบวกสลับที่ได้)
ทั้งคู่ชี้ไปที่ address เดียวกัน
ข้อควรระวัง
- เป็นเพียง syntactic sugar ไม่ควรใช้ในโค้ดจริง (ลด readability)
- ทำงานได้กับ built-in array และ pointer เท่านั้น
- ไม่ทำงานกับ std::array, std::vector (เพราะ operator[] เป็น member function)
สรุป
คุณสมบัตินี้มาจากการที่ array indexing ถูกนิยามใน терมของ pointer arithmetic ไม่ใช่ฟีเจอร์ที่ออกแบบมาเพื่อใช้งานจริง แต่มักปรากฏในแบบทดสอบความรู้ C++ หรือ obfuscated code contests