Một điều khó chịu về các toán tử chuyển hướng <<
là chúng trực giác truyền tải một indea "tính toán tuần tự" thực sự không có mặt.
Khi bạn viết
std::cout << f() << g() << std::endl;
các đầu ra sẽ hiển thị đầu tiên là kết quả của f()
và sau đó kết quả của g()
, nhưng các cuộc gọi thực tế để g()
có thể xảy ra trước khi cuộc gọi đến f()
.
Nó thậm chí còn tồi tệ hơn điều này ... nó không phải là trình tự không thể dự đoán được, nhưng đó thực sự là khái niệm về chuỗi rất không hợp lệ. Trong
std::cout << f(g()) << h(i()) << std::endl;
đó là ví dụ pháp lý rằng chức năng đầu tiên được gọi là g()
, tiếp theo là i()
, tiếp theo là h()
và cuối cùng bởi f()
. Nó thậm chí không được bảo đảm rằng thứ tự sẽ giống nhau cho tất cả các yêu cầu (không phải vì các nhà sản xuất trình biên dịch thích thú với bạn, nhưng vì mã có thể được gạch chân và trình biên dịch có thể quyết định thứ tự khác nếu hàm chứa được in trong một ngữ cảnh khác).
C++ nhà khai thác duy nhất mà đảm bảo một chuỗi theo thứ tự đánh giá bao gồm:
&&
: đầu tiên đánh giá ở phía bên trái và chỉ khi kết quả là "true" đánh giá phía bên phải
||
: đánh giá lại đầu tiên bên trái và chỉ khi kết quả là "sai" đánh giá bên phải
?:
: đánh giá điều kiện đầu tiên và sau đó chỉ toán hạng hai hoặc toán hạng ba
,
: toán tử dấu phẩy ... đánh giá bên trái, giảm giá trị và sau đó đánh giá và trả về phía bên phải. LƯU Ý: dấu phẩy giữa các tham số hàm KHÔNG phải là toán tử dấu phẩy và không có lệnh đánh giá nào được áp đặt.
Ngoài ra guaratee này chỉ hợp lệ cho các toán tử được xác định trước. Nếu bạn quá tải &&
, ||
hoặc ,
trong lớp học của bạn, họ chỉ là các nhà khai thác bình thường mà không có bất kỳ hạn chế đặc biệt nào đối với đơn hàng đánh giá.
Bất kỳ nhà khai thác mạng nào khác cũng không áp đặt bất kỳ hạn chế nào đối với đơn hàng đánh giá và điều này bao gồm <<
ngay cả khi bạn sử dụng các thủ thuật như vậy.
Có lẽ câu hỏi này sẽ giúp làm rõ nó cho bạn: Sự khác nhau giữa biến con trỏ và biến tham chiếu trong C++ là gì? (http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c) – yasouser
Điều này tương tự (với http://stackoverflow.com/câu hỏi/18426473/pre-increment-not-working-as-i-expect/18426505 # 18426505). Bạn đang thiếu điểm chuỗi. –