มีความแตกต่างที่สำคัญระหว่างรูปแบบ postfix (i++) และ prefix (++i) ของออเปอเรเตอร์ ++
- Prefix (++i): เพิ่มค่า
iก่อน แล้วคืนค่าใหม่ของiเป็นผลลัพธ์ของ expression - Postfix (i++): คืนค่าเดิมของ
iก่อน แล้วค่อยเพิ่มค่าi
โค้ดตัวอย่าง
#include <iostream>
using namespace std;
int main() {
int x = 3, y, z;
y = x++; // y = 3, x = 4
z = ++x; // x = 5, z = 5
cout << x << ", " << y << ", " << z;
return 0;
}
ผลลัพธ์
5, 3, 5
คำอธิบายละเอียด
- เริ่มต้น
x = 3 y = x++: คืนค่าเก่า (3) ให้ y, แล้ว x = 4z = ++x: x = 5, คืนค่าใหม่ (5) ให้ z- พิมพ์: x=5, y=3, z=5
ด้านประสิทธิภาพ (Performance)
- Built-in types (int, pointer): ไม่มีความแตกต่าง คอมไพเลอร์ optimize ให้เหมือนกัน (ถ้าไม่ใช้ค่าผลลัพธ์)
- User-defined types (class/iterator):
++i(prefix) เร็วกว่า เพราะไม่ต้องสร้าง temporary object สำหรับเก็บค่าเก่าi++(postfix) ต้อง copy object เดิมไว้ก่อน แล้วค่อย increment object จริง - Best practice: ใช้
++i(prefix) เป็นค่าเริ่มต้น สำหรับ iterator และ loop counter (for (auto it = v.begin(); it != v.end(); ++it)) ใช้i++เฉพาะเมื่อต้องการค่าเก่าจริงๆ
สรุป: สำหรับ int/pointer ไม่ต่างกัน สำหรับ class/iterator ให้ใช้ ++i (prefix) เพื่อประสิทธิภาพและเป็น best practice