Hỏi về toán tử ++a và a++ trong c/c++

em có đoạn code :
int a = 1; cout << ++a << a++ << a;
kết quả của máy ra là 313
cho em hỏi tại sao lại ra đáp án là như thế ạ ? có giải thích càng tốt

1 Like

Nó phải ra kết quả là 223 chứ nhỉ?
Hay trước đó hoặc sau đó có đoạn code khác?

em test bằng visual studio , kết quả ra là 313

1 Like

Wow, cái đoạn code này hơi bị ảo đó nha, chờ cao thủ C++ vô “giải quyết” thôi !
Không biết nó có giống C không mà kết quả lại khác :slight_smile:

Cái dòng này nếu để như thế này
cout << a << a++ << a
thì nó ra kết quả là 212 => Nó đã cộng thêm 1 trước khi cout ra rồi, chả hiểu sao :sweat_smile:

2 Likes

This post was flagged by the community and is temporarily hidden.

3 Likes

Đoạn code của bạn là bad code, nó gây undefined behavior, giá trị in ra phụ thuộc vào từng compiler. Vì biểu thức cout<<++a<<a++<<a; thay đổi giá trị của cùng một biến nhiều lần mà không can thiệp các điểm tuần tự ( sequence points), các biểu thức con bị các hiệu ứng lề tác động lẫn nhau nên không thể xác định thứ tự thực hiện cái nào trước, sau, từ trái sang hay phải sang, dẫn đến kết quả không xác định

2 Likes

Mình nghĩ là tất cả xuất phát từ chuyện thứ tự thực hiện tham số trong C++ là ko xác định. Nên đoạn

cout << ++a << a++ << a;

Thì thứ tự có thể là a++ (thêm 1 vào stream, a = 2) -> ++a (thêm 3 vào stream, a = 3) -> a

Code vô nghĩa, UB.   Kết quả có được ngẫu nhiên.

1 Like

Không đúng lắm về sequence points, vì chưa chắc compiler bạn này dùng đã có sequence points. Chỉ có thể nói đây là UB thôi.

3 Likes

Không liên quan đến thứ tự trong này nhé. Compiler không xét được tới thứ tự trong trường hợp này.

2 Likes

Không biết ý kiến của mọi người thế nào nhưng đoạn code trên nếu để như thế này

cout << ++a;
cout << a++ << a;

thì nó ra đúng kết quả 223 luôn !
Còn nếu để

cout << ++a << a++;
cout << a;

thì nó vẫn ra kết quả 313.
Vậy, suy ra nếu ++aa++ nằm trên cùng 1 dòng cout thì kết quả sẽ ra trái ý mình (sai), còn nếu ++aa++ không nằng trên cùng 1 dòng thì kết quả sẽ ra đúng !

toán tử ++ được ưu tiên hơn toán tử << nên 223 chắc chắn là sai ~.~

như mấy bài trên đã nói là undefine behavior, nên mấy kiểu viết này nên tránh. Nhưng nếu chỉ dựa vào thứ tự tính toán của các toán tử thì có thể hiểu là:
a++ được tính trước
++a tính tiếp theo
cout << ++a tiếp theo
cout << a++ tiếp theo
cout << a cuối cùng

như vậy có thể dịch là

//a++
int b = a; //b = 1
a += 1; //a = 2

//++a
a += 1; //a = 3

//cout << ++a
cout << a; //++a trả về a

//cout << a++
cout << b; //a++ trả về copy của a

//cout << a
cout << a;

in ra 313

6 Likes

This post was flagged by the community and is temporarily hidden.

không liên quan lắm nhưng trên compile gcc/g++ thì kết quả trên là 223

`$ vi test.cpp
phanbook at Thiens-MacBook-Air in ~/github/c-c-/cplus on master*
$ make test
c++     test.cpp   -o test
test.cpp:7:10: warning: multiple unsequenced modifications to 'a'
      [-Wunsequenced]
        cout << ++a << a++ << a;
                ^       ~~
1 warning generated.
phanbook at Thiens-MacBook-Air in ~/github/c-c-/cplus on master*
$ ./test 
223
2 Likes

Bạn đang giải thích để cho nó phù hợp với kết quả của bạn hỏi ở trên. Không có lý do gì a++ được tính trước ++a trong trường hợp này hết.
Và cũng chẳng có kết quả nào là đúng và sai ở đây, code này không có kết quả.

3 Likes

thì mình đã đồng ý là UB rồi. Chỉ giải thích tại sao lại có thể ra 313 thôi.

cái này hơi bất ngờ. Đúng là tùy trình dịch biên dịch ra sao.

mình có thử trên ideone trước rồi mới dám “Giải thích” cho kết quả 313. Cái này chắc là trên Mac? :smile:

đúng là ở clang++ cho ra 223: http://rextester.com/PVE13573

vc++ cho ra 213 :joy: http://rextester.com/QKZ10294

g++ cho ra 313 http://rextester.com/LVWH1934

ai “đúng” đây :joy:

This post was flagged by the community and is temporarily hidden.

This post was flagged by the community and is temporarily hidden.

Hồi trước Đạt cũng thử giải thích Undefined Behavior, nhưng thấy mỗi compiler mỗi khác nên gặp mấy câu hỏi dạng này thì chỉ comment là không thể giải thích được. Hên xui, do compiler quyết định.

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