Chào mọi người,
Cho mình hỏi, nếu viết là
i=i++
thì tại sao nó lại chỉ gán giá trị i trước khi nó cộng 1 vào ? Vì theo mình biết là phép ++ được thực hiện đầu tiên và từ phải sang trái, vì vậy nên nó phải cộng 1 rồi mới gán chứ ?
Have a nice day 
Chào mọi người,
Cho mình hỏi, nếu viết là
i=i++
thì tại sao nó lại chỉ gán giá trị i trước khi nó cộng 1 vào ? Vì theo mình biết là phép ++ được thực hiện đầu tiên và từ phải sang trái, vì vậy nên nó phải cộng 1 rồi mới gán chứ ?
Have a nice day 
i=++i;
Viết như trên thì mới cộng i thêm 1 rồi gán.
i++ sẽ trả về giá trị hiện tại của i rồi mới tăng i lên, ví dụ
int i = 1;
cout << i++; // 1
cout << i; // 2
Nên nếu viết i=i++ thật ra là gán i = i.
i=i++ là undefined behavior :V
trong 1 câu lệnh nếu 1 biến bị gán 2 lần thì kết quả câu lệnh đó ko xác định cụ thể được, trình biên dịch này ra kq X, trình dịch kia ra kq Y.
void xxx(int& i) {
i = i++;
}
clang biên dịch ra:
[x86-64 clang 9.0.0 #1] warning: multiple unsequenced modifications to ‘i’ [-Wunsequenced]
xxx(int&): # @xxx(int&)
ret
g++
[x86-64 gcc 9.2 #1] warning: operation on ‘i’ may be undefined [-Wsequence-point]
xxx(int&):
ret
clang và gcc đều hiểu i=i++ là ko làm gì cả
msvc: (ko có warning???)
i$ = 8
void xxx(int &) PROC ; xxx, COMDAT
inc DWORD PTR [rcx]
ret 0
void xxx(int &) ENDP
msvc biên dịch ra khác: i=i++ hiểu là ++i
edit: msvc compile với /std:c++14 thì có inc, xài /std:c++17 hoặc /std:c++latest thì lại ko có inc :V :V
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?