Trong các toán tử tăng/giảm giá trị tiền tố ngôn ngữ C++ trả về lvalues , trong khi các mã postfix trả về giá trị. Trong khi đó, tất cả các toán tử sửa đổi yêu cầu các đối số lvalue. Điều này có nghĩa là kết quả của tăng/giảm tiền tố có thể được chuyển cho bất kỳ toán tử bổ sung nào khác yêu cầu đối số lvalue (bao gồm tăng/giảm bổ sung).
Cũng vì lý do rất giống trong C++ bạn có thể viết mã như thế này
int i = 0;
int *p = &++i;
mà sẽ tăng i
và làm p
điểm đến i
. Unary &
yêu cầu toán hạng lvalue, đó là lý do tại sao nó sẽ làm việc với kết quả của tiền tố ++
(nhưng không phải với một hậu tố).
Biểu thức có nhiều giá trị tăng/tăng tiền tố tích hợp được áp dụng cho cùng một đối tượng sản xuất hành vi không xác định, nhưng chúng vẫn được thiết lập tốt (ví dụ: "compilable").
Các biểu thức như ++foo--
không hợp lệ vì trong các toán tử postfix của C++ có mức ưu tiên cao hơn các toán tử tiền tố. Niềng răng có thể thay đổi điều đó. Ví dụ: (++foo)--
là một biểu thức đúng ngữ pháp, mặc dù lại dẫn đến hành vi không xác định lại.
Liên quan: http://stackoverflow.com/a/3601661/706836 – Pyrodante