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
Vấn đề toán tử với con trỏ
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ự.
Cụ thể vấn đề bạn mắc phải là gì?
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 ạ.
Như bác @noz1995 nói
y = 2
y = 2 + (2++ = 3)
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
Thực ra nếu y == 2 thì sau khi a = y++; sẽ có a == 2 và y == 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]
##Cám ơn sự giúp đỡ của các anh,
##em đã hiểu được vấn đề 1 phần nào ^^

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?