Về mặt kỹ thuật, nhìn chung đây là Hành vi không xác định .
Nhưng, có hai khía cạnh quan trọng cho câu trả lời.
Câu lệnh mã:
std::cout << a++ << a;
được đánh giá là:
std::operator<<(std::operator<<(std::cout, a++), a);
Tiêu chuẩn không xác định thứ tự đánh giá các đối số cho một hàm.
Vì vậy:
std::operator<<(std::cout, a++)
được đánh giá đầu tiên hoặc
a
được đánh giá đầu tiên hoặc
- nó có thể là bất kỳ thứ tự được xác định triển khai nào.
Đơn đặt hàng này không được chỉ định [Tham khảo 1] theo tiêu chuẩn.
[Tham khảo 1] C ++ 03 5.2.2 Lệnh gọi hàm
Đoạn 8
Thứ tự đánh giá các lập luận là không xác định . Tất cả các hiệu ứng phụ của đánh giá biểu thức đối số có hiệu lực trước khi hàm được nhập. Thứ tự đánh giá của biểu thức hậu tố và danh sách biểu thức đối số là không xác định.
Hơn nữa, không có điểm trình tự giữa việc đánh giá các đối số cho một hàm nhưng một điểm trình tự chỉ tồn tại sau khi đánh giá tất cả các đối số [Tham khảo 2] .
[Tham khảo 2] C ++ 03 1.9 Thực thi chương trình [intro.execution]:
Đoạn 17:
Khi gọi một hàm (cho dù hàm có nội tuyến hay không), có một điểm trình tự sau khi đánh giá tất cả các đối số của hàm (nếu có) diễn ra trước khi thực hiện bất kỳ biểu thức hoặc câu lệnh nào trong thân hàm.
Lưu ý rằng, ở đây giá trị của c
được truy cập nhiều lần mà không có điểm trình tự can thiệp, về điều này, tiêu chuẩn cho biết:
[Tham khảo 3] C ++ 03 5 Biểu thức [expr]:
Đoạn 4:
....
Giữa điểm trình tự trước và điểm tiếp theo, một đối tượng vô hướng sẽ có giá trị được lưu trữ của nó được sửa đổi nhiều nhất một lần bằng cách đánh giá một biểu thức. Hơn nữa, giá trị trước sẽ chỉ được truy cập để xác định giá trị được lưu trữ . Các yêu cầu của đoạn này phải được đáp ứng đối với từng thứ tự cho phép của các biểu thức phụ của một biểu thức đầy đủ; nếu không thì hành vi là không xác định .
Mã sửa đổi c
nhiều lần mà không có điểm trình tự can thiệp và nó không được truy cập để xác định giá trị của đối tượng được lưu trữ. Điều này rõ ràng là vi phạm điều khoản trên và do đó kết quả theo quy định của tiêu chuẩn là Hành vi không xác định [Hướng dẫn 3] .