Các biểu thức x++
và ++x
có cả một kết quả (giá trị) và ảnh hưởng bên.
Kết quả của biểu thức x++
là giá trị hiện tại của x
. Hiệu quả bên là nội dung của x
được tăng lên bởi 1.
các kết quả của biểu thức ++x
là giá trị hiện tại của x
cộng 1. Ảnh hưởng bên là tương tự như trên.
Lưu ý rằng tác dụng phụ không cần phải được áp dụng ngay sau khi biểu thức được đánh giá; nó chỉ phải được áp dụng trước điểm chuỗi tiếp theo. Ví dụ, với mã
x = 1;
y = 2;
z = ++x + y++;
không có đảm bảo rằng nội dung của x
sẽ được sửa đổi trước khi biểu y++
được đánh giá, hoặc thậm chí trước khi kết quả của ++x + y++
được gán cho z
(không phải các =
cũng không +
khai thác giới thiệu một điểm chuỗi). Biểu thức ++x
đánh giá là 2, nhưng có thể biến số x
có thể không chứa giá trị 2 cho đến khi sau z
đã được chỉ định.
Điều quan trọng cần nhớ là hành vi của các biểu thức như x++ + x++
là rõ ràng không được xác định theo tiêu chuẩn ngôn ngữ; không có cách nào tốt để dự đoán kết quả của biểu thức sẽ là gì, hoặc giá trị x
sẽ chứa sau khi nó được đánh giá.
khai thác Postfix có một ưu tiên cao hơn các nhà khai thác unary, vì vậy biểu thức như *p++
được phân tích cú pháp như *(p++)
(nghĩa là bạn đang áp dụng các nhà điều hành *
đến kết quả của biểu thức p++
). Một lần nữa, kết quả của biểu thức p++
là giá trị hiện tại của p
, vì vậy while (*p++=*q++);
không bỏ qua phần tử đầu tiên.
Lưu ý rằng toán hạng đối với toán tử tăng/giảm tự động phải là lvalue (về cơ bản, biểu thức đề cập đến vị trí bộ nhớ sao cho bộ nhớ có thể đọc hoặc sửa đổi). Kết quả của biểu thức x++
hoặc ++x
là không phải là một giá trị, do đó bạn không thể viết những thứ như ++x++
hoặc (x++)++
hoặc ++(++x)
.Bạn có thể viết một cái gì đó như ++(*p++)
(p++
không phải là một lvalue, nhưng *p++
là), mặc dù điều đó có thể khiến bạn bị tát bởi bất kỳ ai đọc mã của bạn.
Nguồn
2011-08-30 21:45:24
Định nghĩa của bạn về bài đăng/trước dường như ngược lại. Post = after, Pre = trước. Post-increment ở đây cho thấy ký tự đầu tiên sẽ được sao chép, sau đó con trỏ sẽ được tăng lên. – Marlon
Tại sao thẻ C++ (và tiêu đề)? Đây là một hàm thư viện C. –
Hình như mã C++ hoàn toàn hợp lệ đối với tôi, @Paul. Vậy tại sao * không * thẻ C++? –