sự khác nhau giữa *y++
và ++*y
là gì?
Ý nghĩa của một biểu thức trong C được đặc trưng bởi hai điều: những gì giá trị nó tạo ra và những gì tác dụng phụ nó tạo ra.
Hãy xem xét biểu thức đầu tiên.
Tăng hậu tố có mức độ ưu tiên cao hơn so với dự phòng hội nghị, vì vậy đây là *(y++)
.
Tăng hậu tố tạo ra tác dụng phụ: thay đổi giá trị y
để trỏ đến một vị trí khác. Tăng thêm hậu tố cũng tạo ra một giá trị: giá trị mà y
có trước khi nó được tăng lên. Toán tử *
sau đó là các tham chiếu giá trị để tạo ra một lvalue: đó là, một cái gì đó bạn có thể sử dụng như một biến, hoặc để lưu trữ hoặc để tìm nạp.
Tôi lưu ý rằng tác dụng phụ có thể xảy ra tại bất kỳ thời điểm nào trước hoặc sau cuộc hội thảo. Nếu bạn đã nói
q = *y++
thì tác dụng phụ của ++
có thể xảy ra tại bất kỳ thời điểm nào. Đây có thể là:
q = *y;
y = y + 1;
hoặc nó có thể được coi là
t = y;
y = y + 1;
q = *t;
Cả hai đều là hoàn toàn hợp pháp. (Ngoại trừ khóa học rằng nếu y
chính nó là một biểu hiện với các tác dụng phụ, những tác dụng phụ đó chỉ được tạo ra một lần.)
Làm thế nào về ++*y
? Điều đó là đơn giản: *y
tạo ra một biến, nội dung của biến được tăng lên và giá trị của biểu thức là giá trị gia tăng. Lưu ý rằng một lần nữa, các tác dụng phụ có thể được sản xuất out-of-trật tự:
q = ++*y
có thể được xử lý như:
t = *y + 1;
*y = t;
q = t;
hoặc như
t = *y + 1;
q = t;
*y = t;
Hãy nhớ rằng, C không sản xuất rất nhiều hạn chế về thứ tự mà các tác dụng phụ có thể xảy ra, vì vậy hãy cẩn thận.
Nguồn
2013-08-01 16:40:43
Suy nghĩ về '++ * y' và' * ++ y'. –
Tôi thấy bạn đang xử lý các con trỏ nhưng điều này có thể hữu ích: http://stackoverflow.com/questions/1094872/is-there-a-difference-between-x-and-x-in-java – zztops
Bạn không thể chỉ * chạy * chương trình tìm đầu ra của nó? (Vâng, nếu bạn sửa chữa nó để không có hành vi không xác định đầu tiên ...) –