Hãy bắt đầu với *p += 1
tôi sẽ cố gắng trả lời này từ một chút của một góc độ khác nhau ... Bước 1 Hãy nhìn vào các nhà khai thác và các toán hạng: Trong trường hợp này nó là một toán hạng (con trỏ p) và chúng tôi có hai toán tử, trong trường hợp này là * cho dereferencing và + = 1 để tăng. Bước 2 trong đó có ưu tiên cao hơn * có độ ưu tiên cao hơn + =
*P++
một Đây là một chút phức tạp hơn ... thậm chí có thể xấu xa lần nữa chúng ta có một toán hạng (p con trỏ) và hai nhà khai thác, chỉ bây giờ * cho dereference và ++ post increment có cùng mức ưu tiên. (Trong một số bảng, ++ trong một bài đăng có quyền ưu tiên cao hơn.)
Bước 1 Hãy xem các toán tử và toán hạng: Trong trường hợp này là toán hạng và bạn có hai toán tử, trong trường hợp này là * dereferencing và ++ cho gia tăng. Bước 2 có ưu tiên cao hơn? ++ có ưu tiên cao hơn * Lưu ý: ngay cả khi chúng có ưu tiên CÙNG chúng liên kết phải sang trái, một lần nữa, ++ là trước * Bước 3 (phần phức tạp ...) Ở đâu là ++? nó là bên phải của toán hạng, có nghĩa là POST tăng Trong trường hợp này, trình biên dịch có một 'lưu ý tinh thần' để thực hiện số tăng SAU nó được thực hiện với tất cả các toán tử khác ... Điều gì sau ?Nó có nghĩa là nó sẽ chỉ áp dụng số gia tăng như bước rất rất cuối cùng trước khi tiếp theo ';' do đó, nó sẽ được thực hiện với tất cả các toán tử khác trên cùng dòng ' lưu ý: nếu nó là * ++ p thì nó sẽ thực hiện nó TRƯỚC KHI bất kỳ toán tử nào khác trên cùng một dòng như vậy trong trường hợp này, nó tương đương với lấy hai thanh ghi của bộ vi xử lý, một sẽ giữ giá trị của dấu * dereferenced và giá trị kia sẽ giữ giá trị của p ++ tăng lên, lý do trong trường hợp này có hai, là hoạt động POST ... Đây là nơi trong đó trường hợp nó là khó khăn, và nó trông giống như một mâu thuẫn. Người ta sẽ mong đợi ++ được ưu tiên hơn *, mà nó làm, chỉ có POST có nghĩa là nó sẽ được áp dụng chỉ sau tất cả các toán hạng khác, TRƯỚC KHI tiếp theo ';' token ...
Như tôi đã nói, phần phức tạp là bất kỳ số gia tăng nào ở bên phải của toán hạng sẽ được đặt sang một bên và sẽ được áp dụng như thao tác LAST trước khi chuyển sang dòng tiếp theo.
Nguồn
2017-05-02 13:13:42
Vì '* p ++' giống với '* (p ++)' –
[ưu tiên toán tử] (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence) – chris
Đồng thời thử 'void foo3 (char ** p) {(* p) ++; } ' –