01/10/2018, 00:35
Thắc mắc về thứ tự thực hiện phép toán với con trỏ
Em có đoạn code sau
for(i = 0; i<n; i++){
*a++ = i;
}
Mọi người giải thích giùm em cơ chế chạy của dòng *a++ = i;
với ạ, lệnh nào chạy trước, lệnh nào chạy sau?
Cảm ơn mọi người đã quan tâm!
Bài liên quan
Đầu tiên là ta nhìn thứ tự ưu tiên của phép toán trong C trước
http://en.cppreference.com/w/c/language/operator_precedence
Dễ thấy toán tử ++ có độ ưu tiên cao hơn toán tử * (dereference) và toán tử = (gán)
-> *a++= i tức là
a++ -> Trỏ tới ô nhớ tiếp theo
*a -> lấy giá trị ô nhớ đó ra
*a = i -> gán giá trị i làm giá trị cho ô nhớ này.
Cảm ơn bạn, bạn giải thích rất dễ hiểu, nhưng mình có thắc mắc là đây là đoạn code của 1 chương trình chuẩn. địa chỉ của a là địa chỉ của a[0], vậy khi ta tăng a lên rồi mới gán = i thì lúc đó a[1] = 0 , a[2] =1, …, a[n-1] = n-2 lại không đúng với mong muốn gán tương ứng a[i] = i.
Bạn có thể giải thích cho mình không?
Xin lỗi bạn mình bị nhầm ở bước trên
a trỏ tới ô nhớ tiếp theo là bước cuối cùng.
Tức là nó như bạn nói ấy.
a[0] = 0, a[1] = 1, …
Bạn kia giải thích đúng rồi nhưng quên ko giải thích đặc điểm của toán tử
++
. Vì nó có 2 kiểu, tiền tố:++i
vài++
. Nếu 2 cái này đứng một mình ko nằm trong biểu thức nào thì ko khác nhau lắm, nhưng khi nó nằm trong biểu thức thì sẽ như này:Cho nên đoạn code của bạn sẽ là a[0]= 0, …