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!

*grab popcorn* viết 02:37 ngày 01/10/2018

Đầ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.

Bùi Minh Tiến viết 02:42 ngày 01/10/2018

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?

*grab popcorn* viết 02:47 ngày 01/10/2018

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, …

Pham Van Hai viết 02:48 ngày 01/10/2018

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ố: ++ii++. 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, …

Bài liên quan
0