簡體   English   中英

我的代碼似乎以錯誤的順序執行

[英]My code seems to execute in a wrong order

我寫了一個打印功能如下。

#define NDEBUG
void print(vector<int> &vec)
{
#ifdef NDEBUG
    std::cout << "vector size: " << vec.size() << std::endl;
#endif
    if (!vec.empty())
    {
        auto temp = vec.back();
        vec.pop_back();
        print(vec);
        std::cout << temp<<std::endl;

    }
}

它打印:

vector sise:6
vector sise:5
vector sise:4
vector sise:3
vector sise:2
vector sise:1
vector sise:0
1
2
3
4
5
6

但我希望它是這樣的:

vector sise:6
6
vector sise:5
5
vector sise:4
4
vector sise:3
3
vector sise:2
2
vector sise:1
1
vector sise:0

是因為線程的優先級? 如果是,我如何控制正確的執行順序作為我的代碼?

解決方案

以下幾行被倒置:

    print(vec);
    std::cout << temp<<std::endl;

他們應該是:

    std::cout << temp<<std::endl;
    print(vec);

基本原理

如果在輸入向量的大小為 6 時查看代碼,您將首先輸出大小:

std::cout << "vector size: " << vec.size() << std::endl;

然后你將遞歸調用你的函數:

    print(vec);

只有在這個遞歸調用返回之后,你才打印第 6 項:

    std::cout << temp<<std::endl;

然后你從你的函數中返回。 所以很明顯第 6 項將最后打印。 同樣的推理適用於遞歸調用並解釋您的輸出。

在輸出temp之前遞歸調用print 可以這樣想(舉一個較小的例子):

print vec(2)
    cout size: 2
    print vec(1)
    cout size: 1
        print vec(0)
        cout size: 0
    cout 1
cout 2

您需要在遞歸之前輸出:

std::cout << temp << std::endl;
print(vec);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM