30/09/2018, 21:51

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

Người bí ẩn viết 00:05 ngày 01/10/2018

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

Trung Vu viết 23:51 ngày 30/09/2018

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

Người bí ẩn viết 00:02 ngày 01/10/2018

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

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

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

Tao Không Ngu. viết 23:54 ngày 30/09/2018

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

viết 00:02 ngày 01/10/2018

Đ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

mt viết 23:58 ngày 30/09/2018

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

Bé tập Code viết 00:05 ngày 01/10/2018

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

Bé tập Code viết 23:54 ngày 30/09/2018

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.

Bé tập Code viết 23:52 ngày 30/09/2018

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.

Người bí ẩn viết 23:52 ngày 30/09/2018

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 !

viết 23:59 ngày 30/09/2018

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

Tao Không Ngu. viết 00:00 ngày 01/10/2018

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

Duy Thien viết 23:59 ngày 30/09/2018

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
Bé tập Code viết 23:53 ngày 30/09/2018

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ả.

viết 23:54 ngày 30/09/2018

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

viết 00:01 ngày 01/10/2018

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?

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

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

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

ai “đúng” đây

Tao Không Ngu. viết 00:04 ngày 01/10/2018

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

Tao Không Ngu. viết 00:05 ngày 01/10/2018

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

Mai Anh Dũng viết 00:07 ngày 01/10/2018

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.

Bài liên quan
0