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
Bài liên quan
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
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
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 saoThis post was flagged by the community and is temporarily hidden.
Đ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 địnhMì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
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.
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.
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.
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
thì nó ra đúng kết quả 223 luôn !
Còn nếu để
thì nó vẫn ra kết quả 313.
Vậy, suy ra nếu
++a
vàa++
nằm trên cùng 1 dòngcout
thì kết quả sẽ ra trái ý mình (sai), còn nếu++a
vàa++
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à
in ra 313
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
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ả.
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?
đú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
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.