2012-07-26 35 views

Trả lời

8

Điều này là do thực tế là trong C++ (nhưng không phải C), kết quả của ++x là một lValue, có nghĩa là nó có thể chuyển nhượng và do đó có thể thực hiện được chuỗi.

Tuy nhiên, kết quả của x++ không phải là một giá trị, thay vì đó là giá trị, nghĩa là không thể gán cho và do đó không thể bị xích.

+1

Liên quan: http://stackoverflow.com/a/3601661/706836 – Pyrodante

6

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.

+0

Bạn có thể hiển thị một số tài liệu cho biết kết quả không xác định không? Dường như với tôi như nó nên được hoàn toàn xác định rõ (đánh giá từ phải sang trái). –

+0

@ RichardJ.RossIII UB vì * (C++ 11, 1.9p15) "Nếu tác dụng phụ trên đối tượng vô hướng không liên quan đến hiệu ứng anotherside trên cùng đối tượng vô hướng hoặc tính toán giá trị sử dụng giá trị của cùng một đối tượng vô hướng "* – ouah

+0

@Richard J. Ross III: Đoạn nổi tiếng 5/4 trong đặc tả ngôn ngữ C++ (C++ 98, C++ 03). Nó là bất hợp pháp (theo nghĩa UB) để sửa đổi cùng một đối tượng hai lần mà không can thiệp * điểm chuỗi * (SP). C++ không xác định thứ tự đánh giá cho các toán tử tích hợp mà không có SP. Không có thứ như "đánh giá từ trái sang phải" trong C++ mà không có SP. Bất kỳ lệnh nào yêu cầu SP can thiệp. Không có điểm chuỗi trong '++ - foo', do đó hành vi không xác định. C++ 11 sử dụng một cách tiếp cận chính thức khác để sắp xếp thứ tự, nhưng nguyên tắc cơ bản vẫn giữ nguyên. – AnT

Các vấn đề liên quan