1. 程式人生 > >cout輸出中多個表示式的先後執行順序與輸出順序

cout輸出中多個表示式的先後執行順序與輸出順序

#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的專欄有做了寫補充。看過以後很有收穫……

*/

如果您對本文滿意,請回復,謝謝^ . ^ . ^ . ^

同時歡迎提出寶貴意見,以幫助我改進,不勝感激!!!

——桑海整理

如果您對本文滿意,請回復,謝謝^ . ^ . ^ . ^

同時歡迎提出寶貴意見,以幫助我改進,不勝感激!!!

——桑海整理