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!
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!
Đầ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:
int i = 1;
int a = ++i; //tăng i lên 1, và gán giá trị tăng đó cho a, a = 2.
a = i++: // gán a = 2, rồi tăng i lên 1, i = 3;
Cho nên đoạn code của bạn sẽ là a[0]= 0, …
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?