Về thứ tự thực hiện của các phép toán

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 :heart_eyes:

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

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