Tôi gặp khó khăn trong việc hiểu chuỗi các cuộc gọi trong mã bên dưới. Tôi đã chờ đợi để xem kết quả dưới đâythứ tự thực hiện trong toán tử <<
A1B2
Trong khi tôi có thể thấy rằng đầu ra tôi nhận được là
BA12
Tôi nghĩ rằng cuộc gọi std::cout<< b->fooA() << b->fooB() << std::endl
tương đương với gọi
std::cout.operator<<(b->fooA()).operator<< (b->fooB())
nhưng tôi có thể thấy rằng đây không phải là trường hợp. Bạn có thể giúp tôi hiểu rõ hơn về cách thức hoạt động của nó và mối quan hệ với toàn cầu operator<<
? Đây có phải là lần cuối cùng được gọi trong chuỗi này không?
Trân
AFAG
#include <iostream>
struct cbase{
int fooA(){
std::cout<<"A";
return 1;
}
int fooB(){
std::cout <<"B";
return 2;
}
};
void printcbase(cbase* b){
std::cout << b->fooA() << b->fooB() << std::endl;
}
int main(){
cbase b;
printcbase(&b);
}
Bạn đúng khi nghĩ rằng nó tương đương với điều đó. Tuy nhiên, bạn đang đưa ra giả thiết sai lầm rằng có một thứ tự đánh giá được xác định rõ ràng. Không có.Đó là tất cả. –
Thứ tự đánh giá subexpression không được đảm bảo ở đây (và nó * có * là một bản sao, nhưng tôi không thể tìm thấy một câu hỏi kinh điển tốt ngay bây giờ) –
'AB12' hoặc' BA12' là kết quả đầu ra có thể. 'A1B2' không phải là (hy vọng). – jrok