2010-01-24 15 views
23

đoạn mã sau:cout << thứ tự của cuộc gọi đến chức năng nó in?

myQueue.enqueue('a'); 
myQueue.enqueue('b'); 
cout << myQueue.dequeue() << myQueue.dequeue(); 

in "ba" ra cửa sổ Console

khi:

myQueue.enqueue('a'); 
myQueue.enqueue('b'); 
cout << myQueue.dequeue(); 
cout << myQueue.dequeue(); 

in "ab" tại sao điều này?

Dường như cout đang gọi hàm ngoài cùng (gần nhất với;) đầu tiên và làm việc theo cách của nó, đó có phải là cách nó hoạt động không?

+0

tất cả các câu trả lời đều đi đâu? bây giờ chỉ có một? – finiteloop

+1

Người trả lời đã xóa họ vì họ nhận ra họ sai. –

+1

Một số người xóa câu trả lời khi họ phát hiện ra họ sai. –

Trả lời

28

Không có điểm chuỗi với toán tử << để trình biên dịch được tự do đánh giá hàm dequeue trước tiên. Điều được bảo đảm là kết quả của cuộc gọi thứ hai dequeue (theo thứ tự xuất hiện trong biểu thức và không nhất thiết phải thứ tự mà nó được đánh giá) là << 'được chỉnh sửa theo kết quả của <<' lần đầu tiên (nếu bạn nhận được những gì tôi đang nói).

Vì vậy, trình biên dịch miễn phí dịch mã của bạn thành một số thứ giống như bất kỳ thứ nào trong số này (giả trung gian C++). Đây không phải là một danh sách đầy đủ.

auto tmp2 = myQueue.dequeue(); 
auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

hoặc

auto tmp1 = myQueue.dequeue(); 
auto tmp2 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

hoặc

auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
auto tmp2 = myQueue.dequeue(); 
tmp3 << tmp2; 

Dưới đây là những gì là tạm thời tương ứng với trong biểu thức ban đầu.

cout << myQueue.dequeue() << myQueue.dequeue(); 
|  |    | |    | 
|  |____ tmp1 _____| |_____ tmp2 ____| 
|      | 
|________ tmp3 _________| 
+0

vì vậy, trong ví dụ trên, sẽ std :: ostream & tmp3 = cout << tmp1; tmp3 << tmp2; giống như nói "cout << tmp1 << tmp2;"? Hoặc một cái gì đó tôi đang mất tích? – finiteloop

+0

@segfault: Vâng, bởi vì đó là cách mà << << 'liên kết trong ngữ pháp C++. 'a << b << c' luôn luôn nhóm như' (a << b) << c'. –

+0

nhưng do logic đó, sẽ không nói cout << a << b được nói (cout << a) << b và làm bất cứ điều gì cần thiết để cout đầu tiên (tức là gọi myQueue.dequeue())? – finiteloop

6

Cuộc gọi từ ví dụ của bạn:

cout << myQueue.dequeue() << myQueue.dequeue(); 

dịch để biểu thức sau đây với hai cuộc gọi của operator<< chức năng:

operator<<(operator<<(cout, myQueue.dequeue()), myQueue.dequeue()); 
-------------------- 1 
---------2 

Trình tự đánh giá của cout, myQueue.dequeue() là không xác định. Tuy nhiên, thứ tự của các cuộc gọi hàm operator<< được chỉ định rõ ràng, như được đánh dấu bằng 12