Có sự khác biệt về ngữ nghĩa giữa tiền tố (++i) và hậu tố (i++), nhưng hiệu suất thực tế gần như bằng nhau trên compiler hiện đại với tối ưu hóa bật (-O2, -O3).
Khác biệt ngữ nghĩa
- ++i (prefix): Tăng
itrước, trả về giá trị mới củai. - i++ (postfix): Trả về giá trị cũ của
i, sau đó tăngi.
Ví dụ minh họa
#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 << endl; // 5, 3, 5
return 0;
}
Hiệu suất
- Kiểubuiltin (int, pointer): Không có chênh lệch. Compiler tối ưu hóa hoàn toàn.
- Class có overload operator++:
++itrả về reference,i++phải tạo bản sao tạm thời (copy) → prefix nhanh hơn. Quy tắc: Ưu tiên++icho iterator, object phức tạp.
Kết luận
Với int, con trỏ: không khác biệt. Với iterator, class: dùng ++i (prefix) để tránh tạo bản sao không cần thiết. Thói quen tốt: luôn dùng ++i trừ khi cần giá trị cũ.