cout輸出中多個表示式的先後執行順序與輸出順序
阿新 • • 發佈:2019-01-27
#include<iostream> #include<vector> #include<string> using namespace std; int main() { vector<string> svec; string word; cout << "Enter strings!(Ctr+Z to the end)" << endl; while(cin >> word) svec.push_back(word); vector<string>::iterator iter1 = svec.begin(), iter2 = svec.end(); string str; str = *iter1; cout << "0: " << *iter1 << endl; cout << "1: " << *iter1++ << "\t" << "2: " << *iter1++ << "\t" << "3: " << *iter1 << "\t"; cout << "4: " << *iter1 << endl; cin.clear(); return 0; }
/*
運算結果:
Enter strings!(Ctr+Z to the end)
hello world just let them alone
^Z
0: hello
1: world 2: hello 3: hello 4: just
Process returned 0 (0x0) execution time : 5.217 s
Press any key to continue.
分析:C/C++在函式呼叫時,預設都是右序入棧。
由以上測試可知:cout輸出函式中多個表示式的執行順序是從右到左,如上題cout << "1: " << *iter1++ << "\t" << "2: " << *iter1++ << "\t" << "3: " << *iter1 << "\t";中,第一步:執行最右邊的表示式,將endl壓入棧中;
第二步:解引用iter1取*iter1的值(這時iter指向svec中的第一個元素)壓入棧中;
第三步:接著做iter1的自增操作(++自增操作符的優先順序高於解引用操作符*)使iter1後移一位,這時iter1指向svec中第二個元素,同時返回*iter1(自增符號在右邊時表示式取得是未自增前的iter指向的值,因此,這次返回的是svec中的第一個元素)並將其壓入棧中
第四步:接著做iter1的自增操作,iter1(這時候是指向svec中的第二個元素)再次後移一位,指向svec中的第三個元素,同時返回*iter1(第三步中iter1自增後的值即指向svec中第二個元素),並將其壓入棧中;
第四步:本條語句執行完畢,將棧中數全部輸出,並且同時清空輸出快取(一般遇到endl時都會執行輸出快取的清空)。
最後執行cout << "4: " << *iter1 << endl;這時iter1是第四步中的自增會的值,因此,iter1這時指向的是svec中的第三個元素。
今天又在網上搜到了一篇講解cout輸出時入棧的問題講解,很詳細,特富有連結,很值得看啊……
這兩個前半部分講解的都一樣,不過後半部分zhanghenglei的專欄有做了寫補充。看過以後很有收穫……
*/
如果您對本文滿意,請回復,謝謝^ . ^ . ^ . ^
同時歡迎提出寶貴意見,以幫助我改進,不勝感激!!!
——桑海整理
如果您對本文滿意,請回復,謝謝^ . ^ . ^ . ^
同時歡迎提出寶貴意見,以幫助我改進,不勝感激!!!
——桑海整理