01/10/2018, 09:22

Hỏi về phép toán với con trỏ trên mảng trong C++

Các anh chị đi qua cho em hỏi với ạ .Theo em tìm hiểu thì toán tử ++ được ưu tiên trước *,nhưng thầy dạy em thì lại nói là * ưu tiên trước .=> vậy khi thao thao tác với con trỏ trên mảng thì phép toán *p++ theo ý hiểu nào là đúng ạ ?
Cụ thể như là :
TH 1 : ưu tiên * trước
int a [3] = {1,4,3};
int *p = a ;(<=> p = &a[0] =1)
=>*p++ = a[0]++;
=>*p++ sẽ nhận giá trị 2
TH2 : ưu tiên ++ trước
int a[3] = {1,4,3};
int *p = a;
=>*p++ = a[1];
=>*p++ sẽ nhận giá trị 4
Vậy theo ý hiểu nào là đúng ạ,em mới học xong con trỏ nên chưa rõ ràng lắm.mong anh chị chỉ giáo

Tao Không Ngu. viết 11:33 ngày 01/10/2018

HI Tung Nguyen.
Code thư xem. @_@!

viết 11:28 ngày 01/10/2018

http://en.cppreference.com/w/cpp/language/operator_precedence

a++ ưu tiên hàng 2, *a ưu tiên hàng 3.

cả 2 trường hợp em phân tích đều sai…

*p++ hiểu là:

//p++ ưu tiên trước
old = p;
p = p + 1;
return old;
//sau đó tới *, mà lúc này là deref giá trị cũ của p
return *old;

nên *p++ sẽ có giá trị y như *p là 1. 2 với 4 gì ở đây ~.~

cho 1 chuỗi C-string const char* src = "hello"; và 1 chuỗi rỗng char dst[10];, muốn copy src vào dst thì ta có thể viết 1 dòng: while (*dst++ = *src++); Em hiểu được dòng copy này là hiểu được *p++.

ngược lại: ++*p mới trả về giá trị 2. ++p*p theo cái bảng trên đều là ưu tiên hàng 3, nhưng thứ tự phép toán được tính từ phải sang trái, nên *p được đánh giá trước, rồi mới tới ++. Như vậy ++*p hiểu là:

//*p được đánh giá trước
return *p;
//rồi tới ++ của *p
*p = *p + 1;
return *p;
Tung Nguyen viết 11:24 ngày 01/10/2018

cám ơn anh,em đã hiểu vấn đề rồi .

rogp10 viết 11:27 ngày 01/10/2018

Cái này có cách nhớ đó bạn (xem hàm strcpy) nhưng người ta sẽ để dấu ngoặc khi viết những câu ntn.

Bài liên quan
0