01/10/2018, 13:50

Vấn đề toán tử với con trỏ

Chào các bạn, các anh chị , em là sinh viên năm 1 đang học ngành Mạng máy tính và Truyền thông, em vừa được biết đến con trỏ 2 ngày thì đụng phải 1 vấn đề này mà em suy nghĩ cả chiều, nhờ bạn bè xung quanh tụi nó cũng ko suy nghĩ ra _" . Mong được các bậc đàn anh cứu trợ và giải thích vấn đề nan giải này giúp em ạ.
Xin cám ơn

Trần Hoàn viết 16:02 ngày 01/10/2018

Nếu mình đoán không nhầm:

x=&y

Tương đương với việc định nghĩa “*x chính là y

Như vậy *x=*x+(y++); tương đương với y = y + (y++); Cái này thuộc Undefined Behavior, một phép tính không thể dự đoán kết quả. y += (y++); cũng tương tự.

Dark.Hades viết 15:53 ngày 01/10/2018

Cụ thể vấn đề bạn mắc phải là gì?

Vinh Hung Pham viết 16:04 ngày 01/10/2018

vấn đề em k biết tại sao 2 dòng đó lại ra 2 kết quả khác nhau , theo em biết thì nó có phép toán giống nhau ạ.

Lê Huy viết 16:06 ngày 01/10/2018

Như bác @noz1995 nói

y = y + (y++);

y = 2
y = 2 + (2++ = 3)

y += (y++);

y = 2
y = 2 + (y ++  = 2)    // y++ nên y = 3
sau đó do phép gán y = 4

Có lẽ do thứ tự ưu tiên của phép tính trong các toán tử khác nhau

Trần Hoàn viết 15:51 ngày 01/10/2018

Thực ra nếu y == 2 thì sau khi a = y++; sẽ có a == 2y == 3. Nếu là a = ++y thì mới có a == 3

Xét đến dòng này:

y = y + (y++);

Có thể compiler đã tính y++ == 2 và đưa vào bộ nhớ tạm trước khi tính y + 2 với y lúc bây giờ đã bằng 3
Nhưng nếu đưa y vào bộ nhớ tạm trước (giống như trường hợp y += y++;) thì kết quả sẽ là 4.

Nói chung là kết quả không dự đoán được.

[spoiler]Thằng nào nghĩ ra cái trò return giá trị cho ++ với cả += thế hả trời, chỉ tổ hại não[/spoiler]

Vinh Hung Pham viết 16:06 ngày 01/10/2018

##Cám ơn sự giúp đỡ của các anh,
##em đã hiểu được vấn đề 1 phần nào ^^

Bài liên quan
0